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, " " );

これにより、文配列を過ぎたスタック上のすべてを変更できます。言語や OS によって停止されることなく、他のスタック変数を上書きすることで、知らず知らずのうちにバグを引き起こす可能性があります。また、大きなセキュリティ上の問題があります。スタック上のものには、戻る関数へのポインタが含まれています。巧妙な攻撃者は、データ内のコードへのポインターを挿入して、必要なものを実行できるようにする可能性があります。

可能な限り C スタイルの文字列を避けることをお勧めします。可能な限り std::string を使用し、C 文字列を絶対に使用する必要がある場合は、 Microsoft が C std ライブラリのセキュリティ強化を推奨しています。

于 2011-04-26T16:51:40.537 に答える
0

strcat_s潜在的なバッファ オーバーロードを修正するために使用できます。

于 2011-04-26T16:52:45.137 に答える