これは本当にバッファオーバーフローですか?
-
23-08-2019 - |
質問
我々が使用する静的解析ツールは、重要なバッファオーバーフローとして、次のようなCコードを低迷している。
#define size 64
char buf [size + 1] = "";
memset (buf, 0, size + 1);
ツールのエラーメッセージは、のバッファオーバーフローする(配列境界のインデックス満点):配列「BUF」サイズである1アレイ「bufが」0 64インデックスを使用することができます。 P>
これは合法的ですか?空の文字列に文字配列の割り当ては、実際にそれがchar buf [] = "";
のように定義しているかのように、単一のバイトに縮小されてその長さになりますか?
解決
BUFに[サイズ+ 1]はBUFのサイズをリセットしませんが、それはそれ以降のmemsetが何をするかの小さな部分を複製している(そして、それはあなたの静的解析ツールを混乱させるために、それは、無意味である「」割り当て)それに対してバグレポートを提出したい。
他のヒント
別にサイズを使用すると、その後のmemset(BUF、0、65)ではない、サイズ65アレイとしてBUFを構築したと仮定すると、実行時の値であるため、チャーBUF [サイズ+ 1]がコンパイルされないという事実からオーバーフロー。
あなたのツールがあなたの構文の問題で混乱しているオッズです。
[編集:詳細]
私の元記事へのコメントに基づいて、私は次のことをお勧めします:
#define size 64
char buf[size+1];
strcpy(buf, "");
memset(buf, 0, size+1);
私はロブ・ケネディが正しいと信じて。あなたのツールは、配列のサイズではなく、静的な配列の宣言として空の文字列初期化子の値を使用しています。
これは、バッファのオーバーフローではない。
これはおそらくそれを行うにはクリーンな方法です。 確かに、それは、コードの以下の行を取ります。
#define size 64
char buf[size + 1] = {0};
これは合法 - バッファが十分な大きさです。ツールはsize_t型がintよりも大きくなる可能性があることを警告し、インデクサは、予期しない結果につながる可能性としてそれを使用しようとしている。