Страницы

Поиск по вопросам

понедельник, 11 февраля 2019 г.

Почему возникает ошибка format string is not a string literal?

Согласно стандарту функция printf имеет прототип: int printf(const char *restrict format, ...);
Собственно, сабж:
#include
int main (void) { const char *format = "hello world!"; printf(format);
return 0; }
Протест Clang
printf.c:7:12: error: format string is not a string literal (potentially insecure) [-Werror,-Wformat-security] printf(format); ^~~~~~ printf.c:7:12: note: treat the string as an argument to avoid this printf(format); ^ "%s", 1 error generated
Почему возникает такая ошибка? Ведь строка форматирования соответствует прототипу.


Ответ

Собственно, clang ругается на совсем другое. Первой ошибкой он говорит, что хорошо бы строку форматирования явно задать литералом, а не переменной, так как переменную может кто то случайно поменять или подменить. А явное - это всегда лучше. Подобная строка форматирования сколько раз была причиной багов и уязвимостей, что clang решает предупредить.
Второй строкой он говорит, что красивее эту конструкцию писать так
printf("%s", format);
Но иногда лучше сразу писать
puts(format);
Но на самом деле ошибка возникает из за -Werror, который заставляет warning трактовать как ошибки.

Комментариев нет:

Отправить комментарий