【发布时间】:2012-07-03 11:08:26
【问题描述】:
以下程序具有未定义的行为:
#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" 等的调用,以确保提供的参数具有适合指定格式字符串的类型,并且格式字符串中指定的转换有意义
【问题讨论】:
-
C99 6.3.1.3p3 说无符号到有符号的转换是实现定义的。
-
@user315052:没有转换;
x(unsigned int对象)的表示形式被解释为类型为int。 -
@KeithThompson:我认为是因为 C99 7.15.1.1p2,最后一句,在通过
va_arg宏转换参数类型时,它对有符号/无符号进行了例外处理。 -
@KeithThompson 代码中没有转换,只是因为函数是可变参数。如果函数被声明为采用
int,则调用是合法的。那么为什么要期望 gcc 会针对法律案件发出警告呢? -
@user315052:我刚读了那段;这并不意味着存在转换。
标签: c gcc gcc-warning format-specifiers format-string