我只是在我的代码中使用这些宽字符文字来了解它们
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'
答案 0 :(得分:2)
您应该使用std::wstring
和std::string
以及类似的C ++标准库函数,而不是那些函数,因为它们容易受到缓冲区溢出和其他安全性(更不用说应用程序可靠性)问题的影响。 / p>
答案 1 :(得分:2)
还有另一个原因是不使用原始strtok family function:
[...]但是,在单个线程中,对这些函数之一的交错调用极有可能产生数据损坏和不准确的结果。解析不同的字符串时,在开始解析下一个字符串之前完成解析一个字符串。另外,请注意在调用其他函数的循环中调用其中一个函数时可能存在危险。如果另一个函数最终使用这些函数之一,则会产生交错的调用序列,从而触发数据损坏。
原因是strtok
不可重入:在设计时,人们认为将全局变量用作上下文的存储库是个好主意(您如何看待strtok
能记住每个函数调用之间的继续吗?)。
过去是过去,我们不应该从几十年前判断代码,但是,随着所有新标准(C99浮现在脑海中),我仍然感到惊讶,这个函数没有被重构。
至少,Microsoft生成的strtok_s family of function使用用户提供的变量(称为context
)。如果您可以选择生产代码,请使用strtok_s
。
如果您需要提供跨平台代码,我的建议是:
strtok_r
),重定向到该功能现在,有这些C函数的C ++替代方案,可以将std::string
methods组合在一起,也可以使用boost::tokenizer
答案 2 :(得分:1)
wcstok
容易受到缓冲区溢出攻击。编译器建议您使用处理该威胁的替代版本。
请参阅MSDN documentation中对wcstok
的评论。
如果您完全控制传递给wcstok
的数据,那么您无需担心。如果传递给wcstok
的数据可能由用户提供,则会产生缓冲区溢出攻击的可能性。