为什么gcc -Wformat没有在unsigned int上警告printf%d?

时间:2012-07-03 02:39:34

标签: c gcc gcc-warning format-specifiers format-string

以下程序具有未定义的行为:

#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"等的调用,以确保提供的参数具有适合指定格式字符串的类型,并且格式字符串中指定的转换有意义

1 个答案:

答案 0 :(得分:8)

我最好的猜测是跳过警告,因为UB可以被调用,而不仅仅是类型。 va_arg允许签名不匹配,只要该值在signed和unsigned类型中都可表示。但是,printf和朋友没有根据va_arg指定,并且标准规定任何类型不匹配都会导致UB,但这可能是标准中的错误。否则,printf("%x",1);将调用UB。请参阅我关于该主题的问题:

Does printf("%x",1) invoke undefined behavior?