Согласно стандарту функция 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 трактовать как ошибки.
Комментариев нет:
Отправить комментарий