繁体   English   中英

为什么gcc -Wformat没有在unsigned int上警告printf%d?

[英]Why doesn't gcc -Wformat warn about printf %d on an unsigned int?

以下程序具有未定义的行为:

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

我最好的猜测是跳过警告,因为UB可以被调用,而不仅仅是类型。 只要该值在signed和unsigned类型中都可表示, va_arg允许签名不匹配。 但是,没有根据va_arg指定printf和朋友,并且标准声明任何类型不匹配都会导致UB,但这可能是标准中的错误。 否则, printf("%x",1); 会调用UB。 请参阅我关于该主题的问题:

printf(“%x”,1)是否会调用未定义的行为?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM