为什么"strcat"被认为是"不安全"?

Ale*_*lex 6 c++ strcat visual-c++

可能重复:
为什么MSVC++认为"std :: strcat"是"不安全的"?(C++)

这是我的代码:

char sentence[ 100 ] = "";
char *article[ 5 ] = { "the", "a", "one", "some", "any" };

lexeme = rand() % 4; // random lexeme
strcat( sentence, article[ lexeme ] );
strcat( sentence, " " );
Run Code Online (Sandbox Code Playgroud)

在MSVC++中调试时,它给了我这些警告消息:

Warning 1   warning C4996: 'strcat': This function or variable may be unsafe. Consider using strcat_s instead.
Warning 2   warning C4996: 'strcat': This function or variable may be unsafe. Consider using strcat_s instead. 
Run Code Online (Sandbox Code Playgroud)

我该如何解决?

Ste*_*end 15

这是因为没有什么可以阻止你 - strcat超过100个字节进入你的sentence缓冲区,未定义的结果包括堆损坏,堆栈损坏,程序退出,甚至有人拥有你的机器如果超过第100个字节的数据被适当地构造.这是一类常见的安全漏洞,称为缓冲区溢出.

为了避免这种情况,请使用std::string's operator+,毕竟这是C++.CRT不再需要限制你.

  • +1推荐`std :: string`,它总是*是C++中这样一个问题的正确答案. (2认同)
  • @Max,是的,这将是一个很好的替代回应。如果在 C++ 代码中,我只是更喜欢避免使用 CRT,原因类似于上述问题。 (2认同)