8

可能重复:
为什么 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, " " );

在 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. 

我该如何解决?

4

3 回答 3

19

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

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

于 2011-04-26T16:52:33.397 回答
2

因为这是合法的

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

lexeme = rand() % 4; // random lexeme
strcat( sentence, article[ lexeme ] ); // BUFFER OVERRUN
strcat( sentence, " " );

这将让您修改堆栈上超出句子数组的任何内容。您可能会在不让语言或操作系统阻止您的情况下覆盖其他堆栈变量,从而在不知不觉中导致错误。此外,还有一个巨大的安全问题——堆栈上的东西包括指向要返回的函数的指针。聪明的攻击者可以在您的数据中插入指向其代码的指针,从而允许他们执行任何他们想要的操作。

我建议尽可能避免使用 C 风格的字符串。尽可能使用 std::string,当您绝对必须使用 C 字符串时, Microsoft 建议对 C std 库进行安全增强。

于 2011-04-26T16:51:40.537 回答
0

您可以使用它strcat_s来修复潜在的缓冲区过载。

于 2011-04-26T16:52:45.137 回答