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"and"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 回答