以下程序具有未定义的行为:
#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标准中 %d 期望的是int类型参数。C99标准7.19.6.1p9表明:"如果任何一个参数与相应的转换说明符类型不匹配,其行为是未定义的"。然而,gcc的-Wformat(包括-Wall选项)不会对上述程序发出警告,这是为什么?这是一个错误还是故意忽略的?从gcc手册可以看出:-Wformat
检查对 "printf"
和 "scanf"
的调用等,确保提供的参数与指定的格式字符串具有适当的类型,并且在格式字符串中指定的转换是合理的。
x
(一个unsigned int
对象)的表示被解释为它是int
类型。 - Keith Thompsonva_arg
宏转换参数类型时对有符号/无符号进行了例外处理。 - jxh