Spec-Zone.ru › GCC 4

3.8 Варианты запроса или подавления предупреждений

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

Следующие независимые от языка варианты не включают определённые предупреждения, но управляют видами диагностики, производимой GCC.

-fsyntax-only
Проверить код на синтаксические ошибки, но ничего не делать сверх этого.
-fmax-errors=n
Ограничивает максимальное количество сообщений об ошибках значением n, после чего GCC прекращает работу, вместо попытки продолжить обработку исходного кода. Если n равно 0 (по умолчанию), ограничений на количество сообщений об ошибках нет. Если также указан -Wfatal-errors, то -Wfatal-errors имеет приоритет над этим вариантом.
-w
Запретить все сообщения о предупреждениях.
-Werror
Превратить все предупреждения в ошибки.
-Werror=
Превратить указанное предупреждение в ошибку. Спецификатор предупреждения добавляется; например, -Werror=switch превращает предупреждения, контролируемые -Wswitch, в ошибки. Этот переключатель имеет отрицательную форму, которая используется для отмены -Werror для определённых предупреждений; например, -Wno-error=switch делает предупреждения -Wswitch не ошибками, даже когда -Werror активен.

Сообщение о предупреждении для каждого управляемого предупреждения включает вариант, который контролирует предупреждение. Этот вариант затем можно использовать с -Werror= и -Wno-error=, как описано выше. (Вывод варианта в сообщении о предупреждении можно отключить, используя флаг -fno-diagnostics-show-option)

Обратите внимание, что указание -Werror=foo автоматически подразумевает -Wfoo. Однако, -Wno-error=foo ничего не подразумевает.

-Wfatal-errors
Этот вариант заставляет компилятор прервать компиляцию при первой ошибке, а не пытаться продолжить и выводить дальнейшие сообщения об ошибках.

Вы можете запросить множество конкретных предупреждений с помощью вариантов, начинающихся с «-W», например, -Wimplicit для запроса предупреждений о неявных объявлениях. Каждый из этих конкретных вариантов предупреждений также имеет отрицательную форму, начинающуюся с «-Wno-», для отключения предупреждений; например, -Wno-implicit. В этом руководстве перечислены только один из двух вариантов, который не является по умолчанию. Для получения дополнительных вариантов, специфичных для языка, также обратитесь к Вариантaм диалекта C++ и Вариантaм диалекта Objective-C и Objective-C++.

Когда запрашивается неизвестный вариант предупреждения (например, -Wunknown-warning), GCC выводит диагностическое сообщение, указывающее, что этот вариант не распознан. Однако, если используется форма -Wno-, поведение немного отличается: диагностическое сообщение для -Wno-unknown-warning не выводится, если не выводятся и другие диагностические сообщения. Это позволяет использовать новые -Wno- варианты со старыми компиляторами, но если что-то пойдёт не так, компилятор предупреждает о наличии нераспознанного варианта.

-Wpedantic
-pedantic
Выдавать все предупреждения, требуемые строгим ISO C и ISO C++; отклонять все программы, использующие запрещённые расширения, и некоторые другие программы, не соответствующие ISO C и ISO C++. Для ISO C следует версии стандарта ISO C, указанной любым параметром -std.

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

-Wpedantic не вызывает предупреждений при использовании альтернативных ключевых слов, имена которых начинаются и заканчиваются символом ‘__’. Предупреждения с повышенной строгостью также отключены в выражении, следующего за __extension__. Однако эти обходные пути следует использовать только для системных заголовочных файлов; программы-приложения должны их избегать. См. Альтернативные ключевые слова.

Некоторые пользователи пытаются использовать -Wpedantic для проверки программ на соответствие строгому стандарту ISO C. Они быстро обнаруживают, что это не совсем то, что им нужно: оно находит некоторые нестандартные практики, но не все — только те, для которых ISO C требует диагностику, и некоторые другие, для которых диагностика была добавлена.

Функция для отслеживания несоответствия стандарту ISO C может быть полезна в некоторых случаях, но потребовала бы значительных дополнительных работ и существенно отличалась бы от -Wpedantic. В ближайшее время мы не планируем поддерживать такую функцию.

Если стандарт, указанный с помощью -std , представляет собой расширенный диалект C от GNU, такой как ‘gnu90’ или ‘gnu99’, существует соответствующий базовый стандарт — версия ISO C, на которой основан расширенный диалект GNU. Предупреждения от -Wpedantic выдаются там, где они требуются базовым стандартом. (Не имеет смысла выдавать такие предупреждения только для функций, отсутствующих в указанном диалекте GNU C, поскольку по определению диалекты GNU C включают все функции, которые компилятор поддерживает с данным параметром, и не было бы ничего, о чем можно было бы предупредить.)

-pedantic-errors
Подобно -Wpedantic, за исключением того, что генерируются ошибки вместо предупреждений.
-Wall
Это включает все предупреждения о конструкциях, которые некоторые пользователи считают сомнительными и которые легко избежать (или изменить, чтобы предотвратить предупреждение), даже в сочетании с макросами. Это также включает некоторые специфичные для языка предупреждения, описанные в Параметрах диалекта C++ и Параметрах диалекта Objective-C и Objective-C++.

-Wall включает следующие флаги предупреждений:

-Waddress   
-Warray-bounds (only with -O2)  
-Wc++11-compat  
-Wchar-subscripts  
-Wenum-compare (in C/ObjC; this is on by default in C++) 
-Wimplicit-int (C and Objective-C only) 
-Wimplicit-function-declaration (C and Objective-C only) 
-Wcomment  
-Wformat   
-Wmain (only for C/ObjC and unless -ffreestanding)  
-Wmaybe-uninitialized 
-Wmissing-braces (only for C/ObjC) 
-Wnonnull  
-Wopenmp-simd 
-Wparentheses  
-Wpointer-sign  
-Wreorder   
-Wreturn-type  
-Wsequence-point  
-Wsign-compare (only in C++)  
-Wstrict-aliasing  
-Wstrict-overflow=1  
-Wswitch  
-Wtrigraphs  
-Wuninitialized  
-Wunknown-pragmas  
-Wunused-function  
-Wunused-label     
-Wunused-value     
-Wunused-variable  
-Wvolatile-register-var

Обратите внимание, что некоторые флаги предупреждений не подразумеваются параметром -Wall. Некоторые из них предупреждают о конструкциях, которые пользователи обычно не считают сомнительными, но иногда вам может потребоваться проверить их; другие предупреждают о конструкциях, которые в некоторых случаях необходимы или сложны для избежания, и нет простого способа изменить код, чтобы подавить предупреждение. Некоторые из них включаются параметром -Wextra, но многие из них должны быть включены индивидуально.

-Wextra
Это включает некоторые дополнительные флаги предупреждений, которые не включены параметром -Wall. (Этот параметр раньше назывался -W. Старое название по-прежнему поддерживается, но новое название более описательное.)
-Wclobbered  
-Wempty-body  
-Wignored-qualifiers 
-Wmissing-field-initializers  
-Wmissing-parameter-type (C only)  
-Wold-style-declaration (C only)  
-Woverride-init  
-Wsign-compare  
-Wtype-limits  
-Wuninitialized  
-Wunused-parameter (only with -Wunused or -Wall) 
-Wunused-but-set-parameter (only with -Wunused or -Wall)
.

Параметр -Wextra также выводит сообщения о предупреждениях в следующих случаях:

  • Указатель сравнивается с целым нулём с помощью ‘<’, ‘<=’, ‘>’ или ‘>=’.
  • (Только C++) Перечисление и неперечисление присутствуют в условном выражении.
  • (Только C++) Неоднозначные виртуальные базовые классы.
  • (Только C++) Индексирование массива, объявленного ‘register’.
  • (Только C++) Получение адреса переменной, объявленной ‘register’.
  • (Только C++) Базовый класс не инициализируется в конструкторе копирования производного класса.
-Wchar-subscripts
Выдавать предупреждение, если индекс массива имеет тип char. Это частая причина ошибок, так как программисты часто забывают, что этот тип на некоторых машинах со знаком. Это предупреждение включается параметром -Wall.
-Wcomment
Выдавать предупреждение всякий раз, когда последовательность начала комментария ‘/*’ появляется в комментарии ‘/*’, или всякий раз, когда появляется обратный слэш-новая строка в комментарии ‘//’. Это предупреждение включается параметром -Wall.
-Wno-coverage-mismatch
Выдавать предупреждение, если профили отзывов не совпадают при использовании параметра -fprofile-use. Если исходный файл изменяется между компиляцией с параметром -fprofile-gen и компиляцией с -fprofile-use, файлы с профилем отзывов могут не совпадать с исходным файлом, и GCC не сможет использовать информацию профиля отзывов. По умолчанию это предупреждение включено и обрабатывается как ошибка. -Wno-coverage-mismatch может быть использован для отключения предупреждения, или -Wno-error=coverage-mismatch может быть использован для отключения ошибки. Отключение ошибки для этого предупреждения может привести к плохо оптимизированному коду и полезно только в случае очень незначительных изменений, таких как исправление ошибок в существующем кодовом базисе. Полное отключение предупреждения не рекомендуется.
-Wno-cpp
(Только для C, Objective-C, C++, Objective-C++ и Fortran)

Подавлять сообщения о предупреждениях, выводимые директивами #warning.

-Wdouble-promotion (Только для C, C++, Objective-C и Objective-C++)
Выдавать предупреждение, когда значение типа float неявно преобразуется в double. ЦП с 32-разрядным "однозначным" плавающим пунктом выполняют float в аппаратном обеспечении, но эмулируют double в программном обеспечении. На такой машине выполнение вычислений с использованием значений double значительно дороже из-за накладных расходов, необходимых для программной эмуляции.

Легко случайно выполнять вычисления с double, потому что литералы с плавающей запятой неявно имеют тип double. Например, в:

float area(float radius)
{
   return 3.14159 * radius * radius;
}

компилятор выполняет все вычисления с double, потому что литерал с плавающей запятой имеет тип double.

-Wformat
-Wformat=n
Проверять вызовы printf и scanf, и т.д., чтобы убедиться, что предоставленные аргументы имеют типы, соответствующие указанной строке формата, и что указанные в строке формата преобразования имеют смысл. Это включает стандартные функции и другие, указанные атрибутами формата (см. Атрибуты функций), в семействах printf, scanf, strftime и strfmon (расширение X/Open, отсутствующее в стандарте C) (или других семействах, специфичных для целевой платформы). Какие функции проверяются без указанных атрибутов формата, зависит от выбранной версии стандарта, и такие проверки функций без указанного атрибута отключаются параметрами -ffreestanding или -fno-builtin.

Форматы проверяются по отношению к функциям формата, поддерживаемым GNU libc версии 2.2. К ним относятся все функции ISO C90 и C99, а также функции из Single Unix Specification и некоторые расширения BSD и GNU. Другие реализации библиотек могут не поддерживать все эти функции; GCC не поддерживает предупреждения о функциях, которые выходят за рамки ограничений конкретной библиотеки. Однако, если -Wpedantic используется с -Wformat, выдаются предупреждения о функциях формата, отсутствующих в выбранной версии стандарта (но не для форматов strfmon, поскольку они не присутствуют ни в одной версии стандарта C). См. Параметры, контролирующие диалект C.

-Wformat=1
-Wformat
Параметр -Wformat эквивалентен -Wformat=1, а -Wno-format эквивалентен -Wformat=0. Поскольку -Wformat также проверяет нулевые аргументы формата для нескольких функций, -Wformat также подразумевает -Wnonnull. Некоторые аспекты этого уровня проверки форматов можно отключить с помощью параметров: -Wno-format-contains-nul, -Wno-format-extra-args, и -Wno-format-zero-length. -Wformat включается параметром -Wall.
-Wno-format-contains-nul
Если указан параметр -Wformat, не выдавать предупреждение о строках формата, содержащих нулевые байты.
-Wno-format-extra-args
Если указан параметр -Wformat, не выдавать предупреждение об избыточных аргументах для функции формата printf или scanf. Стандарт C предусматривает, что такие аргументы игнорируются.

Если неиспользуемые аргументы находятся между используемыми аргументами, указанными с помощью спецификаций номера операнда ‘$’, обычно всё ещё выдаются предупреждения, так как реализация не может знать, какой тип передать функции va_arg для пропуска неиспользуемых аргументов. Однако в случае форматов scanf этот параметр подавляет предупреждение, если все неиспользуемые аргументы являются указателями, так как Single Unix Specification гласит, что такие неиспользуемые аргументы разрешены.

-Wno-format-zero-length
Если указан параметр -Wformat, не выдавать предупреждение о нулевой длине формата. Стандарт C допускает нулевую длину формата.
-Wformat=2
Включить -Wformat плюс дополнительные проверки формата. В настоящее время эквивалентно -Wformat -Wformat-nonliteral -Wformat-security -Wformat-y2k.
-Wformat-nonliteral
Если указан параметр -Wformat, также выдавать предупреждение, если строка формата не является строковым литералом и не может быть проверена, если функция формата не получает аргументы формата как va_list.
-Wformat-security
Если указан параметр -Wformat, также выдавать предупреждение об использовании функций формата, которые представляют возможные проблемы безопасности. В настоящее время это предупреждение о вызовах функций printf и scanf, где строка формата не является строковым литералом и не содержат аргументы формата, как в printf (foo);. Это может быть уязвимостью безопасности, если строка формата получена из ненадежных данных и содержит ‘%n’. (В настоящее время это подмножество того, о чем предупреждает -Wformat-nonliteral, но в будущем к предупреждениям, выдаваемым -Wformat-security, могут быть добавлены предупреждения, которые не включены в -Wformat-nonliteral.)
-Wformat-y2k
Если указан параметр -Wformat, также выдавать предупреждение о форматах strftime, которые могут давать только двузначный год.
-Wnonnull
Предупреждать о передаче нулевого указателя для аргументов, помеченных как требующие ненулевого значения атрибутом функции nonnull.

-Wnonnull включено в -Wall и -Wformat. Его можно отключить с помощью опции -Wno-nonnull.

-Winit-self (Только C, C++, Objective-C и Objective-C++)
Предупреждать об инициализированных переменных, инициализированных самими собой. Обратите внимание, что эта опция может использоваться только с опцией -Wuninitialized.

Например, GCC предупреждает о том, что i не инициализировано в следующем фрагменте кода только при указании -Winit-self:

int f()
{
  int i = i;
  return i;
}

Это предупреждение включено -Wall в C++.

-Wimplicit-int (Только C и Objective-C)
Предупреждать, когда в объявлении не указан тип. Это предупреждение включено -Wall.
-Wimplicit-function-declaration (Только C и Objective-C)
Выводить предупреждение всякий раз, когда функция используется до объявления. В режиме C99 (-std=c99 или -std=gnu99) это предупреждение включено по умолчанию, а в ошибку его преобразует -pedantic-errors. Это предупреждение также включено -Wall.
-Wimplicit (Только C и Objective-C)
То же, что и -Wimplicit-int и -Wimplicit-function-declaration. Это предупреждение включено -Wall.
-Wignored-qualifiers (Только C и C++)
Предупреждать, если тип возвращаемого значения функции имеет квалификатор типа, например, const. Для ISO C такой квалификатор не имеет эффекта, так как значение, возвращаемое функцией, не является lvalue. Для C++, предупреждение выдается только для скалярных типов или void. ISO C запрещает квалифицированные void типы возвращаемых значений в определениях функций, поэтому такие типы возвращаемых значений всегда получают предупреждение даже без этой опции.

Это предупреждение также включено -Wextra.

-Wmain
Предупреждать, если тип «main» подозрителен. «main» должен быть функцией с внешней связью, возвращающей int, принимающей либо ноль аргументов, либо два или три аргумента соответствующих типов. Это предупреждение включено по умолчанию в C++ и включается либо -Wall, либо -Wpedantic.
-Wmissing-braces
Предупреждать, если инициализатор агрегата или объединения не полностью заключен в скобки. В приведенном ниже примере инициализатор для ‘a’ не полностью заключен в скобки, а для ‘b’ — полностью. Это предупреждение включено -Wall в C.
int a[2][2] = { 0, 1, 2, 3 };
int b[2][2] = { { 0, 1 }, { 2, 3 } };

Это предупреждение включено -Wall.

-Wmissing-include-dirs (Только C, C++, Objective-C и Objective-C++)
Предупреждать, если указанная пользователем директория включения не существует.
-Wparentheses
Предупреждать, если скобки опущены в определенных контекстах, таких как при присваивании в контексте, где ожидается логическое значение, или при вложенных операторах, приоритет которых люди часто путают.

Также предупреждать, если появляется сравнение, например, ‘x<=y<=z’; это эквивалентно ‘(x<=y ? 1 : 0) <= z’, что является другим толкованием, отличным от обычных математических обозначений.

Также предупреждать о конструкциях, где может возникнуть путаница, к какой if инструкции относится else ветвь. Вот пример такого случая:

{
  if (a)
    if (b)
      foo ();
  else
    bar ();
}

В C/C++ каждая else ветвь относится к самой внутренней возможной if инструкции, которая в данном примере — if (b). Это часто не то, чего ожидал программист, как показано в приведенном выше примере с использованием отступов, которые выбрал программист. Когда существует потенциальная путаница, GCC выдает предупреждение при указании этого флага. Чтобы устранить предупреждение, добавьте явные фигурные скобки вокруг самой внутренней if инструкции, чтобы не было возможности, что else может относиться к окружающей if. Результирующий код выглядит так:

{
  if (a)
    {
      if (b)
        foo ();
      else
        bar ();
    }
}

Также предупреждать об опасном использовании расширения GNU для ?: с опущенным средним операндом. Когда условие в операторе ?: — логическое выражение, опушенное значение всегда равно 1. Часто программисты ожидают, что это будет значение, вычисляемое внутри условного выражения.

Это предупреждение включено -Wall.

-Wsequence-point
Предупреждать о коде, у которого могут быть неопределенные семантика из-за нарушений правил точек последовательности в стандартах C и C++.

Стандарты C и C++ определяют порядок вычисления выражений в программе C/C++ в терминах точек последовательности, которые представляют частичный порядок между выполнением частей программы: те, которые выполняются до точки последовательности, и те, которые выполняются после нее. Они появляются после вычисления полного выражения (которое не является частью более крупного выражения), после вычисления первого операнда оператора &&, ||, ? : или , (запятой), перед вызовом функции (но после вычисления ее аргументов и выражения, обозначающего вызываемую функцию), и в некоторых других местах. Помимо того, как выражены правила точек последовательности, порядок вычисления подвыражений выражения не определен. Все эти правила описывают только частичный порядок, а не полный порядок, поскольку, например, если две функции вызываются в одном выражении без точки последовательности между ними, порядок вызова функций не определен. Однако комитет стандартов постановил, что вызовы функций не перекрываются.

Не определено, когда между точками последовательности изменения значений объектов вступают в силу. Программы, поведение которых зависит от этого, имеют неопределенное поведение; стандарты C и C++ указывают, что «между предыдущей и следующей точкой последовательности значение объекта должно быть изменено не более одного раза в результате вычисления выражения. Более того, предыдущее значение должно быть прочитано только для определения хранимого значения». Если программа нарушает эти правила, результаты на любой конкретной реализации полностью непредсказуемы.

Примеры кода с неопределенным поведением — a = a++;, a[n] = b[n++] и a[i++] = i;. Некоторые более сложные случаи не диагностируются этой опцией, и она может давать иногда ложноположительные результаты, но в целом она довольно эффективна для обнаружения такого рода проблем в программах.

Стандарт сформулирован запутанно, поэтому существуют некоторые споры о точном значении правил точек последовательности в тонких случаях. Ссылки на обсуждения проблемы, включая предлагаемые формальные определения, можно найти на странице GCC readings на странице http://gcc.gnu.org/readings.html.

Это предупреждение включено -Wall для C и C++.

-Wno-return-local-addr
Не предупреждать о возвращении указателя (или в C++, ссылки) на переменную, область видимости которой выходит за пределы функции после возврата из функции.
-Wreturn-type
Предупреждать всякий раз, когда функция определена с типом возврата, который по умолчанию int. Также предупреждать о любой return инструкции без возвращаемого значения в функции, тип возврата которой не void (выход за пределы тела функции считается возвращением без значения), и об return инструкции с выражением в функции, тип возврата которой void.

Для C++, функция без типа возврата всегда генерирует сообщение об ошибке, даже при указании -Wno-return-type. Исключение составляют ‘main’ и функции, определенные в системных заголовочных файлах.

Это предупреждение включено -Wall.

-Wswitch
Предупреждать всякий раз, когда switch инструкция имеет индекс перечислимого типа и отсутствует case для одного или нескольких именованных кодов этого перечисления. (Наличие метки default предотвращает это предупреждение.) Метки case за пределами диапазона перечисления также вызывают предупреждения при использовании этой опции (даже если есть метка default). Это предупреждение включено -Wall.
-Wswitch-default
Предупреждать всякий раз, когда switch инструкция не имеет default случая.
-Wswitch-enum
Предупреждать всякий раз, когда switch инструкция имеет индекс перечислимого типа и отсутствует case для одного или нескольких именованных кодов этого перечисления. Метки case за пределами диапазона перечисления также вызывают предупреждения при использовании этой опции. Единственное отличие между -Wswitch и этой опцией заключается в том, что эта опция выдает предупреждение об опущенном коде перечисления даже если есть метка default.
-Wsync-nand (Только C и C++)
Предупреждать при использовании встроенных функций __sync_fetch_and_nand и __sync_nand_and_fetch. Эти функции изменили семантику в GCC 4.4.
-Wtrigraphs
Предупреждать, если обнаружены какие-либо триграммы, которые могут изменить смысл программы (триграммы в комментариях не вызывают предупреждения). Это предупреждение включено -Wall.
-Wunused-but-set-parameter
Предупреждать всякий раз, когда параметр функции присваивается, но в противном случае не используется (кроме его объявления).

Чтобы подавить это предупреждение, используйте атрибут ‘unused’ (см. Атрибуты переменных).

Это предупреждение также включено -Wunused вместе с -Wextra.

-Wunused-but-set-variable
Предупреждать всякий раз, когда локальная переменная присваивается, но в противном случае не используется (кроме ее объявления). Это предупреждение включено -Wall.

Чтобы подавить это предупреждение, используйте атрибут ‘unused’ (см. Атрибуты переменных).

Это предупреждение также включено -Wunused, которое включено -Wall.

-Wunused-function
Предупреждать всякий раз, когда статическая функция объявлена, но не определена, или неиспользуемая статическая функция не является встроенной. Это предупреждение включено -Wall.
-Wunused-label
Предупреждать всякий раз, когда метка объявлена, но не используется. Это предупреждение включено -Wall.

Чтобы подавить это предупреждение, используйте атрибут ‘unused’ (см. Атрибуты переменных).

-Wunused-local-typedefs (C, Objective-C, C++ и Objective-C++ только)
Предупреждать, когда typedef, определённый локально в функции, не используется. Это предупреждение включено опцией -Wall.
-Wunused-parameter
Предупреждать всякий раз, когда параметр функции не используется, кроме как в её объявлении.

Чтобы подавить это предупреждение, используйте атрибут ‘unused’ (см. Атрибуты переменных).

-Wno-unused-result
Не выводить предупреждение, если вызывающая функция, помеченная атрибутом warn_unused_result (см. Атрибуты функций), не использует её возвращаемое значение. По умолчанию -Wunused-result.
-Wunused-variable
Предупреждать всякий раз, когда локальная переменная или статическая переменная, не являющаяся константой, не используется, кроме как в её объявлении. Это предупреждение включено опцией -Wall.

Чтобы подавить это предупреждение, используйте атрибут ‘unused’ (см. Атрибуты переменных).

-Wunused-value
Предупреждать всякий раз, когда оператор вычисляет результат, который явно не используется. Чтобы подавить это предупреждение, приведите неиспользуемое выражение к типу ‘void’. Это включает выражение-оператор или левую часть выражения с запятой, не содержащего побочных эффектов. Например, выражение, такое как ‘x[i,j]’, вызывает предупреждение, в то время как ‘x[(void)i,j]’ — нет.

Это предупреждение включено опцией -Wall.

-Wunused
Все вышеперечисленные -Wunused опции объединены.

Чтобы получить предупреждение о параметре функции, который не используется, необходимо либо указать -Wextra -Wunused (обратите внимание, что -Wall подразумевает -Wunused), либо отдельно указать -Wunused-parameter.

-Wuninitialized
Предупреждать, если автоматическая переменная используется без предварительной инициализации или если переменная может быть перезаписана вызовом setjmp. В C++, предупреждать, если нестатическая ссылка или нестатическое ‘const’ член появляется в классе без конструкторов.

Если вы хотите предупреждать о коде, использующем неинициализированное значение переменной в своём инициализаторе, используйте опцию -Winit-self.

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

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

-Wmaybe-uninitialized
Для автоматической переменной, если существует путь от входа в функцию к использованию переменной, которая инициализирована, но существуют и другие пути, для которых переменная не инициализирована, компилятор выдает предупреждение, если не может доказать, что пути с неинициализированными переменными не будут выполнены во время выполнения. Эти предупреждения сделаны необязательными, потому что GCC недостаточно умён, чтобы увидеть все причины, по которым код может быть правильным, несмотря на видимую ошибку. Вот один пример того, как это может произойти:
{
  int x;
  switch (y)
    {
    case 1: x = 1;
      break;
    case 2: x = 4;
      break;
    case 3: x = 5;
    }
  foo (x);
}

Если значение y всегда равно 1, 2 или 3, то x всегда инициализируется, но GCC об этом не знает. Чтобы подавить предупреждение, необходимо предоставить обработчик по умолчанию с assert(0) или подобным кодом.

Эта опция также предупреждает, когда не-volatile автоматическая переменная может быть изменена вызовом longjmp. Эти предупреждения также возможны только в режиме компиляции с оптимизациями.

Компилятор видит только вызовы setjmp. Он не может знать, где будет вызван longjmp; на самом деле, обработчик сигналов может вызвать его в любой точке кода. В результате вы можете получить предупреждение, даже если на самом деле нет проблемы, потому что setjmp фактически не может быть вызван в месте, которое вызвало бы проблему.

Некоторые ложные предупреждения можно избежать, если объявить все используемые функции, которые никогда не возвращают значение, как noreturn. См. Атрибуты функций.

Это предупреждение включено опциями -Wall или -Wextra.

-Wunknown-pragmas
Предупреждать при обнаружении директивы #pragma, которая не поддерживается GCC. Если используется эта опция командной строки, предупреждения выдаются даже для неизвестных пragma в системных заголовочных файлах. Это не так, если предупреждения включены только опцией командной строки -Wall.
-Wno-pragmas
Не выдавать предупреждения о неправильном использовании пragma, таких как неправильные параметры, неверный синтаксис или конфликты между пragma. Также см. -Wunknown-pragmas.
-Wstrict-aliasing
Эта опция активна только при активной опции -fstrict-aliasing. Она предупреждает о коде, который может нарушить строгие правила алиасинга, используемые компилятором для оптимизации. Предупреждение не ловит все случаи, но пытается поймать наиболее распространённые ошибки. Оно включено в -Wall. Оно эквивалентно -Wstrict-aliasing=3
-Wstrict-aliasing=n
Эта опция активна только при активной опции -fstrict-aliasing. Она предупреждает о коде, который может нарушить строгие правила алиасинга, используемые компилятором для оптимизации. Более высокие уровни соответствуют большей точности (меньше ложноположительных результатов). Более высокие уровни также означают больше усилий, аналогично тому, как работает -O. -Wstrict-aliasing эквивалентно -Wstrict-aliasing=3.

Уровень 1: Самый агрессивный, быстрый, наименее точный. Возможно, полезен, когда более высокие уровни не предупреждают, но -fstrict-aliasing всё ещё нарушает код, так как имеет очень мало ложноотрицательных результатов. Однако у него много ложноположительных результатов. Предупреждает обо всех преобразованиях указателей между потенциально несовместимыми типами, даже если они никогда не разыменовываются. Работает только в переднем конце.

Уровень 2: Агрессивный, быстрый, не очень точный. Может по-прежнему иметь много ложноположительных результатов (хотя не так много, как на уровне 1), и мало ложноотрицательных результатов (но, возможно, больше, чем на уровне 1). В отличие от уровня 1, он предупреждает только при взятии адреса. Предупреждает об неполных типах. Работает только в переднем конце.

Уровень 3 (по умолчанию для -Wstrict-aliasing): Должен иметь очень мало ложноположительных и ложноотрицательных результатов. Несколько медленнее, чем уровни 1 или 2, когда включена оптимизация. Обрабатывает распространённый шаблон pun+dereference в переднем конце: *(int*)&some_float. Если оптимизация включена, он также работает в заднем конце, где обрабатывает несколько случаев операторов с использованием информации о ссылках, чувствительной к потоку. Предупреждает только при разыменовании преобразованного указателя. Не предупреждает об неполных типах.

-Wstrict-overflow
-Wstrict-overflow=n
Эта опция активна только при активной опции -fstrict-overflow. Она предупреждает о случаях, когда компилятор оптимизирует, исходя из предположения, что переполнение со знаком не происходит. Обратите внимание, что она не предупреждает обо всех случаях, когда код может переполниться: она предупреждает только о случаях, когда компилятор выполняет оптимизацию. Таким образом, это предупреждение зависит от уровня оптимизации.

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

-Wstrict-overflow=1
Предупреждать о случаях, которые вызывают сомнения и легко избегаются. Например, с -fstrict-overflow, компилятор упрощает x + 1 > x до 1. Этот уровень -Wstrict-overflow включён -Wall; более высокие уровни нет и их необходимо запросить явно.
-Wstrict-overflow=2
Также предупреждать о других случаях, когда сравнение упрощается до константы. Например: abs (x) >= 0. Это можно упростить только тогда, когда -fstrict-overflow эффективно, потому что abs (INT_MIN) переполняется до INT_MIN, что меньше нуля. -Wstrict-overflow (без уровня) то же самое, что -Wstrict-overflow=2.
-Wstrict-overflow=3
Также предупреждать о других случаях, когда сравнение упрощается. Например: x + 1 > 1 упрощается до x > 0.
-Wstrict-overflow=4
Также предупреждать о других упрощениях, не покрытых вышеперечисленными случаями. Например: (x * 10) / 5 упрощается до x * 2.
-Wstrict-overflow=5
Также предупреждать о случаях, когда компилятор уменьшает значение константы, участвующей в сравнении. Например: x + 2 > y упрощается до x + 1 >= y. Об этом сообщается только на самом высоком уровне предупреждений, потому что это упрощение применяется к множеству сравнений, поэтому этот уровень предупреждений даёт очень большое количество ложноположительных результатов.
-Wsuggest-attribute=[pure|const|noreturn|format]
Предупреждать в случаях, когда добавление атрибута может быть полезным. Атрибуты, которые в настоящее время поддерживаются, перечислены ниже.
-Wsuggest-attribute=pure
-Wsuggest-attribute=const
-Wsuggest-attribute=noreturn
Предупреждать о функциях, которые могут быть кандидатами для атрибутов pure, const или noreturn. Компилятор предупреждает только о функциях, видимых в других единицах компиляции, или (в случае pure и const) если он не может доказать, что функция возвращает нормально. Функция возвращает нормально, если она не содержит бесконечного цикла или не возвращает аномально, выбрасывая исключение, вызывая abort() или перехватывая исключение. Для этого анализа требуется опция -fipa-pure-const, которая включена по умолчанию начиная с -O и выше. Более высокие уровни оптимизации повышают точность анализа.
-Wsuggest-attribute=format
-Wmissing-format-attribute
Предупреждать о указателях на функции, которые могут быть кандидатами для атрибутов format. Обратите внимание, что это только возможные кандидаты, а не абсолютные. GCC предполагает, что указатели на функции с атрибутами format, которые используются в операциях присваивания, инициализации, передаче параметров или возвращаемого значения, должны иметь соответствующий атрибут format в результирующем типе. То есть левая часть присваивания или инициализации, тип переменной параметра или тип возвращаемого значения содержащей функции, соответственно, также должны иметь атрибут format для предотвращения предупреждения.

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

-Warray-bounds
Эта опция активна только тогда, когда активна опция -ftree-vrp (по умолчанию для -O2 и выше). Она предупреждает о индексах массивов, которые всегда выходят за пределы. Это предупреждение включено опцией -Wall.
-Wno-div-by-zero
Не выдавать предупреждение о целочисленном делении на ноль во время компиляции. Предупреждение не выдаётся о делении с плавающей точкой на ноль, так как оно может быть законным способом получения бесконечности и NaN.
-Wsystem-headers
Выводить сообщения о предупреждениях для конструкций, найденных в системных заголовочных файлах. Предупреждения из системных заголовочных файлов обычно подавляются, исходя из предположения, что они обычно не указывают на реальные проблемы и только усложняют вывод компилятора. Использование этой командной строки говорит GCC о том, что он должен выводить предупреждения из системных заголовочных файлов так, как будто они произошли в пользовательском коде. Однако обратите внимание, что использование -Wall в сочетании с этой опцией не предупреждает о неизвестных препроцессорных директивах в системных заголовочных файлах — для этого необходимо также использовать -Wunknown-pragmas.
-Wtrampolines
Предупреждать о тремполинах, сгенерированных для указателей на вложенные функции.

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

-Wfloat-equal
Предупреждать, если значения с плавающей точкой используются в сравнениях на равенство.

Идея заключается в том, что иногда удобно (для программиста) рассматривать значения с плавающей точкой как приближения к бесконечно точным вещественным числам. Если вы это делаете, то вам нужно вычислить (путем анализа кода или каким-то другим способом) максимальную или предполагаемую максимальную ошибку, которую вносит вычисление, и учесть её при выполнении сравнений (и при формировании вывода, но это другая проблема). В частности, вместо проверки на равенство, вы должны проверить, пересекаются ли диапазоны двух значений; и это делается с помощью операторов сравнения, поэтому сравнения на равенство, вероятно, ошибочны.

-Wtraditional (Только для C и Objective-C)
Предупреждать о некоторых конструкциях, которые ведут себя по-разному в традиционном и ISO C. Также предупреждать о конструкциях ISO C, которые не имеют эквивалента в традиционном C, и/или проблемных конструкциях, которых следует избегать.
  • Параметры макроса, которые появляются внутри строковых литералов в теле макроса. В традиционном C замена макроса происходит внутри строковых литералов, но в ISO C этого не происходит.
  • В традиционном C некоторые препроцессорные директивы не существовали. Традиционные препроцессоры считали строку директивой только если ‘#’ появлялась в первом столбце строки. Поэтому -Wtraditional предупреждает о директивах, которые понимает традиционный C, но игнорирует, потому что ‘#’ не появляется как первый символ в строке. Также предлагается скрыть директивы, такие как ‘#pragma’, не понимаемые традиционным C, путем их отступа. Некоторые традиционные реализации не распознают ‘#elif’, поэтому эта опция предлагает полностью избежать её.
  • Функциональное макрос без аргументов.
  • Унарный оператор плюс.
  • Целочисленный постфикс ‘U’, или плавающие постфиксы ‘F’ или ‘L’. (Традиционный C поддерживает постфикс ‘L’ для целочисленных констант.) Обратите внимание, что эти постфиксы встречаются в макросах, определенных в системных заголовочных файлах большинства современных систем, например, макросы ‘_MIN’/‘_MAX’ в <limits.h>. Использование этих макросов в пользовательском коде обычно приводит к ложным предупреждениям, однако встроенный препроцессор GCC имеет достаточный контекст, чтобы избежать предупреждения в этих случаях.
  • Функция, объявленная внешней в одном блоке, а затем используемая после конца блока.
  • У оператора switch операнд типа long.
  • Объявление функции, не являющейся static, следует за static. Эта конструкция не поддерживается некоторыми традиционными компиляторами C.
  • ISO-тип целочисленной константы имеет другую ширину или знаковый тип, чем её традиционный тип. Это предупреждение выдается только если основание константы равно десяти. То есть шестнадцатеричные или восьмеричные значения, которые обычно представляют битовые шаблоны, не вызывают предупреждения.
  • Обнаружено использование ISO-конкатенации строк.
  • Инициализация автоматических агрегатов.
  • Конфликт идентификатора с метками. Традиционный C не имеет отдельного пространства имён для меток.
  • Инициализация объединений. Если инициализатор равен нулю, предупреждение опущено. Это делается с предположением, что нулевой инициализатор в пользовательском коде обусловлен, например, __STDC__ для предотвращения пропуска предупреждений об инициализаторах и полагается на значения по умолчанию, равные нулю, в случае традиционного C.
  • Преобразования через прототипы между значениями с фиксированной/плавающей точкой и наоборот. Отсутствие этих прототипов при компиляции с традиционным C приводит к серьёзным проблемам. Это подмножество возможных предупреждений о преобразованиях; для полного набора используйте -Wtraditional-conversion.
  • Использование определений функций в стиле ISO C. Это предупреждение намеренно не выдается для объявлений прототипов или функций с переменным числом аргументов, потому что эти возможности ISO C появляются в вашем коде при использовании традиционных макросов совместимости C из библиотек PARAMS и VPARAMS. Это предупреждение также пропускается для вложенных функций, так как эта функция уже является расширением GCC и, следовательно, не относится к совместимости с традиционным C.
-Wtraditional-conversion (Только для C и Objective-C)
Предупреждать, если прототип приводит к преобразованию типа, которое отличается от того, что произошло бы с тем же аргументом в отсутствие прототипа. Это включает преобразования от фиксированной точки к плавающей и наоборот, и преобразования, изменяющие ширину или знаковый тип аргумента с фиксированной точкой, за исключением случаев, когда это совпадает с преобразованием по умолчанию.
-Wdeclaration-after-statement (Только для C и Objective-C)
Предупреждать, когда объявление находится после оператора в блоке. Эта конструкция, известная из C++, была введена с ISO C99 и по умолчанию разрешена в GCC. Она не поддерживается ISO C90 и не поддерживалась версиями GCC до GCC 3.0. См. Смешанные объявления.
-Wundef
Предупреждать, если неопределённый идентификатор оценивается в директиве ‘#if’.
-Wno-endif-labels
Не выдавать предупреждение, когда ‘#else’ или ‘#endif’ следуют за текстом.
-Wshadow
Предупреждать всякий раз, когда локальная переменная или объявление типа затеняют другую переменную, параметр, тип или член класса (в C++), или когда затеняется встроенная функция. Обратите внимание, что в C++, компилятор предупреждает, если локальная переменная затеняет явный typedef, но не если она затеняет struct/class/enum.
-Wlarger-than=len
Предупреждать всякий раз, когда определяется объект размером более len байтов.
-Wframe-larger-than=len
Предупреждать, если размер стековой рамки функции больше, чем len байтов. Вычисления, выполняемые для определения размера стековой рамки, приблизительны и не консервативны. Фактические требования могут быть несколько больше, чем len, даже если предупреждение не выдаётся. Кроме того, любая память, выделенная с помощью alloca, массивов переменной длины или похожих конструкций, не включается компилятором при определении того, выдавать ли предупреждение.
-Wno-free-nonheap-object
Не выдавать предупреждение при попытке освободить объект, который не был выделен в куче.
-Wstack-usage=len
Предупреждать, если использование стека функцией может быть больше, чем len байтов. Вычисления, выполняемые для определения использования стека, консервативны. Любая память, выделенная с помощью alloca, массивов переменной длины или подобных конструкций, включается компилятором при определении того, выдавать ли предупреждение.

Сообщение соответствует выводу -fstack-usage.

  • Если использование стека полностью статичное, но превышает указанное значение, это:
    warning: stack usage is 1120 bytes
  • Если использование стека (частично) динамическое, но ограниченное, это:
    warning: stack usage might be 1648 bytes
  • Если использование стека (частично) динамическое и неограниченное, это:
    warning: stack usage might be unbounded
-Wunsafe-loop-optimizations
Предупреждать, если цикл нельзя оптимизировать, так как компилятор не может сделать предположений о границах индексов цикла. С помощью -funsafe-loop-optimizations предупреждать, если компилятор делает такие предположения.
-Wno-pedantic-ms-format (Только для целей MinGW)
При использовании в сочетании с -Wformat и -pedantic без расширений GNU, этот параметр отключает предупреждения о спецификаторах формата ширины printf / scanf вне ISO I32, I64, и I используемых на целевых платформах Windows, которые зависят от среды выполнения MS.
-Wpointer-arith
Предупреждать о любых зависимостях от «размера» типа функции или типа void. GNU C присваивает этим типам размер 1 для удобства в расчетах с указателями на void * и указателями на функции. В C++, также предупреждать, когда арифметическое выражение включает в себя NULL. Это предупреждение также включается параметром -Wpedantic.
-Wtype-limits
Предупреждать, если сравнение всегда истинно или всегда ложно из-за ограниченного диапазона типа данных, но не предупреждать для константных выражений. Например, предупреждать, если беззнаковое переменная сравнивается с нулём с помощью ‘<’ или ‘>=’. Это предупреждение также включается параметром -Wextra.
-Wbad-function-cast (Только для C и Objective-C)
Предупреждать всякий раз, когда вызов функции приводится к несоответствующему типу. Например, предупреждать, если int malloc() приводится к anything *.
-Wc++-compat (Только для C и Objective-C)
Предупреждать об конструкциях ISO C, которые выходят за рамки общего подмножества ISO C и ISO C++, например, запрос на неявное преобразование из void * в указатель на не-void тип.
-Wc++11-compat (Только для C++ и Objective-C++)
Предупреждать о конструкциях C++, чьё значение отличается между ISO C++ 1998 и ISO C++ 2011, например, идентификаторы в ISO C++ 1998, которые являются ключевыми словами в ISO C++ 2011. Это предупреждение включает -Wnarrowing и включается параметром -Wall.
-Wcast-qual
Предупреждать всякий раз, когда указатель приводится к типу, из которого удалено квалификатор типа. Например, предупреждать, если const char * приводится к обычному char *.

Также предупреждать при приведении, которое добавляет квалификатор типа небезопасным образом. Например, приведение char ** к const char ** небезопасно, как в этом примере:

/* p is char ** value.  */
const char **q = (const char **) p;
/* Assignment of readonly string to const char * is OK.  */
*q = "string";
/* Now char** pointer points to read-only memory.  */
**p = 'b';
-Wcast-align
Предупреждать всякий раз, когда указатель приводится так, что требуется выравнивание целевого типа увеличивается. Например, предупреждать, если char * приводится к int * на машинах, где к целым числам можно получить доступ только на границах в два или четыре байта.
-Wwrite-strings
При компиляции C, присваивать строковым константам тип const char[длина], чтобы копирование адреса одной в не-const char * указатель выдавало предупреждение. Эти предупреждения помогают найти код, который может попытаться записать в строковую константу во время компиляции, но только если вы очень осторожны с использованием const в объявлениях и прототипах. В противном случае, это просто раздражение. Именно поэтому мы не заставляем -Wall запрашивать эти предупреждения.

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

-Wclobbered
Предупреждать о переменных, которые могут быть изменены ‘longjmp’ или ‘vfork’. Это предупреждение также включается параметром -Wextra.
-Wconditionally-supported (Только для C++ и Objective-C++)
Предупреждать о конструкциях, которые условно поддерживаются (C++11 [intro.defs]).
-Wconversion
Предупреждать об неявных преобразованиях, которые могут изменить значение. Это включает в себя преобразования между вещественными и целыми числами, такие как abs (x), когда x является double; преобразования между знаковыми и беззнаковыми, такие как unsigned ui = -1; и преобразования в типы меньшего размера, такие как sqrtf (M_PI). Не предупреждать для явных приведений, таких как abs ((int) x) и ui = (unsigned) -1, или если значение не изменяется преобразованием, как в abs (2.0). Предупреждения о преобразованиях между знаковыми и беззнаковыми целыми числами могут быть отключены с помощью -Wno-sign-conversion.

Для C++, также предупреждать о путанице в разрешении перегрузки для пользовательских преобразований; и преобразования, которые никогда не используют оператор преобразования типов: преобразования к void, тому же типу, базовому классу или ссылке на них. Предупреждения о преобразованиях между знаковыми и беззнаковыми целыми числами отключены по умолчанию в C++, если -Wsign-conversion не включено явно.

-Wno-conversion-null (Только для C++ и Objective-C++)
Не предупреждать о преобразованиях между NULL и не-указателями типов. -Wconversion-null включено по умолчанию.
-Wzero-as-null-pointer-constant (Только для C++ и Objective-C++)
Предупреждать, когда литерал '0' используется в качестве константы нулевого указателя. Это может быть полезно для облегчения перехода к nullptr в C++11.
-Wdate-time
Предупреждать, когда встречаются макросы __TIME__, __DATE__ или __TIMESTAMP__, так как они могут помешать битово-тождественным воспроизводимым компиляциям.
-Wdelete-incomplete (Только для C++ и Objective-C++)
Предупреждать при удалении указателя на неполный тип, что может привести к неопределённому поведению во время выполнения. Это предупреждение включено по умолчанию.
-Wuseless-cast (Только для C++ и Objective-C++)
Предупреждать, когда выражение приводится к его собственному типу.
-Wempty-body
Предупреждать, если пустой блок встречается в операторе ‘if’, ‘else’ или ‘do while’. Это предупреждение также включается параметром -Wextra.
-Wenum-compare
Предупреждать о сравнении значений разных перечислимых типов. В C++ несоответствия перечислимых типов в условных выражениях также диагностируются, и предупреждение включено по умолчанию. В C это предупреждение включено параметром -Wall.
-Wjump-misses-init (Только для C и Objective-C)
Предупреждать, если оператор goto или оператор switch перепрыгивает вперёд через инициализацию переменной или назад к метке после инициализации переменной. Это предупреждает только о переменных, которые инициализируются при объявлении. Это предупреждение поддерживается только для C и Objective-C; в C++ этот тип ветвления является ошибкой в любом случае.

-Wjump-misses-init включено в -Wc++-compat. Его можно отключить с помощью параметра -Wno-jump-misses-init.

-Wsign-compare
Предупреждать, когда сравнение между знаковыми и беззнаковыми значениями может привести к некорректному результату при преобразовании знакового значения в беззнаковое. Это предупреждение также включается параметром -Wextra; чтобы получить другие предупреждения -Wextra без этого предупреждения, используйте -Wextra -Wno-sign-compare.
-Wsign-conversion
Предупреждать о неявных преобразованиях, которые могут изменить знак целочисленного значения, например, присваивание знакового целочисленного выражения беззнаковой целочисленной переменной. Явное приведение отключает предупреждение. В C, этот параметр также включён -Wconversion.
-Wfloat-conversion
Предупреждать о неявных преобразованиях, которые могут уменьшить точность вещественного значения. Это включает в себя преобразования из вещественного в целое число, и от вещественного с большей точностью к вещественному с меньшей точностью. Этот параметр также включён -Wconversion.
-Wsizeof-pointer-memaccess
Предупреждать о подозрительных параметрах длины для определённых строковых и встроенных функций памяти, если аргумент использует sizeof. Это предупреждение, например, о memset (ptr, 0, sizeof (ptr)); если ptr не массив, а указатель, и предлагает возможную правку, или о memcpy (&foo, ptr, sizeof (&foo));. Это предупреждение включается параметром -Wall.
-Waddress
Предупреждать о подозрительных использованиях адресов памяти. Включает использование адреса функции в условном выражении, например, void func(void); if (func), и сравнения с адресом памяти строкового литерала, например, if (x == "abc"). Такие использования обычно указывают на ошибку программиста: адрес функции всегда оценивается как истинное, поэтому их использование в условном выражении обычно означает, что программист забыл скобки в вызове функции; и сравнения со строковыми литералами приводят к неопределённому поведению и не являются переносимыми в C, поэтому они обычно означают, что программист хотел использовать strcmp. Это предупреждение включается параметром -Wall.
-Wlogical-op
Предупреждать о подозрительных использованиях логических операторов в выражениях. Включает использование логических операторов в контекстах, где ожидается битовый оператор.
-Waggregate-return
Предупреждать, если любые функции, возвращающие структуры или объединения, определены или вызваны. (В языках, где вы можете вернуть массив, это также вызывает предупреждение.)
-Wno-aggressive-loop-optimizations
Предупреждать, если в цикле с постоянным числом итераций компилятор обнаруживает неопределённое поведение в каком-либо операторе во время одной или нескольких итераций.
-Wno-attributes
Не предупреждать, если используется неожиданное __attribute__, такое как нераспознанные атрибуты, атрибуты функций, применённые к переменным и т. д. Это не останавливает ошибки из-за неправильного использования поддерживаемых атрибутов.
-Wno-builtin-macro-redefined
Не предупреждать, если определённые встроенные макросы переопределяются. Это подавляет предупреждения о переопределении __TIMESTAMP__, __TIME__, __DATE__, __FILE__, и __BASE_FILE__.
-Wstrict-prototypes (Только для C и Objective-C)
Предупреждать, если функция объявлена или определена без указания типов аргументов. (Определение функции старого стиля разрешено без предупреждения, если ему предшествует объявление, которое указывает типы аргументов.)
-Wold-style-declaration (Только для C и Objective-C)
Предупреждать об устаревших использованиях, согласно стандарту C, в объявлении. Например, предупреждать, если спецификаторы класса хранения, такие как static, не являются первыми элементами в объявлении. Это предупреждение также включается параметром -Wextra.
-Wold-style-definition (Только для C и Objective-C)
Предупреждение, если используется старое определение функции. Предупреждение выдаётся даже при наличии предыдущего прототипа.
-Wmissing-parameter-type (Только для C и Objective-C)
Параметр функции объявлен без указания типа в функциях в стиле K&R:
void foo(bar) { }

Это предупреждение также включается с помощью -Wextra.

-Wmissing-prototypes (Только для C и Objective-C)
Предупреждение, если глобальная функция определена без предварительного объявления прототипа. Это предупреждение выдаётся даже если само определение предоставляет прототип. Используйте этот параметр для обнаружения глобальных функций, у которых нет соответствующего объявления прототипа в заголовочном файле. Этот параметр недействителен для C++, так как все объявления функций предоставляют прототипы, а несоответствующее объявление будет объявлять перегрузку, а не конфликтовать с более ранним объявлением. Для обнаружения отсутствующих объявлений в C++ используйте -Wmissing-declarations.
-Wmissing-declarations
Предупреждение, если в инициализаторе структуры отсутствуют некоторые поля. Например, следующий код вызывает такое предупреждение, потому что x.h неявно равно нулю:
struct s { int f, g, h; };
struct s x = { 3, 4 };

Этот параметр не предупреждает об инициализаторах с указанием поля, поэтому следующая модификация не вызовет предупреждения:

struct s { int f, g, h; };
struct s x = { .f = 3, .g = 4 };

Это предупреждение включено в -Wextra. Чтобы получить другие -Wextra предупреждения без этого, используйте -Wextra -Wno-missing-field-initializers.

-Wno-multichar
Не выводить предупреждение, если используется многосимвольный константный символ (‘'FOOF'’). Обычно они указывают на ошибку в коде пользователя, так как имеют значения, определяемые реализацией, и не должны использоваться в переносимом коде.
-Wnormalized=<none|id|nfc|nfkc>
В стандартах ISO C и ISO C++ два идентификатора отличаются, если они представляют собой разные последовательности символов. Однако иногда, когда используются символы за пределами основного набора ASCII, у вас могут быть две разные последовательности символов, которые выглядят одинаково. Чтобы избежать путаницы, стандарт ISO 10646 устанавливает некоторые правила нормализации, которые, когда применяются, гарантируют, что две последовательности, которые выглядят одинаково, преобразуются в одну и ту же последовательность. GCC может предупреждать вас, если вы используете идентификаторы, которые не были нормализованы; этот параметр контролирует это предупреждение.

GCC поддерживает четыре уровня предупреждений. По умолчанию это -Wnormalized=nfc, которое предупреждает об идентификаторах, не находящихся в нормализованной форме «C» ISO 10646, NFC. NFC — рекомендуемая форма для большинства случаев.

К сожалению, в идентификаторах, разрешенных ISO C и ISO C++, есть некоторые символы, которые, когда они переводятся в NFC, не допускаются в качестве идентификаторов. То есть нет способа использовать эти символы в переносимом ISO C или C++ и иметь все ваши идентификаторы в NFC. -Wnormalized=id подавляет предупреждение для этих символов. Надеемся, что будущие версии этих стандартов исправят это, поэтому этот параметр не является по умолчанию.

Вы можете отключить предупреждение для всех символов, написав -Wnormalized=none. Вы должны это делать только в том случае, если вы используете какую-либо другую схему нормализации (например, «D»), так как в противном случае вы легко можете создать ошибки, которые буквально невозможно увидеть.

Некоторые символы в ISO 10646 имеют разные значения, но выглядят идентично в некоторых шрифтах или методах отображения, особенно после применения форматирования. Например, \u207F, «верхний индекс латинская малая буква n», отображается так же, как обычная n с верхним индексом. ISO 10646 определяет схему нормализации NFKC для преобразования всех их в стандартную форму, и GCC предупреждает, если ваш код не находится в NFKC, если вы используете -Wnormalized=nfkc. Это предупреждение сопоставимо с предупреждением о каждом идентификаторе, содержащем букву O, потому что она может быть спутана с цифрой 0, и поэтому не является по умолчанию, но может быть полезным локальным соглашением программирования, если среду программирования нельзя настроить так, чтобы эти символы отображались различимо.

-Wno-deprecated
Не выводить предупреждение об использовании устаревших функций. См. Устаревшие функции.
-Wno-deprecated-declarations
Не выводить предупреждение об использовании функций (см. Атрибуты функций), переменных (см. Атрибуты переменных) и типов (см. Атрибуты типов), помеченных как устаревшие с помощью атрибута deprecated.
-Wno-overflow
Не выводить предупреждение о переполнении в выражениях во время компиляции.
-Wopenmp-simd
Выводить предупреждение, если модель затрат векторного процессора переопределяет директивы simd OpenMP или Cilk Plus, заданные пользователем. -fsimd-cost-model=unlimited может быть использована для смягчения модели затрат.
-Woverride-init (Только для C и Objective-C)
Предупреждение, если инициализированное поле без побочных эффектов переопределяется при использовании инициализаторов с указанием поля (см. Инициализаторы с указанием поля).

Это предупреждение включено в -Wextra. Чтобы получить другие -Wextra предупреждения без этого, используйте -Wextra -Wno-override-init.

-Wpacked
Предупреждение, если структуре задан атрибут packed, но этот атрибут не оказывает влияния на расположение или размер структуры. Такие структуры могут быть неверно выровнены без особой пользы. Например, в этом коде переменная f.x в struct bar неверно выровнена, даже если struct bar сам по себе не имеет атрибута packed:
struct foo {
  int x;
  char a, b, c, d;
} __attribute__((packed));
struct bar {
  char z;
  struct foo f;
};
-Wpacked-bitfield-compat
Серии GCC 4.1, 4.2 и 4.3 игнорируют атрибут packed для полей-битов типа char. Это было исправлено в GCC 4.4, но это изменение может привести к различиям в структуре расположения. GCC информирует вас, когда смещение такого поля изменилось в GCC 4.4. Например, больше нет 4-битового заполнения между полем a и b в этой структуре:
struct foo
{
  char a:4;
  char b:8;
} __attribute__ ((packed));

Это предупреждение включено по умолчанию. Используйте -Wno-packed-bitfield-compat для отключения этого предупреждения.

-Wpadded
Предупреждение, если в структуре включено заполнение, либо для выравнивания элемента структуры, либо для выравнивания всей структуры. Иногда в таких случаях можно переупорядочить поля структуры, чтобы уменьшить заполнение и сделать структуру меньше.
-Wredundant-decls
Предупреждение, если что-либо объявлено более одного раза в одном и том же области видимости, даже в тех случаях, когда множественное объявление допустимо и ничего не меняет.
-Wnested-externs (Только для C и Objective-C)
Предупреждение, если встречается объявление extern внутри функции.
-Wno-inherited-variadic-ctor
Подавление предупреждений об использовании наследования конструкторов C++11, когда у базового класса, унаследованного от него, есть конструктор с переменным числом аргументов; предупреждение включено по умолчанию, так как многоточие не наследуется.
-Winline
Предупреждение, если функция, объявленная как inline, не может быть вставлена. Даже с этим параметром компилятор не предупреждает о неудачах при вставке функций, объявленных в системных заголовочных файлах.

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

-Wno-invalid-offsetof (Только для C++ и Objective-C++)
Подавление предупреждений при применении макроса ‘offsetof’ к типу, не являющемуся POD. Согласно стандарту ISO C++ 1998, применение ‘offsetof’ к типу, не являющемуся POD, неопределено. Однако в существующих реализациях C++ ‘offsetof’ обычно даёт осмысленные результаты даже при применении к определённым видам типов, не являющихся POD (например, к простому типу ‘struct’, который не является типом POD только благодаря наличию конструктора). Этот флаг предназначен для пользователей, которые знают, что пишут непереносимый код, и которые намеренно решили игнорировать предупреждение об этом.

Ограничения на ‘offsetof’ могут быть ослаблены в будущей версии стандарта C++.

-Wno-int-to-pointer-cast
Подавление предупреждений при приведении к типу указателя целого числа другого размера. В C++ приведение к типу указателя меньшего размера является ошибкой. Wint-to-pointer-cast включено по умолчанию.
-Wno-pointer-to-int-cast (Только для C и Objective-C)
Подавление предупреждений при приведении указателя к целочисленному типу другого размера.
-Winvalid-pch
Предупреждение, если прекомпилированный заголовок (см. Прекомпилированные заголовки) найден в пути поиска, но не может быть использован.
-Wlong-long
Предупреждение, если используется тип ‘long long’. Это включено либо -Wpedantic, либо -Wtraditional в режимах ISO C90 и C++98. Чтобы запретить предупреждения, используйте -Wno-long-long.
-Wvariadic-macros
Предупреждение при сомнительном использовании макросов для обработки переменного числа аргументов, таких как ‘va_start’. Это значение по умолчанию. Для отключения предупреждений используйте -Wno-variadic-macros.
-Wvarargs
Предупреждение при сомнительном использовании макросов для обработки переменного числа аргументов, таких как ‘va_start’. Это значение по умолчанию. Чтобы запретить предупреждения, используйте -Wno-varargs.
-Wvector-operation-performance
Предупреждение, если векторная операция не реализована с помощью возможностей SIMD архитектуры. В основном полезно для оптимизации производительности. Векторная операция может быть реализована piecewise, что означает, что скалярная операция выполняется для каждого элемента вектора; in parallel, что означает, что векторная операция реализована с использованием скаляров более широкого типа, что обычно более эффективно с точки зрения производительности; и as a single scalar, что означает, что вектор помещается в скалярный тип.
-Wno-virtual-move-assign
Предупреждение о наследовании от виртуального базового класса с нетривиальным оператором перемещения C++11. Это опасно, потому что если виртуальный базовый класс достижим по нескольким путям, он будет перемещён несколько раз, что может означать, что оба объекта окажутся в состоянии перемещения. Если оператор перемещения написан так, чтобы избегать перемещения из перемещённого объекта, это предупреждение можно отключить.
-Wvla
Выдавать предупреждение, если в коде используется массив переменной длины. -Wno-vla предотвращает предупреждение -Wpedantic о массиве переменной длины.
-Wvolatile-register-var
Выдавать предупреждение, если регистровая переменная объявлена как volatile. Модификатор volatile не препятствует всем оптимизациям, которые могут устранять чтение и/или запись в регистровые переменные. Это предупреждение включено -Wall.
-Wdisabled-optimization
Предупреждение, если запрошенный этап оптимизации отключён. Это предупреждение обычно не указывает на наличие ошибок в вашем коде; оно просто указывает, что оптимизаторы GCC не могут эффективно обработать код. Часто проблема заключается в том, что ваш код слишком большой или слишком сложный; GCC отказывается оптимизировать программы, когда сама оптимизация, вероятно, займёт чрезмерно много времени.
-Wpointer-sign (только для C и Objective-C)
Предупреждение о передаче или присваивании аргумента указателя с разным знаком. Этот параметр поддерживается только для C и Objective-C. Он подразумевается -Wall и -Wpedantic, которые можно отключить с помощью -Wno-pointer-sign.
-Wstack-protector
Этот параметр активен только при активном -fstack-protector. Он предупреждает о функциях, которые не защищены от переполнения стека.
-Woverlength-strings
Предупреждение о строковых константах, длина которых превышает минимальную максимальную длину, указанную в стандарте C. Современные компиляторы обычно позволяют использовать строковые константы, длина которых намного больше минимального предела стандарта, но очень переносимые программы должны избегать использования более длинных строк.

Предел применяется после конкатенации строковых констант и не учитывает заключительный символ NUL. В C90 предел составлял 509 символов; в C99 он был увеличен до 4095. C++98 не определяет нормативный минимальный максимум, поэтому мы не диагностируем слишком длинные строки в C++.

Этот параметр подразумевается -Wpedantic, и его можно отключить с помощью -Wno-overlength-strings.

-Wunsuffixed-float-constants (только для C и Objective-C)
Выдавать предупреждение для любой плавающей константы, у которой нет суффикса. В сочетании с -Wsystem-headers он предупреждает о таких константах в системных заголовочных файлах. Это может быть полезно при подготовке кода для использования с FLOAT_CONST_DECIMAL64 pragma из расширения десятичных чисел с плавающей точкой для C99.

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-4.9.4/gcc/Warning-Options.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API