このパターンを使用して、作業中のコードの文字列に連結するのを見ました。
sprintf(buffer, "%s <input type='file' name='%s' />\r\n", buffer, id);
sprintf(buffer, "%s</td>", buffer);
そして私はそれが安全ではないとかなり確信していますC.あなたはそれbuffer
が出力と最初の入力の両方であることに気付くでしょう。
バッファオーバーフローの明らかな可能性は別として、関数の開始と終了の間でバッファが変更されないという保証はないと思います(つまり、バッファの状態が関数の実行)。sprintfのシグニチャは、ターゲット文字列がrestrict
edであることを追加で指定します。
memcpyでの投機的な記述の報告も思い出しますが、一部のCライブラリがsprintfで同じことを行う理由はわかりません。この場合、もちろん、それはそのソースに書き込みます。では、この動作は安全ですか?
参考までに、私は提案しました:
char *bufEnd = buffer + strlen(buffer);
/* sprintf returns the number of f'd and print'd into the s */
bufEnd += sprintf(bufEnd, " <input type='file' name='%s' />\r\n", id);
これを交換します。