私はvisualC++ 2008でsystemCを使用しています。私は単純なhelloワールドプログラムを書いています。しかし、私はこのエラーを繰り返し受けています:Visual C++ 2008を使用したSystemCエラー
警告C4996: 'sprintf':この関数または変数は危険です。
なぜこれが起こっているのですか?助けていただければ幸いです。
私はvisualC++ 2008でsystemCを使用しています。私は単純なhelloワールドプログラムを書いています。しかし、私はこのエラーを繰り返し受けています:Visual C++ 2008を使用したSystemCエラー
警告C4996: 'sprintf':この関数または変数は危険です。
なぜこれが起こっているのですか?助けていただければ幸いです。
コンパイラは、バッファの制限をチェックしないため、バッファオーバーフローが発生する可能性があるため、sprintf()
に対して警告します。代わりに、snprintf()
を使用して、渡された制限を超えてバッファをいっぱいにしないでください。
このアドバイスもmanpageで与えられます。
のsprintf()とvsprintfの()は任意の長さの文字列を想定しているため、発信者が実際のスペースをオーバーフローしない 注意しなければなりません。これはしばしば保証することが不可能です。 生成される文字列の長さはロケールに依存し、予測が難しいことに注意してください。代わりに snprintf()とvsnprintf()を使用してください(asprintf(3)とvasprintf(3))。
あなたがばかだと "これはしばしば保証することが不可能です"。 C言語で長い間コーディングしている人は、本当に安全でないもの( 'gets 'や' scanf( "%s")の入力を制御しないところ)と 'sprintf'のようなものの違いを知っています_can_安全にする。誰もがVBを使用するように戻る必要があります:-)私はいつも#defineでこれらの警告をオフにしています。 – paxdiablo
脆弱性の可能性については、 'gets()'と 'sprintf()'が別のカテゴリに分類されることに同意しますが、あなたが言及していないsprintf()を使う危険性があります。メンテナンス: 'sprintf()'に渡された書式文字列やその他のパラメータを変更すると、バッファサイズを更新するのを忘れてしまうのは簡単です。 –
ので、それは安全ではないのです - のsprintfを使用してコードがオーバーランをバッファリングの影響を受けやすいことを意味書き込まれた文字数を制限する方法はありませんFrom MSDN
。関連する関数_snprintf(バッファに書き込む最大文字数を指定する)を使用するか、_scprintfを使用してバッファの必要量を判断することを検討してください。また、formatがユーザー定義の文字列でないことを確認してください。
エラーではなく警告です。 – Philippe