C++ 像';wcstok';:此函数或变量可能不安全。考虑使用WcStkks代替
我只是在代码中使用这些宽字符文字来了解它们C++ 像';wcstok';:此函数或变量可能不安全。考虑使用WcStkks代替,c++,warnings,tr24731,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"
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'
wcstok
易受缓冲区溢出攻击。编译器建议您使用替代版本来处理该威胁
请参阅MSDN中有关wcstok
的备注
如果您完全控制了传递给
wcstok
的数据,则无需担心。如果传递给strtok
是不可重入的:在设计时,人们认为它最好使用一个全局变量作为上下文的存储库(您认为strtok
如何记住在每次函数调用之间从何处继续?)
过去已经过去了,我们不应该对几十年前的代码进行评判,但是,考虑到所有的新标准(想到C99),我仍然很惊讶这个函数没有得到重构
至少,Microsoft生产的使用用户提供的变量(称为上下文
)。如果您有选择权,请使用strtok_
作为生产代码
如果您需要提供跨平台代码,我的建议是:
strtok\u r
),重定向到该函数现在,C++函数有两种替代方法,要么组合在一起,要么使用< /p>你的问题是什么?你是否能在生产代码中忽略这些警告?这是不安全的,否则函数的实现者就不会费心写这样的错误消息。我建议,作为警告状态,查看安全的VE。函数的分类。是的,你明白我的意思,我明白你的答案。谢谢,所以这些函数wcstok,wcscpy…等已经弃用/过时了。所以我想永远不会出现这样的情况,我们必须使用这些过时的函数,而应该使用它们更安全的版本。对!!。我不应该知道这些过时的东西,只是忘记了我t如果我在其他任何地方都不需要它…@Munish:Microsoft不推荐使用旧接口,但仍然是标准C(因此也是C++)。C标准委员会创建了一份技术报告TR24731-1(请参阅),描述了替代方案(
*\s()
)接口。遗憾的是,Microsoft的实现与TR的定义不完全匹配。除MSVC之外,几乎没有其他编译器实现了它们。在某些情况下,新的调用比它们所替换的调用更好;在其他情况下,好处很小。嗯…,与标准C/C++相比有太多的变化。我需要知道标准C/C++学习了什么信息技术thanks@munish:要完全清楚,这些\u s
功能不是标准的,这些功能与MS希望您相信的功能相反,在任何官方文件中都没有被弃用。许多人建议禁用这些警告,您需要的定义是\u CRT\u SECURE\u NO\u warnings
。使用标准函数和它定义了你是否知道你在做什么,你很可能会做什么。@rubenvb如果你想让你的代码抵御缓冲区溢出攻击,你需要采取某种形式的行动。我需要把这作为我的答案。当然,感谢C委员会从过去学到了东西,并设计了wcstok()
重新进入(没有诊断为strtok()
的问题)。在许多圈子(POSIX-ish)中已经有一个函数strtok_r()
实现了可重入性(这就是\r
后缀所表示的)。嗯……我看到wcstok()的MSDN版本
与C99版本的wcstok()
-MSDN确实延续了strtok()
的缺陷。哎哟!不知道。总有一天会有人解释缓冲区溢出的原因。我看不到*tok()
函数存在缓冲区溢出问题…@Jonathan Leffler:我猜微软的wcstok
是在Unicode Windows API(使用UTF-16)上工作时写的,它是对strtok
的镜像,可能比C99的wcstok
早几年,也比微软学到安全问题的艰难方法早很多年,即使是在代码中。@Jonathan Leffler:我看不到*tok()存在缓冲区溢出问题的函数
:我同意…除非,稍微想象一下。例如,有人向strtok提供指向非零终止字符串的指针(例如,一些随机内存,可能不是字符串…)。但即使在这种情况下,缓冲区溢出的原因也不是因为