次のプログラムの動作は未定義です。
#include <stdio.h>
int main(void)
{
unsigned int x = -100; // This is fine, becomes UINT_MAX - 100
printf("%d\n", x); // This is undefined behavior.
return 0;
}
C99 7.19.6.1p8は、%dがint引数を期待していると述べています。
C99 7.19.6.1p9には、「引数が対応する変換仕様の正しい型でない場合、動作は 未定義です」と記載されています。
ただし、gcc -Wformat
(に含まれています-Wall
)は上記のプログラムについて文句を言いません、なぜですか?これはバグですか、それとも意図的な省略ですか?
gccのマンページから:
-Wformat
"printf"
およびなどの呼び出しをチェック"scanf"
して、指定された引数が指定されたフォーマット文字列に適切な型を持っていること、およびフォーマット文字列で指定された変換が意味をなすことを確認します。