Я не могу найти информацию об этом: Использует ли неправильные спецификаторы формата в sprintf
UB, как в printf
?
и я спрошу, также здесь идет UB?
unsigned int x = 5;
printf("%d",x);
или это:
unsigned char x = 5;
printf("%d",x);
Использует ли неправильные спецификаторы формата в
sprintf
UB, как вprintf
?
Да. Все *printf
определены одинаково (в самом разделе fprintf
).
и я спрошу, также здесь идет UB?
unsigned int x = 5; printf("%d",x);
Это технически UB. %d
ожидает аргумент int
и "Если какой-либо аргумент не является правильным типом для соответствующей спецификации преобразования, поведение не определено". (WG14 N1570, 7.21.6.1/p9; я не думаю, что C11 здесь что-то изменил по сравнению с C99). unsigned int
не int
. На практике вы, вероятно, можете избежать этого.
или это:
unsigned char x = 5; printf("%d",x);
Это не UB тогда и только тогда, когда unsigned char
продвигается до int
целым продвижением, что обычно происходит.
unsigned char
повышается до int
.
sprintf()
вызывает UB, как и вprintf()
, и то же самое верно для всех остальных членов семейства функцийprintf
.