[英]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。 請參閱我關於該主題的問題:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.