2

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

     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'
4

3 回答 3

2

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

于 2011-05-15T10:54:39.697 回答
2

不使用原始strtok 系列函数还有另一个原因:

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

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

过去就是过去,我们不应该评判几十年前的代码,但是,随着所有新标准(想到 C99),我仍然对这个函数没有被重构感到惊讶。

至少,微软生产的strtok_s 系列函数为此使用了用户提供的变量(称为context)。如果您可以选择,对于生产代码,请使用strtok_s.

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

  1. 编写一个函数,该函数将用作对真实函数的间接引用
  2. 在 Windows 上,重定向到 strtok_s
  3. 在任何有安全 strtok 的平台上(我strtok_r在谷歌搜索时发现),重定向到该函数
  4. 在没有安全 strtok 的平台上,自己写(不难,是学习编程的好练习)

现在,这些 C 函数有 C++ 替代方案,或者将std::string方法组合在一起,或者使用boost::tokenizer

于 2011-05-15T11:22:19.377 回答
1

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

请参阅 MSDN文档中的备注以获取wcstok.

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

于 2011-05-15T09:37:32.320 回答