Страницы

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

понедельник, 6 января 2020 г.

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

#c #printf


Согласно стандарту функция 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


Почему возникает такая ошибка? Ведь строка форматирования соответствует прототипу.
    


Ответы

Ответ 1



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

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

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