Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
34
Добавлен:
01.05.2014
Размер:
206.19 Кб
Скачать

Опции вывода и подавления предупреждений

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

Следующие опции управляют количеством и типами выдаваемых предупреждающих сообщений. Напомним, что большинство опций этого раздела имеют отрицательную форму (см. гл. 1).

-fsyntax-only (--syntax-only)

Проверять только синтаксис исходной программы, не более того.

-pedantic (--pedantic)

Выдавать все предупреждения, предусмотренные стандартом ANSI Си. Отклонять программы, содержащие запрещенные конструкции.

Программы, удовлетворяющие стандарту ANSI, должны правильно компилироваться независимо от наличия этой опции (хотя в некоторых редких случаях для этого может понадобиться указание опции -ansi). Однако без ‑pedanticподдерживаются также многие расширения GNU Си, а также отдельные черты традиционного Си. При компиляции с этой опцией программы, содержащие расширения и атавизмы, отклоняются.

Опция -pedantic не приводит к выдаче предупреждающих сообщений при употреблении альтернативных ключевых слов, начинающихся с пары подчеркиваний (__). Предупреждения не выдаются также для выражений, следующих после ключевого слова__extension__. Однако подобными обходными маневрами допустимо пользоваться только в системных заголовочных файлах. В прикладных программах их следует избегать.

Эта опция не была, в сущности, задумана как некий полезный инструмент контроля. Она была введена лишь для удовлетворения педантов, которые в противном случае получили бы шанс утверждать, что GNU CC не поддерживает стандарт ANSI.

Некоторые пользователи пытаются применять эту опцию для проверки соответствия своих программ стандарту ANSI Си. Однако очень скоро они обнаруживают, что получают не совсем то, на что рассчитывали: опция действительно обеспечивает выдачу диагностики для некоторых некорректных с точки зрения ANSI Си конструкций — но лишь для тех, для которых выдача диагностики предусмотрена стандартом ANSI Си.

-pedantic-errors (--pedantic-errors)

То же, что -pedantic, но выдаются не предупреждения, а ошибки.

-w (--no-warnings)

Oтменить все предупреждающие сообщения.

-Wno-import (--warn-no-import)

Отменить предупреждающие сообщения об использовании #import.

-Wchar-subscripts (--warn-char-subscripts)

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

-Wcomment (--warn-comment)

Выдавать предупреждение, если внутри комментария встретилась последовательность, которая может быть началом комментария (/*).

-Wformat (--warn-format)

В обращениях к printf иscanf проверять соответствие аргументов заданной форматной строке.

-Wimplicit (--warn-implicit)

Предупреждать о неявных декларациях функций и параметров.

-Wparentheses (--warn-parentheses)

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

-Wreturn-type (--warn-return-type)

Предупреждать об определениях функций, тип возвращаемого значения которых не задан явно и определен по умолчанию как int. Предупреждать также об употребленииreturnбез указания значения в функциях, тип результата которых отличен отvoid.

-Wswitch (--warn-switch)

Предупреждать об употреблении операторов switch с индексом перечислимого типа, в которых одно или более именованных значений этого перечислимого типа не упоминается в меткахcase. (Предупреждение не выдается, если операторswitchсодержит меткуdefault.) Если задана опция-Wswitch, то предупреждение выдается и в тех случаях, когда в таком оператореswitch употребляется метка, не принадлежащая перечислимому типу индекса.

-Wtrigraphs (--warn-trigraphs)

Предупреждать о наличии триграфов в программе, если их использование разрешено (при помощи опций -ansi, -trigraphs).

-Wunused (--warn-unused)

Выдавать предупреждения о следующих ситуациях:

  • переменная не упоминается нигде, помимо своей декларации;

  • функция продекларирована как статическая (static), но ее определение отсутствует;

  • метка определена, но нигде не используется;

  • в операторе вычисляется результат, нигде явно не используемый.

Для подавления предупреждения в последнем случае достаточно привести тип выражения к void.

-Wuninitialized (--warn-uninitialized)

Предупреждать об употреблении автоматической (automatic) переменной без предварительной инициализации.

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

Предупреждения об отсутствии инициализации выдаются только для переменных, которые являются кандидатами на размещение в регистрах. Следовательно, они не будут сгенерированы для переменных, продекларированных как volatile, или переменных, чьи адреса используются в программе, или если их размер отличен от 1, 2, 4 или 8 байт. Предупреждения не выдаются также для структур, объединений и массивов, даже если они размещаются в регистрах.

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

-Wall (--all-warnings)

Эта опция соответствует комбинации всех перечисленных ранее опций вида -W... .

Опции, перечисленные далее в этом разделе, не подразумеваются опцией -Wall.

-W (--extra-warnings)

Выдавать предупреждения при обнаружении следующих ситуаций:

  • Автоматическая не-volatileпеременная может измениться в результате обращения кlongjmp. Предупреждения этого типа выдаются только при оптимизирующей компиляции.

Фактически компилятор "видит" только обращения к setjmp. Он не может знать о том, где будет вызвана функцияlongjmp; например, обработчик сигналов может вызвать ее из любой точки программы. Поэтому предупреждение возможно и в тех случаях, когда на самом деле никакой проблемы нет, поскольку реально функцияlongjmpне может быть вызвана из такого места, где происходит изменение переменных.

  • Выход из функции может произойти с возвратом или без возврата результирующего значения. (Если выход из функции происходит по достижении конца ее кода, то результирующее значение отсутствует.) Пример:

foo (a)

{

if (a > 0)

return a;

}

  • Оператор-выражение не содержит побочных эффектов.

  • Беззнаковое значение сравнивается с нулем при помощи операций "<" или "<=".

  • Встретилось сравнение вида "x<=y<=z". Оно эквивалентно выражению"(x<=y ? 1 : 0) <= z", т. е. его интерпретация отлична от той, которая принята в математике.

  • Упоминание спецификаторов класса памяти типа staticне не первом месте в декларации. В стандарте Си такое их размещение квалифицируется как выходящее из употребления.

  • Если задана также одна из опций -Wallили-Wunused, то выдавать еще и предупреждения о неиспользуемых аргументах.

  • Предупреждать об инициализаторах агрегатных значений с неполной структурой скобок. Пример инициализатора, для которого будет выдано такое предупреждение (из-за отсутствия скобок вокруг структурного значения x.h):

struct s { int f, g; };

struct t { struct s h; int i; };

struct t x = { 1, 2, 3 };

-Wtraditional (--warn-traditional)

Предупреждать о некоторых конструкциях, по-разному интерпретируемых в традиционном и ANSI Си, а именно:

  • Аргументы макроса встречаются в текстовых константах в теле определения макроса. В традиционном Си это приводит к подстановке аргументов, а в ANSI Си — нет.

  • Функция продекларирована как внешняя в одном блоке и использована после конца этого блока.

  • Оператор switch имеет операнд типаlong.

-Wshadow (--warn-shadow)

Предупреждать о ситуациях, когда определение локальной переменной "перекрывает" определение другой локальной переменной.

-Wid-clash-len (--warn-id-clash-len)

Предупреждать, если у двух идентификаторов совпадают первые lenсимволов.

-Wlarger-than- len (--warn-larger-than-len)

Предупреждать об определениях объектов, размер которых превышает lenбайт.

-Wpointer-arith (--warn-pointer-arith)

Предупреждать о ситуациях, когда что-либо в программе зависит от значения sizeof от типа функции илиvoid. В СКРВ Багет размеры этих типов считаются равными 1 для удобства вычислений с участием указателей типаvoid * и указателей на функции.

-Wbad-function-cast (--warn-bad-function-cast)

Предупреждать, если результат вызова функции приводится к типу, несовместимому с типом результата функции. Например, если результат вызова функции типа int malloc()приводится к типу указателя на что-либо.

-Wcast-qual (--warn-cast-qual)

Предупреждать, если значение указателя приводится к типу, отличающемуся от исходного отсутствием квалификатора. Например, если значение типа const char* приводится к типуchar*.

-Wcast-align (--warn-cast-align)

Предупреждать, если значение указателя приводится к типу, для которого требуется другое ("большее") выравнивание. Такое предупреждение существенно, например, если значение типа char* приводится к типуint * на машине, где целые могут храниться только по адресам, кратным двум или четырем байтам.

-Wwrite-strings (--warn-write-strings)

Приписывать текстовым константам тип const char[LENGTH]; тогда копирование ее адреса в неконстантный указательchar *будет приводить к выдаче предупреждений. Эти предупреждения помогут выявить на этапе компиляции те места в программе, где может происходить запись в текстовые константы, — но только в том случае, если вы аккуратно подошли к употреблению квалификатораconstв декларациях и прототипах. В противном случае это будет только мешать; поэтому данный тип предупреждений и не вошел в стандартный комплект предупреждений, выдаваемых по-Wall.

-Wconversion (--warn-conversion)

Предупреждать, если прототип вызывает преобразование типа аргумента, отличное от того, которое бы имело место в отсутствие прототипа. Это относится к преобразованиям типов с фиксированной точкой к типам с плавающей точкой и наоборот, а также к преобразованиям, при которых изменяется размер или знаковость аргумента с фиксированной точкой, за исключением случаев, когда то же преобразование аргумента подразумевается по умолчанию.

Предупреждения выдаются и при неявных преобразованиях типа целой отрицательной константы к беззнаковому типу. Пример — присваивание x = –1, гдеxимеет беззнаковый тип. При явно заданном преобразовании типа (x =(unsigned) –1) предупреждение не выдается.

-Waggregate-return (--warn-aggregate-return)

Предупреждать об определениях или вызовах функций, возвращающих в качестве результата агрегатное значение.

-Wstrict-prototypes (--warn-strict-prototypes)

Предупреждать, если в декларации или определении функции не заданы типы ее аргументов.

-Wmissing-prototypes (--warn-missing-prototypes)

Предупреждать, если глобальная функция определяется без предварительной декларации прототипа. Предупреждение выдается, даже если определение само содержит прототип функции. Цель — выявить глобальные функции, не декларированные в заголовочных файлах.

-Wmissing-declarations (--warn-missing-declarations)

Предупреждать, если глобальная функция определяется без предварительной декларации. Предупреждение выдается, даже если определение само содержит прототип функции. Цель — выявить глобальные функции, не декларированные в заголовочных файлах.

-Wredundant-decls (--warn-redundant-decls)

Предупреждать о повторных декларациях чего бы то ни было в пределах одной области видимости, даже если повторные декларации корректны и ничего не меняют.

-Wnested-externs (--warn-nested-externs)

Предупреждать о внешних (extern) декларациях внутри функций.

-Winline (--warn-inline)

Предупреждать, если функция не может быть скомпилирована как встроенная в случае, если она была декларирована с квалификатором inline, или если задана опция -finline-functions.

-Werror (--warn-error)

Вместо всех предупреждений выдавать ошибки.

Соседние файлы в папке Еще материалы