0

いくつかのレガシー RAID コードの修正に行き詰まっています (はい、最短のストローを引っ張りました)。

Heres は、私が見つけたコードのスニペットです。

#define FLAG_LENGTH 256

#code
char str[FLAG_LENGTH-1]

strlcat(&str,source_ptr,FLAG_LENGTH);

正当な理由でサイズが 1 少ないという str 宣言のすぐ上にコメントがありますが、寛大なコメント ライターは「正当な理由」について言及していません。

strlcat の実装を正しく理解していれば、すべての文字列が NULL で終了し、サイズが 256 の場合、サイズ 255 の文字列、つまり最後のインデックス 254 の 256 番目の文字、つまりインデックス 255 に追加されます。ストリング??それとも、これを行うことに隠れた天才がいますか(純粋にコメントに基づいて質問しています)

4

2 に答える 2

3

はい、このコードは危険なほど間違っています。他に言うことは本当に何もありません。誰かが誤って +1 ではなく -1 を書いたのではないかと思いますが、配列のサイズと に渡されるサイズが一致しない理由はありませんstrlcat

ちなみに、この種のバグは、魔法のような「安全な」文字列インターフェイスが万能薬ではない理由の良い例だと思います。堅実なコードを書くには、ばかである必要はありません。言語やライブラリの機能は、あなた自身の愚かさからあなたを守りません。

于 2012-11-07T06:56:04.747 に答える
0

なんてこった、なぜ人々はわざわざドキュメントを読まないのですか?

Miller/de Raadt の元の論文を読んだ場合、上記のコードは次のようになります。

strlcat(src, source_ptr, sizeof(src));
于 2014-03-13T21:59:52.590 に答える