を使用してこのようなコードを書いていますsnprintf()
:
char myId[10] = "id123";
char duplicateId[10] = "";
snprintf(duplicateId, 10, myId);
ご覧のとおり、書式指定子を%s
明示的に指定していません。
snprintf()
このように、上記のステートメントで書式指定子を明示的に指定する必要がありますsnprintf(duplicateId, 10, "%s", myId);
か?
いいえ、技術的にはそうする必要はありません。ただし、一定のフォーマット文字列がないと、フォーマット文字列が変更可能なままになり、コードがフォーマット文字列攻撃を受けやすくなるため、そうすることをお勧めします。
ああ、またsizeof(duplicateId)
、定数の代わりに使用します10
- これもセキュリティ上の理由からです (sprintf の出力バッファーのサイズを変更するときに、将来のバッファー オーバーフローを回避するため)。
安全性が高いので使用したほうがいい%s
です…警告が出ませんか?同様に、最高の警告レベルでコンパイルしてみてください。
詳細はこちら
いいえ、そうではありませんが、特にユーザー入力テキストを に渡す可能性がある場合は、一般的に良い考えと見なされますsnprintf()
。ユーザー%
がそれ以外の文字列を入力すると、問題が発生します。
const char *userString = "%";
snprintf(duplicateId, sizeof duplicateIt, userString); /* BAD */
const char *userString = "%s";
snprintf(duplicateId, sizeof duplicateIt, "%s", userString); /* GOOD. */