#c #printf
Согласно стандарту функция printf имеет прототип: int printf(const char *restrict format, ...); Собственно, сабж: #includeint 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 трактовать как ошибки.
Комментариев нет:
Отправить комментарий