最近、確認したい奇妙なケースに気付きました。
SUS により%n
、フォーマット文字列の for は、int
出力に書き込まれるバイト数にそれぞれ設定されます。さらに、 forsnprintf(dest, 3, "abcd")
はdest
を指し"ab\0"
ます。なんで?n (n = 3) バイト以下が出力 (dest
バッファー) に書き込まれるためです。
私はコードのためにそれを推測しました:
int written;
char dest[3];
snprintf(dest, 3, "abcde%n", &written);
written
2 に設定されます (null 終了はカウントから除外されます)。しかし、GCC 4.8.1 を使用して作成したテストでは、written
5 に設定されていました。標準を誤解していましたか? バグですか?未定義の動作ですか?
編集:
@wildplasser 氏は次のように述べています。
... フォーマット文字列の %n の動作は、未定義または実装定義の可能性があります ...
と
... 実装では、完全なフォーマット文字列 (%n を含む) の処理をシミュレートする必要があります ...
@パーは言った:
written
が検出された時点で書き込まれる文字数が 5 であるためです%n
。これは正しい動作です。 末尾の null を引いた文字snprintf
までのみコピーします ...size
と:
これを見る別の方法は、最大 2 文字しか処理されなかった場合でも遭遇しなかったであろうということです。そのため、無効な値を持つことが
%n
予想されます...written
と:
... 文字列全体が
printf()
ルールによって処理され、次にmax-length が適用されます ...
それが標準、標準草案、または何らかの公式ソースであることを確認できますか?