6

古いコードで静的解析ツールを実行することにしたところ、sprintf を使用している場所がたくさん見つかりました。このツールでは、呼び出しを vsnprintf または snprintf に置き換えることをお勧めします。これは、sprintf がバッファー オーバーフローの境界チェックを一切行わないためです。

代わりにsnprintfまたはvsnprintfを使用するように、呼び出しで検索と置換を簡単に実行できますが、機能を安全にするために他に何もする必要がないことを確認したい

使用されている文字列がユーザー入力に由来する場合もあれば、そうでない場合もあります。

正しく行う方法についてアドバイスはありますか?

4

1 に答える 1

6

代わりにsnprintfまたはvsnprintfを使用するように、呼び出しで検索と置換を簡単に実行できます

いいえ、そう簡単ではありません。snprintforの定義を見るだけで、出力バッファーの長さを指定するvsnprintfという名前の追加の引数を取ることがわかります。sizeそれnが関数名の の意味です。コードを安全にするには、sprintf を実行しているすべての場所を調べ、出力バッファーに安全に書き込める最大バイト数を把握し、その数値をsize引数としてsnprintforに渡す必要がありvsnprintfます。

安全でないコード:

char buffer[10];
sprintf(buffer, "%d %d", x, y);  // UNSAFE if x and y can be large

同等のセーフ コード:

char buffer[10];
snprintf(buffer, sizeof(buffer), "%d %d", x, y);

すべてのコードが上記の例に適合する場合は、検索と置換を行うことができます。しかし、より複雑なケースについては、おそらくそれについて考える必要があります。

于 2012-09-02T19:08:16.607 に答える