3

私たちが使用している静的解析ツールは、次のような C コードに重大なバッファ オーバーフローとしてフラグを立てています。

#define size 64
char  buf [size + 1] = "";
memset (buf, 0, size + 1);

ツールのエラー メッセージは次のとおりです。 バッファ オーバーフロー(範囲外の配列インデックス): 配列 'buf' のサイズは 1 です。配列 'buf' は 0..64 インデックスを使用する可能性があります。

これは合法ですか?文字配列を空の文字列に代入すると、実際にその長さが 1 バイトに短縮されるのchar buf [] = "";でしょうか?

4

4 に答える 4

12

size はランタイム値であるため char buf[size+1] がコンパイルされないという事実は別として、buf をサイズ 65 の配列として構築できると仮定すると、 memset(buf, 0, 65) はオーバーフローしません。

構文上の問題により、ツールが混乱している可能性があります。

[編集:詳細]

元の投稿へのコメントに基づいて、次のことを提案します。

#define size 64
char buf[size+1];
strcpy(buf, "");
memset(buf, 0, size+1);

私はロブ・ケネディが正しいと信じています。ツールは、静的配列宣言ではなく、空の文字列初期化子の値を配列サイズとして使用しています。

于 2009-02-16T15:40:25.833 に答える
5

"" を buf[size+1] に割り当てても buf のサイズはリセットされませんが、後続の memset が行うことのごく一部を複製しているため、意味がありません (また、静的分析ツールを混乱させます。それに対するバグレポート)。

于 2009-02-17T01:38:07.053 に答える
4

バッファ オーバーフローではありません。

これはおそらくそれを行うためのよりクリーンな方法です。確かに、必要なコード行数は少なくなります。

#define size 64
char buf[size + 1] = {0};
于 2009-02-17T02:06:19.170 に答える
0

それは合法です-バッファは十分に大きいです。このツールは、size_tがintよりも大きい可能性があることを警告しており、インデクサーとして使用しようとすると、予期しない結果が生じる可能性があります。

于 2009-02-16T15:44:21.427 に答える