Poniższy program jest niezdefiniowane zachowanie:Dlaczego gcc -Wformat nie ostrzega o printf% d na 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 stany% d oczekuje int argument.
C99 7.19.6.1p9 stwierdza: „Jeśli argument nie jest prawidłowy typ dla odpowiednią specyfikacją konwersji, zachowanie jest niezdefiniowane ”.
Jednak gcc -Wformat
(który jest dołączony -Wall
) nie będzie narzekać powyższego programu, dlaczego? Czy to błąd, czy celowe zaniedbanie?
Z podręcznika gcc:
-Wformat
Sprawdź nazywa się "printf"
i "scanf"
itp, aby upewnić się, że argumenty przekazane do odpowiednich rodzajów mieć ciąg formacie określonym, a konwersje wymienione w formacie ciąg ma sens
C99 6.3.1.3p3 mówi konwersję unsigned do podpisany jest realizacja zdefiniowane. – jxh
@ user315052: Nie ma konwersji; reprezentacja 'x' (' unsigned int' object) interpretowana jest tak, jakby była typu 'int'. –
@KeithThompson: Myślę, że jest to z powodu C99 7.15.1.1p2, ostatnie zdanie, gdzie robi wyjątek dla podpisanego/unsigned podczas konwersji typów argumentów poprzez makro 'va_arg'. – jxh