sprintf неопределенное поведение

0

Я не могу найти информацию об этом: Использует ли неправильные спецификаторы формата в sprintf UB, как в printf?

и я спрошу, также здесь идет UB?

unsigned int x = 5;
printf("%d",x);

или это:

unsigned char x = 5;
printf("%d",x);
  • 0
    Один вопрос за раз, пожалуйста.
  • 0
    Использование неправильных спецификаторов формата в sprintf() вызывает UB, как и в printf() , и то же самое верно для всех остальных членов семейства функций printf .
Теги:

1 ответ

6
Лучший ответ

Использует ли неправильные спецификаторы формата в 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 целым продвижением, что обычно происходит.

  • 0
    Не обязательно верно, что unsigned char повышается до int .
  • 0
    @KerrekSB "что обычно бывает".
Показать ещё 14 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню