2011-04-26 156 views
4

可能重复:
Why does MSVC++ consider “std::strcat” to be “unsafe”? (C++)为什么“strcat”被视为“不安全”?

这里是我的代码:

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. 

我该如何解决它?

回答

12

这是因为没有什么能阻止你从strcat -ing超过100个字节到您的sentence缓冲区,与不确定的结果直至并包括堆损坏的,堆栈损坏,程序退出,甚至有人如果数据过去拥有你的机器第100个字节被适当地构建。这是一种常见的安全漏洞,称为buffer overflow

要避免出现这种情况,请使用std::stringoperator+,这毕竟是C++。 CRT不需要再限制你了。

+2

+1推荐'std :: string',它总是* C++中这样的问题的正确答案。 – 2011-04-26 16:54:10

+0

我认为strncat是一个完全合理的方法来做到这一点,特别是因为他在这个例子中使用C字符串。 – 2011-04-26 16:58:22

+1

@最大,是的,这将是一个很好的替代响应。我只是喜欢在C++代码中避免使用CRT,原因就像上面的问题。 – 2011-04-26 16:59:56

1

因为这是合法的

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风格的字符串。当你绝对必须使用C字符串时,尽可能使用std :: string并将Microsoft reccomended security enhancements添加到C标准库。

+0

至于如何解决它,请改用strncat并传递一个确保“句子”字符串不会溢出的计数。 – fredw 2011-04-26 16:54:16

0

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

+1

'strncat'更标准。 'strcat_s'是一个建议的标准,但它远没有被普遍支持。 – LnxPrgr3 2011-04-26 16:55:30

相关问题