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
的数据,则无需担心。如果传递给 WCSTOKO/CODE>的数据可以由用户提供,那么就可能产生缓冲区溢出攻击。

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

还有另一个不使用原件的原因:

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

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

过去已经过去了,我们不应该对几十年前的代码进行评判,但是,考虑到所有的新标准(想到C99),我仍然很惊讶这个函数没有得到重构

至少,Microsoft生产的使用用户提供的变量(称为
上下文
)。如果您有选择权,请使用
strtok_
作为生产代码

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

  • 编写一个函数,该函数将用作实际函数的间接寻址
  • 在Windows上,重定向到strtok\s
  • 在任何有安全strtok的平台上(我在谷歌搜索时发现
    strtok\u r
    ),重定向到该函数
  • 在没有安全strtok的平台上,编写自己的strtok(这绝非难事,而且是学习编程的好练习)

  • 现在,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提供指向非零终止字符串的指针(例如,一些随机内存,可能不是字符串…)。但即使在这种情况下,缓冲区溢出的原因也不是因为