2

を使用してこのようなコードを書いていますsnprintf()

char myId[10] = "id123";

char duplicateId[10] = "";

snprintf(duplicateId, 10, myId);

ご覧のとおり、書式指定子を%s明示的に指定していません。

snprintf()このように、上記のステートメントで書式指定子を明示的に指定する必要がありますsnprintf(duplicateId, 10, "%s", myId);か?

4

3 に答える 3

7

いいえ、技術的にはそうする必要はありません。ただし、一定のフォーマット文字列がないと、フォーマット文字列が変更可能なままになり、コードがフォーマット文字列攻撃を受けやすくなるため、そうすることをお勧めします。

ああ、またsizeof(duplicateId)、定数の代わりに使用します10- これもセキュリティ上の理由からです (sprintf の出力バッファーのサイズを変更するときに、将来のバッファー オーバーフローを回避するため)。

于 2012-08-29T06:53:06.553 に答える
2

安全性が高いので使用したほうがいい%sです…警告が出ませんか?同様に、最高の警告レベルでコンパイルしてみてください。

詳細はこちら

于 2012-08-29T06:55:21.247 に答える
2

いいえ、そうではありませんが、特にユーザー入力テキストを に渡す可能性がある場合は、一般的に良い考えと見なされますsnprintf()。ユーザー%がそれ以外の文字列を入力すると、問題が発生します。

const char *userString = "%";
snprintf(duplicateId, sizeof duplicateIt, userString);  /* BAD */

const char *userString = "%s";
snprintf(duplicateId, sizeof duplicateIt, "%s", userString);  /* GOOD. */
于 2012-08-29T06:53:06.717 に答える