以下程序具有未定义的行为:
#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 规定“如果任何参数的类型不正确
相应的转换规范,行为是不明确的."
然而,海湾合作委员会-Wformat
(包含在-Wall
)不会抱怨上面的程序,为什么呢?这是一个错误,还是故意遗漏?
来自 gcc 联机帮助页:
-Wformat
检查呼叫"printf"
and "scanf"
等,以确保提供的参数具有适合指定格式字符串的类型,并且格式字符串中指定的转换有意义
我最好的猜测是,警告被跳过,因为 UB 可以说是由value而不仅仅是类型。va_arg
只要该值可以用有符号和无符号类型表示,就允许符号不匹配。然而,printf
和朋友没有指定va_arg
标准规定任何类型不匹配都会导致 UB,但这可能是标准中的一个错误。否则,printf("%x",1);
将调用 UB。请参阅我关于该主题的问题:
printf("%x",1) 是否会调用未定义的行为? https://stackoverflow.com/questions/4664100/does-printfx-1-invoke-undefined-behavior
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)