aşağıdaki program tanımlanmamış olan davranışı:Neden gcc -Wformat, imzasız bir int üzerinde printf% d hakkında uyarı yapmıyor?
#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;
}
Ancak (C99 7.19.6.1p8 durumları% d int bağımsız değişken bekliyor.
bildiren 7.19.6.1p9C99 "bir bağımsız değişken belirteci karşılık gelen için doğru türde değildir, davranış tanımlanmamış olan".
-Wall
ile birlikte) gcc
-Wformat
neden yukarıdaki programda, şikayet olmaz? Bu bir hata mı, yoksa kasıtlı bir ihmal mi? gcc manpage itibaren
:
-Wformat
kontrol vb "printf"
ve "scanf"
için, verilen argümanlar belirtilen format dizesine uygun türde olduğundan emin olmak için çağırır ve bu formatta belirtilen dönüşümler dize anlamlıdır
C99 6.3.1.3p3 uygulaması tanımlanır imzalı imzasız dönüşümünü diyor. – jxh
@ user315052: Dönüşüm yok; "x" (bir "imzasız int" nesnesi) temsili, "int" türündeymiş gibi yorumlanır. –
@KeithThompson: C99 7.15.1.1p2, son cümlesi nedeniyle, argüman türlerini "va_arg" makrosuyla dönüştürürken imzalı/imzasız için bir istisna oluşturduğunu düşünüyorum. – jxh