Следующая программа имеет неопределенное поведение:
#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"
и т. д., чтобы убедиться, что предоставленные аргументы имеют типы, соответствующие указанной строке формата, и что преобразования, указанные в строке формата, имеют смысл.
x
(объектunsigned int
) интерпретируется так, как если бы оно было типаint
. - person Keith Thompson   schedule 03.07.2012va_arg
. - person jxh   schedule 03.07.2012int
, вызов был бы законным. Так почему же следует ожидать, что gcc выдаст предупреждение о судебном разбирательстве? - person Andy Ross   schedule 03.07.2012x
превышаетINT_MAX
, поведение не определено. Аргументы типаint
иunsigned int
взаимозаменяемы только для значений, представленных в обоих типах. - person Keith Thompson   schedule 03.07.2012va_arg
. Поскольку стандарт никак не определяет поведение, кроме преобразования беззнакового в подписанное, я пришел к выводу, что реализация определяется посредством этого преобразования. Но, YMMV. - person jxh   schedule 03.07.2012UINT_MAX-100
превышаетINT_MAX
. И в разделе ничего не говорится о конверсиях. - person Keith Thompson   schedule 03.07.2012