簡體   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