像'wcstok'这样的警告:这个函数或变量可能不安全。请考虑使用wcstok_s

时间:2011-05-15 09:34:34

标签: c++ warnings tr24731

我只是在我的代码中使用这些宽字符文字来了解它们

     wchar_t* wpsub = wcstok(names, names_delim);
     wpsub = wcstok(NULL, names_delim);
     wchar_t* wcopied=new wchar_t[wcslen(wname) + 1];
     strcpy(nameptr, "singh");
     wcscpy(wcopied, wname);
     wcscat(wcopied, L" Singh");

为什么我会收到这些警告,无论如何我都忽略了它。 我们是否需要忽略任何此类警告。

    : warning C4996: 'wcstok': This function or variable may be unsafe. Consider using wcstok_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    : see declaration of 'wcstok'
    : warning C4996: 'wcstok': This function or variable may be unsafe. Consider using wcstok_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    : see declaration of 'wcstok'
    : warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    : see declaration of 'strcpy'
    : warning C4996: 'wcscpy': This function or variable may be unsafe. Consider using wcscpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    : see declaration of 'wcscpy'
    : warning C4996: 'wcscat': This function or variable may be unsafe. Consider using wcscat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    : see declaration of 'wcscat'

3 个答案:

答案 0 :(得分:2)

您应该使用std::wstringstd::string以及类似的C ++标准库函数,而不是那些函数,因为它们容易受到缓冲区溢出和其他安全性(更不用说应用程序可靠性)问题的影响。 / p>

答案 1 :(得分:2)

还有另一个原因是不使用原始strtok family function

  

[...]但是,在单个线程中,对这些函数之一的交错调用极有可能产生数据损坏和不准确的结果。解析不同的字符串时,在开始解析下一个字符串之前完成解析一个字符串。另外,请注意在调用其他函数的循环中调用其中一个函数时可能存在危险。如果另一个函数最终使用这些函数之一,则会产生交错的调用序列,从而触发数据损坏。

原因是strtok不可重入:在设计时,人们认为将全局变量用作上下文的存储库是个好主意(您如何看待strtok能记住每个函数调用之间的继续吗?)。

过去是过去,我们不应该从几十年前判断代码,但是,随着所有新标准(C99浮现在脑海中),我仍然感到惊讶,这个函数没有被重构。

至少,Microsoft生成的strtok_s family of function使用用户提供的变量(称为context)。如果您可以选择生产代码,请使用strtok_s

如果您需要提供跨平台代码,我的建议是:

  1. 编写一个函数,用作真实的
  2. 间接
  3. 在Windows上,重定向到strtok_s
  4. 在任何有安全strtok的平台上(我在谷歌搜索时找到strtok_r),重定向到该功能
  5. 在没有安全性的平台上,自己编写(这远非困难,是学习编程的好习惯)
  6. 现在,有这些C函数的C ++替代方案,可以将std::string methods组合在一起,也可以使用boost::tokenizer

答案 2 :(得分:1)

wcstok容易受到缓冲区溢出攻击。编译器建议您使用处理该威胁的替代版本。

请参阅MSDN documentation中对wcstok的评论。

如果您完全控制传递给wcstok的数据,那么您无需担心。如果传递给wcstok的数据可能由用户提供,则会产生缓冲区溢出攻击的可能性。