Предупреждение "формат не строковый литерал и аргументы формата" не отображаются в последней версии gcc - PullRequest
0 голосов
/ 01 мая 2018

В моем коде я использую следующую строку для печати массива char readbuffer[1]; (массив символов с размером 1):

printf(readbuffer);

Это компилирует и работает без проблем на моем компьютере (Arch Linux, gcc версия 7.3.1+20180406-1). Однако, когда я отправил свое назначение, содержащее этот код, моему инструктору, он фактически получил предупреждение компилятора, компилирующее мой код:

shell.c:89:20: warning: format not a string literal and no format arguments [-Wformat-security]
         printf(readbuffer);

Он использует версию gcc / clang от 16.04 LTS. Мы оба использовали одни и те же флаги компилятора.

Почему это? Неужели это внезапно больше не проблема в новой версии gcc? Если да, то почему?

Просто примечание: я не хочу знать, как решить эту проблему, но просто хочу знать, почему предупреждение несовместимо с версиями gcc.

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Я не хочу знать, как решить эту проблему ...

Да, вы действительно делаете!

Если ваша char[1] переменная всегда содержит \0, то, что вы делаете, небезопасно. А также. если оно содержит , то то, что вы делаете, - ничто: -)

Правильный способ сделать то, что вы пытаетесь сделать, это предположить необходимость printf:

printf("%.1s", readbuffer);

Это гарантирует, что вы не будете пытаться читать дальше этого единственного символа. Конечно, если вы знаете , что всегда будет персонаж, просто используйте:

putchar(*readbuffer);

С точки зрения того, почему разные версии gcc сообщают по-разному, это можно объяснить простым улучшением со временем. По той же причине, например, gcc будет жаловаться на несоответствие между количеством спецификаторов формата и количеством аргументов в чем-то вроде:

printf ("%s %d\n", "hello");

тогда как некоторые другие реализации не могут.

В частности, хотя стандарт предписывает, что должен сообщаться в качестве диагностики, он не ограничивает иначе, какие реализации могут сообщать как диагностику за пределами этого.

Более поздние версии компилятора могут добавлять или удалять эти необязательные средства диагностики или изменять способ принятия решения о них.

0 голосов
/ 01 мая 2018

Это не вызвано разницей в версиях GCC. Скорее, Ubuntu изменил GCC для включения -Wformat -Wformat-security по умолчанию . Если вы передадите эти параметры в Arch Linux, вы должны увидеть там то же самое поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...