10

次のプログラムの動作は未定義です。

#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"して、指定された引数が指定されたフォーマット文字列に適切な型を持っていること、およびフォーマット文字列で指定された変換が意味をなすことを確認します。

4

1 に答える 1

9

私の推測では、UBはタイプだけでなくによって呼び出されるため、警告はスキップされます。va_arg値が符号付き型と符号なし型の両方で表現可能である限り、符号の不一致を許可します。ただし、printf友人はの観点から指定されておらずva_arg、標準では、タイプの不一致があるとUBが発生すると規定されていますが、これはおそらく標準のバグです。それ以外の場合は、printf("%x",1);UBを呼び出します。トピックに関する私の質問を参照してください:

printf( "%x"、1)は未定義動作を呼び出しますか?

于 2012-07-03T02:54:14.487 に答える