2011-04-26 152 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

相關問題