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