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

Chr*_*ung 9 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;
}
Run Code Online (Sandbox Code Playgroud)

C99 7.19.6.1p8状态%d需要一个int参数.

C99 7.19.6.1p9声明"如果任何参数不是相应转换规范的正确类型,则行为 未定义."

但是,gcc -Wformat(包含在内-Wall)不会抱怨上述程序,为什么?这是一个错误,还是故意遗漏?

从gcc手册页:

-Wformat
Run Code Online (Sandbox Code Playgroud)

检查电话"printf""scanf"等,以确保提供参数指定适当的格式字符串类型,并在格式字符串指定的转换意义

R..*_*R.. 8

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

printf("%x",1)是否会调用未定义的行为?

  • GCC 5.0现在有这样的警告:[`-Wformat-signedness`](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60194)(由`-Wformat`启用). (3认同)