Spec-Zone.ru › GCC 6

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. В данном руководстве приводится только одна из двух форм, которая не является по умолчанию. Для получения дополнительных параметров, специфичных для языка, также обратитесь к Параметрам диалекта C++ и Параметрам диалекта Objective-C и Objective-C++.

Некоторые параметры, такие как -Wall и -Wextra, включают другие параметры, такие как -Wunused, которые могут включать дополнительные параметры, такие как -Wunused-value. Комбинированное действие положительных и отрицательных форм заключается в том, что более специфические параметры имеют приоритет над менее специфическими, независимо от их положения в командной строке. Для параметров одинаковой специфичности действует последний параметр. Параметры, включенные или отключенные с помощью директив (см. Директивы диагностики), действуют так, как будто они появились в конце командной строки.

Если запрашивается неизвестный параметр предупреждения (например, -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) требует диагностики, в некоторых случаях, когда происходит неопределённое поведение во время компиляции, и в некоторых других случаях, которые не препятствуют компиляции программ, которые являются валидными в соответствии со стандартом. Это не эквивалентно -Werror=pedantic, поскольку есть ошибки, включённые этим параметром, но не включённые последним, и наоборот.

-Wall

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

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

-Waddress   
-Warray-bounds=1 (only with -O2)  
-Wbool-compare  
-Wc++11-compat  -Wc++14-compat
-Wchar-subscripts  
-Wcomment  
-Wenum-compare (in C/ObjC; this is on by default in C++) 
-Wformat   
-Wimplicit (C and Objective-C only) 
-Wimplicit-int (C and Objective-C only) 
-Wimplicit-function-declaration (C and Objective-C only) 
-Winit-self (only for C++) 
-Wlogical-not-parentheses
-Wmain (only for C/ObjC and unless -ffreestanding)  
-Wmaybe-uninitialized 
-Wmemset-transposed-args 
-Wmisleading-indentation (only for C/C++) 
-Wmissing-braces (only for C/ObjC) 
-Wnarrowing (only for C++)  
-Wnonnull  
-Wnonnull-compare  
-Wopenmp-simd 
-Wparentheses  
-Wpointer-sign  
-Wreorder   
-Wreturn-type  
-Wsequence-point  
-Wsign-compare (only in C++)  
-Wsizeof-pointer-memaccess 
-Wstrict-aliasing  
-Wstrict-overflow=1  
-Wswitch  
-Wtautological-compare  
-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 (C only) 
-Wtype-limits  
-Wuninitialized  
-Wshift-negative-value (in C++03 and in C99 and newer)  
-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.

-Wchkp

Выдавать предупреждение о некорректном доступе к памяти, обнаруженном Пограничным контролем указателей (-fcheck-pointer-bounds).

-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 and Objective-C++ only)

Выдавать предупреждение, когда значение типа 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-signedness

Если указан -Wformat, также предупреждайте, если строка формата требует беззнакового аргумента, а аргумент является знаковым, и наоборот.

-Wformat-y2k

Если указан -Wformat, также предупреждайте о форматах strftime, которые могут давать только двузначный год.

-Wnonnull

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

-Wnonnull включен в -Wall и -Wformat. Он может быть отключен с помощью параметра -Wno-nonnull.

-Wnonnull-compare

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

-Wnonnull-compare включен в -Wall. Он может быть отключен с помощью параметра -Wno-nonnull-compare.

-Wnull-dereference

Предупреждать, если компилятор обнаруживает пути, которые вызывают ошибочное или неопределенное поведение из-за разыменования нулевого указателя. Этот параметр активен только когда активен -fdelete-null-pointer-checks, что включено оптимизациями в большинстве целей. Точность предупреждений зависит от используемых параметров оптимизации.

-Winit-self (C, C++, Objective-C and Objective-C++ only)

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

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

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

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

-Wimplicit-int (C and Objective-C only)

Предупреждать, когда объявление не указывает тип. Это предупреждение включено параметром -Wall.

-Wimplicit-function-declaration (C and Objective-C only)

Выдавать предупреждение всякий раз, когда функция используется до объявления. В режиме C99 (-std=c99 или -std=gnu99) это предупреждение включено по умолчанию, и оно превращается в ошибку с помощью -pedantic-errors. Это предупреждение также включено с помощью -Wall.

-Wimplicit (C and Objective-C only)

То же, что -Wimplicit-int и -Wimplicit-function-declaration. Это предупреждение включено параметром -Wall.

-Wignored-qualifiers (C and C++ only)

Предупреждать, если возвращаемый тип функции имеет квалификатор типа, такой как const. Для ISO C такой квалификатор не имеет эффекта, так как возвращаемое значение функции не является lvalue. Для C++ предупреждение выдаётся только для скалярных типов или void. ISO C запрещает квалифицированные void возвращаемые типы в определениях функций, поэтому такие возвращаемые типы всегда получают предупреждение даже без этого параметра.

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

-Wignored-attributes (C and C++ only)

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

-Wmain

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

-Wmisleading-indentation (C and C++ only)

Предупреждать, когда отступы кода не отражают структуру блоков. В частности, предупреждение выдаётся для if, else, while, и for с условным оператором, который не использует фигурные скобки, за которым следует неусловный оператор с тем же отступом.

В следующем примере вызов “bar” вводяще отступом, как будто он был защищён условным оператором “if”.

if (some_condition ())
  foo ();
  bar ();  /* Gotcha: this is not guarded by the "if".  */

В случае смешанных табуляций и пробелов предупреждение использует параметр -ftabstop= для определения, выравниваются ли операторы (по умолчанию 8).

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

if (flagA)
    foo (0);
#if SOME_CONDITION_THAT_DOES_NOT_HOLD
  if (flagB)
#endif
    foo (1);

Предупреждение не выдаётся после директивы #line, так как это обычно указывает на сгенерированный код, и не могут быть сделаны предположения о расположении файла, на который ссылается эта директива.

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

-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 and Objective-C++ only)

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

-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 по адресу 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.

-Wshift-count-negative

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

-Wshift-count-overflow

Предупреждать, если сдвиг по счету ≥ ширине типа. Это предупреждение включено по умолчанию.

-Wshift-negative-value

Предупреждать о сдвиге отрицательного значения влево. Это предупреждение включено флагом -Wextra в режимах C99 и C++11 (и более поздних).

-Wshift-overflow
-Wshift-overflow=n

Предупреждать о переполнении при сдвиге влево. Это предупреждение включено по умолчанию в режимах C99 и C++11 (и более поздних).

-Wshift-overflow=1

Это уровень предупреждения для -Wshift-overflow и включено по умолчанию в режимах C99 и C++11 (и более поздних). Этот уровень предупреждения не предупреждает о сдвиге 1 в бит знака. (Однако в C такое переполнение всё ещё отклоняется в контекстах, где требуется целочисленное константное выражение.)

-Wshift-overflow=2

Этот уровень предупреждения также предупреждает о сдвиге 1 в бит знака, если не активен режим C++14.

-Wswitch

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

-Wswitch-default

Предупреждать всякий раз, когда switch инструкция не имеет default случая.

-Wswitch-enum

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

-Wswitch-bool

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

switch ((int) (a == 4))
  {
  …
  }

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

-Wsync-nand (C and C++ only)

Предупреждать при использовании встроенных функций __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++ and Objective-C++ only)

Предупреждать, когда typedef, локально определённый в функции, не используется. Это предупреждение включено флагом -Wall.

-Wunused-parameter

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

Для подавления этого предупреждения используйте атрибут unused (см. Атрибуты переменных).

-Wno-unused-result

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

-Wunused-variable

Предупреждать всякий раз, когда локальная или статическая переменная не используется, кроме её объявления. Этот параметр подразумевает -Wunused-const-variable=1 для C, но не для C++. Это предупреждение включено флагом -Wall.

Для подавления этого предупреждения используйте атрибут unused (см. Атрибуты переменных).

-Wunused-const-variable
-Wunused-const-variable=n

Предупреждать при использовании неиспользуемой константы статической переменной, помимо её объявления. -Wunused-const-variable=1 включается с -Wunused-variable для C, но не для C++. В C это объявляет хранилище переменной, но в C++ это не ошибка, так как константные переменные заменяют #define.

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

-Wunused-const-variable=1

Это уровень предупреждения, который включается с -Wunused-variable для C. Он предупреждает только о неиспользуемых статических константах, определенных в основном модуле компиляции, но не о статических константах, объявленных в любом включенном заголовке.

-Wunused-const-variable=2

Этот уровень предупреждений также предупреждает о неиспользуемых константных статических переменных в заголовках (исключая системные заголовки). Это уровень предупреждения -Wunused-const-variable и должен быть явно запрошен, так как в C++ это не ошибка, а в C может быть сложнее очистить все включенные заголовки.

-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.

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

-Winvalid-memory-model

Предупреждать об вызовах __atomic Builtins, __sync Builtins и универсальных функций атомных операций C11 с аргументом согласованности памяти, который либо недействителен для операции, либо находится вне диапазона значений перечисления memory_order. Например, поскольку __atomic_store и __atomic_store_n встроенные функции определены только для порядка памяти relaxed, release и последовательной согласованности, следующий код диагностируется:

void store (int *i)
{
  __atomic_store_n (i, 0, memory_order_consume);
}

-Winvalid-memory-model включен по умолчанию.

-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) или подобным кодом.

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

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

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

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

-Wunknown-pragmas

Предупреждать при обнаружении директивы #pragma , которая не распознается GCC. Если используется этот параметр командной строки, предупреждения будут выдаваться даже для неизвестных директив в системных заголовочных файлах. Это не так, если предупреждения включены только параметром командной строки -Wall.

-Wno-pragmas

Не выдавать предупреждения об ошибках использования директив, таких как неправильные параметры, недопустимый синтаксис или конфликты между директивами. См. также -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, могут не быть обнаружены.

-Wsuggest-final-types

Предупреждать о типах с виртуальными методами, где качество кода улучшится, если тип был объявлен с спецификатором C++11 final, или, если возможно, объявлен в анонимном пространстве имен. Это позволяет GCC более агрессивно девиртуализировать полиморфные вызовы. Это предупреждение более эффективно с оптимизацией на этапе компоновки, где информация о графе иерархии классов более полная.

-Wsuggest-final-methods

Предупреждать о виртуальных методах, где качество кода улучшится, если метод был объявлен с спецификатором C++11 final или, если возможно, его тип был объявлен в анонимном пространстве имен или со спецификатором final. Это предупреждение более эффективно с оптимизацией на этапе компоновки, где информация о графе иерархии классов более полная. Рекомендуется сначала рассмотреть предложения -Wsuggest-final-types, а затем перестроить с новыми аннотациями.

-Wsuggest-override

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

-Warray-bounds
-Warray-bounds=n

Эта опция активна только при активной опции -ftree-vrp (по умолчанию для -O2 и выше). Она предупреждает об индексах массивов, которые всегда выходят за пределы.

-Warray-bounds=1

Это уровень предупреждения -Warray-bounds и включен -Wall; более высокие уровни не включены и должны быть запрошены явно.

-Warray-bounds=2

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

-Wbool-compare

Предупреждать о логических выражениях, сравниваемых со значением целого типа, отличным от true/false. Например, следующее сравнение всегда ложно:

int n = 5;
…
if ((n > 1) == 2) { … }

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

-Wduplicated-cond

Предупреждать о дублированных условиях в цепочке if-else-if. Например, предупреждать о следующем коде:

if (p->q != NULL) { … }
else if (p->q != NULL) { … }
-Wframe-address

Предупреждать, когда вызываются ‘__builtin_frame_address’ или ‘__builtin_return_address’ с аргументом больше 0. Такие вызовы могут возвращать неопределенные значения или привести к аварийному завершению программы. Предупреждение включено в -Wall.

-Wno-discarded-qualifiers (C and Objective-C only)

Не выдавать предупреждения, если квалификаторы типов на указателях отбрасываются. Как правило, компилятор выдает предупреждение, если переменная типа const char * передается функции, которая принимает параметр типа char *. Эту опцию можно использовать для подавления такого предупреждения.

-Wno-discarded-array-qualifiers (C and Objective-C only)

Не выдавать предупреждения, если квалификаторы типов на массивах, которые являются целевыми объектами указателей, отбрасываются. Как правило, компилятор выдает предупреждение, если переменная типа const int (*)[] передается функции, которая принимает параметр типа int (*)[]. Эту опцию можно использовать для подавления такого предупреждения.

-Wno-incompatible-pointer-types (C and Objective-C only)

Не выдавать предупреждение, когда происходит преобразование между указателями с несовместимыми типами. Это предупреждение относится к случаям, не охваченным -Wno-pointer-sign, которое предупреждает о передаче аргумента-указателя или присваивании с разным знаком.

-Wno-int-conversion (C and Objective-C only)

Не выдавать предупреждения о несовместимых преобразованиях целого числа в указатель и указателя в целое число. Это предупреждение относится к неявным преобразованиям; для явных преобразований можно использовать предупреждения -Wno-int-to-pointer-cast и -Wno-pointer-to-int-cast.

-Wno-div-by-zero

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

-Wsystem-headers

Выводить сообщения об ошибках для конструкций, найденных в заголовочных файлах системы. Предупреждения из системных заголовочных файлов обычно подавляются, исходя из предположения, что они обычно не указывают на реальные проблемы и только усложняют вывод компилятора. Использование этой опции командной строки сообщает GCC, что нужно выводить предупреждения из системных заголовочных файлов так, как если бы они возникли в пользовательском коде. Однако обратите внимание, что использование -Wall в сочетании с этой опцией не предупреждает об неизвестных директивах в системных заголовочных файлах — для этого нужно использовать также -Wunknown-pragmas.

-Wtautological-compare

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

int i = 1;
…
if (i > i) { … }

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

-Wtrampolines

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

-Wfloat-equal

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

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

-Wtraditional (C and Objective-C only)

Предупреждать о конструкциях, которые ведут себя по-разному в традиционном и 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 библиотек libiberty, PARAMS и VPARAMS. Это предупреждение также пропущено для вложенных функций, поскольку эта функция уже является расширением GCC и, следовательно, не имеет отношения к совместимости с традиционным C.
-Wtraditional-conversion (C and Objective-C only)

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

-Wdeclaration-after-statement (C and Objective-C only)

Предупреждать, когда объявление находится после оператора в блоке. Эта конструкция, известная из C++, была введена с ISO C99 и по умолчанию разрешена в GCC. Она не поддерживается ISO C90. См. Смешанные Объявления.

-Wundef

Предупреждать, если неопределенный идентификатор вычисляется в директиве #if.

-Wno-endif-labels

Не выдавать предупреждение, когда #else или #endif следуют за текстом.

-Wshadow

Предупреждать, когда локальная переменная или объявление типа затеняет другую переменную, параметр, тип, член класса (в C++) или экземпляр переменной (в Objective-C), или когда затеняется встроенная функция. Обратите внимание, что в C++ компилятор предупреждает, если локальная переменная затеняет явное typedef, но не если она затеняет struct/class/enum.

-Wno-shadow-ivar (Objective-C only)

Не предупреждать, когда локальная переменная затеняет экземпляр переменной в методе Objective-C.

-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 targets only)

При использовании в сочетании с -Wformat и -pedantic без расширений GNU, этот параметр отключает предупреждения о не-ISO printf / scanf спецификаторах ширины формата I32, I64, и I, используемых на целевых системах Windows, которые зависят от времени выполнения MS.

-Wplacement-new
-Wplacement-new=n

Предупреждать о выражениях placement new с неопределенным поведением, таких как построение объекта в буфере, который меньше, чем тип объекта. Например, выражение placement new ниже диагностируется, потому что оно пытается создать массив из 64 целых чисел в буфере размером всего в 64 байта.

char buf [64];
new (buf) int[64];

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

-Wplacement-new=1

Это уровень предупреждений по умолчанию -Wplacement-new. На этом уровне предупреждение не выдается для некоторых строго неопределенных конструкций, которые GCC разрешает как расширения для совместимости со старым кодом. Например, следующее new выражение не диагностируется на этом уровне, даже несмотря на то, что оно имеет неопределенное поведение в соответствии со стандартом C++, потому что оно записывает за пределами одноэлементного массива.

struct S { int n, a[1]; };
S *s = (S *)malloc (sizeof *s + 31 * sizeof s->a[0]);
new (s->a)int [32]();
-Wplacement-new=2

На этом уровне, помимо диагностики всех тех же конструкций, что и на уровне 1, также выдается диагностика для выражений placement new, которые строят объект в последнем члене структуры, тип которой является массивом из одного элемента, а размер которого меньше размера строящегося объекта. В то время как предыдущий пример будет диагностирован, следующая конструкция использует расширение гибкого членского массива, чтобы избежать предупреждения на уровне 2.

struct S { int n, a[]; };
S *s = (S *)malloc (sizeof *s + 32 * sizeof s->a[0]);
new (s->a)int [32]();
-Wpointer-arith

Предупреждать обо всем, что зависит от «размера» типа функции или void. GNU C присваивает этим типам размер 1 для удобства в расчетах с указателями на void * и указателями на функции. В C++, предупреждать также при арифметической операции с участием NULL. Это предупреждение также включено с -Wpedantic.

-Wtype-limits

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

-Wbad-function-cast (C and Objective-C only)

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

-Wc90-c99-compat (C and Objective-C only)

Предупреждать об элементах, отсутствующих в ISO C90, но присутствующих в ISO C99. Например, предупреждать об использовании массивов переменной длины, типе long long, типе bool, составных литералах, обозначенных инициализаторах и т. д. Этот параметр независим от режима стандартов. Предупреждения отключены в выражении, которое следует за __extension__.

-Wc99-c11-compat (C and Objective-C only)

Предупреждать об элементах, отсутствующих в ISO C99, но присутствующих в ISO C11. Например, предупреждать об использовании анонимных структур и объединений, квалификаторе типа _Atomic, спецификаторе класса хранения _Thread_local, спецификаторе _Alignas, операторе Alignof, ключевом слове _Generic и т. д. Этот параметр независим от режима стандартов. Предупреждения отключены в выражении, которое следует за __extension__.

-Wc++-compat (C and Objective-C only)

Предупреждение об использовании конструкций языка ISO C, которые выходят за рамки общего подмножества ISO C и ISO C++, например, запрос неявного преобразования из void * в указатель на тип, не являющийся void.

-Wc++11-compat (C++ and Objective-C++ only)

Предупреждение об использовании конструкций C++, значение которых отличается между ISO C++ 1998 и ISO C++ 2011, например, идентификаторы в ISO C++ 1998, являющиеся ключевыми словами в ISO C++ 2011. Это предупреждение включает -Wnarrowing и включено по умолчанию с -Wall.

-Wc++14-compat (C++ and Objective-C++ only)

Предупреждение об использовании конструкций C++, значение которых отличается между ISO C++ 2011 и ISO C++ 2014. Это предупреждение включается по умолчанию с -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[length], чтобы копирование адреса одной в непостоянный char * указатель на const объект вызывало предупреждение. Эти предупреждения помогают найти во время компиляции код, который может пытаться записать в строковую константу, но только если вы очень осторожно используете const в объявлениях и прототипах. В противном случае это просто раздражает. Вот почему мы не заставляли -Wall запрашивать эти предупреждения.

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

-Wclobbered

Предупреждение о переменных, которые могут быть изменены longjmp или vfork. Это предупреждение также включено по умолчанию с -Wextra.

-Wconditionally-supported (C++ and Objective-C++ only)

Предупреждение об условно-поддерживаемых (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++ and Objective-C++ only)

Не предупреждает о преобразованиях между NULL и типами, не являющимися указателями. -Wconversion-null включено по умолчанию.

-Wzero-as-null-pointer-constant (C++ and Objective-C++ only)

Предупреждает, когда литерал ‘0’ используется как константа нулевого указателя. Это может быть полезно для облегчения преобразования в nullptr в C++11.

-Wsubobject-linkage (C++ and Objective-C++ only)

Предупреждает, если тип класса имеет базовый класс или поле, тип которых использует анонимное пространство имен или зависит от типа без связи. Если тип A зависит от типа B без или с внутренней связью, определение его в нескольких трансляционных единицах будет нарушением ODR, потому что значение B отличается в каждой трансляционной единице. Если A появляется только в одной трансляционной единице, лучший способ отключить предупреждение — присвоить ему внутреннюю связь, поместив его также в анонимное пространство имен. Компилятор не выдает это предупреждение для типов, определенных в основном файле .C, так как для них маловероятно несколько определений. -Wsubobject-linkage включено по умолчанию.

-Wdate-time

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

-Wdelete-incomplete (C++ and Objective-C++ only)

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

-Wuseless-cast (C++ and Objective-C++ only)

Предупреждение, когда выражение приводится к своему собственному типу.

-Wempty-body

Предупреждение, если пустой блок встречается в инструкции if, else или do while. Это предупреждение также включено по умолчанию с -Wextra.

-Wenum-compare

Предупреждение о сравнении значений разных перечислимых типов. В C++ несовпадения перечислений в условных выражениях также диагностируются, и предупреждение включено по умолчанию. В C это предупреждение включено с -Wall.

-Wjump-misses-init (C, Objective-C only)

Предупреждение, если инструкция goto или switch переходит вперёд через инициализацию переменной или переходит назад к метке после инициализации переменной. Это предупреждение касается только переменных, которые инициализируются при объявлении. Это предупреждение поддерживается только для C и Objective-C; в C++ такой переход является ошибкой в любом случае.

-Wjump-misses-init включен в -Wc++-compat. Он может быть отключен с помощью опции -Wno-jump-misses-init.

-Wsign-compare

Предупреждение, когда сравнение знакового и беззнакового значения может привести к неправильному результату при преобразовании знакового значения в беззнаковое. В C++, это предупреждение также включено по умолчанию с -Wall. В C, оно также включено по умолчанию с -Wextra.

-Wsign-conversion

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

-Wfloat-conversion

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

-Wno-scalar-storage-order

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

-Wsized-deallocation (C++ and Objective-C++ only)

Предупреждение об определении функции безразмерного освобождения памяти

void operator delete (void *) noexcept;
void operator delete[] (void *) noexcept;

без определения соответствующей функции размером освобождения памяти

void operator delete (void *, std::size_t) noexcept;
void operator delete[] (void *, std::size_t) noexcept;

или наоборот. Включено по умолчанию с -Wextra вместе с -fsized-deallocation.

-Wsizeof-pointer-memaccess

Предупреждение о подозрительных параметрах длины для некоторых встроенных функций строк и памяти, если аргумент использует sizeof. Это предупреждение, например, предупреждает о memset (ptr, 0, sizeof (ptr));, если ptr не является массивом, а указателем, и предлагает возможную корректировку, или о memcpy (&foo, ptr, sizeof (&foo));. Это предупреждение включено по умолчанию с -Wall.

-Wsizeof-array-argument

Предупреждение, когда оператор sizeof применяется к параметру, объявленному как массив в определении функции. Это предупреждение включено по умолчанию для программ C и C++.

-Wmemset-transposed-args

Предупреждение о подозрительных вызовах встроенной функции memset, если второй аргумент не равен нулю, а третий аргумент равен нулю. Это предупреждает, например, о memset (buf, sizeof buf, 0), где, скорее всего, имелось в виду memset (buf, 0, sizeof buf). Диагностика выдаётся только если третий аргумент — литеральное нулевое значение. Если это какое-то выражение, которое сворачивается до нуля, приведение нуля к некоторому типу и т. д., то гораздо менее вероятно, что пользователь ошибочно поменял аргументы, и предупреждение не выдаётся. Это предупреждение включено по умолчанию с -Wall.

-Waddress

Предупреждение о подозрительном использовании адресов памяти. К ним относятся использование адреса функции в условном выражении, например void func(void); if (func), и сравнение с адресом памяти строкового литерала, например if (x == "abc"). Такие использования обычно указывают на ошибку программиста: адрес функции всегда оценивается как истина, поэтому их использование в условном выражении, как правило, указывает на то, что программист забыл скобки в вызове функции; а сравнение со строковыми литералами приводит к неопределенному поведению и не является переносимым в C, поэтому обычно указывает на то, что программист намеревался использовать strcmp. Это предупреждение включено по умолчанию с -Wall.

-Wlogical-op

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

extern int a;
if (a < 0 && a < 0) { … }
-Wlogical-not-parentheses

Предупреждение об использовании логического отрицания в левом операнде сравнения. Эта опция не предупреждает, если правое операнд имеет тип boolean. Цель состоит в обнаружении подозрительного кода, например:

int a;
…
if (!a > 1) { … }

Можно подавить предупреждение, обернув левое операнд в скобки:

if ((!a) > 1) { … }

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

-Waggregate-return

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

-Wno-aggressive-loop-optimizations

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

-Wno-attributes

Не выдавать предупреждения, если используется неожиданное __attribute__, такое как нераспознанные атрибуты, атрибуты функций, применённые к переменным и т. п. Это не останавливает ошибки при неправильном использовании поддерживаемых атрибутов.

-Wno-builtin-macro-redefined

Не выдавать предупреждения, если переопределены определённые встроенные макросы. Это подавляет предупреждения о переопределении __TIMESTAMP__, __TIME__, __DATE__, __FILE__, и __BASE_FILE__.

-Wstrict-prototypes (C and Objective-C only)

Предупреждать, если функция объявлена или определена без указания типов аргументов. (Определение функции старого стиля разрешено без предупреждения, если ему предшествует объявление, в котором указаны типы аргументов.)

-Wold-style-declaration (C and Objective-C only)

Предупреждать о устаревших способах использования, согласно стандарту C, в объявлении. Например, предупреждать, если спецификаторы класса хранения, такие как static, не являются первыми в объявлении. Это предупреждение также включено в -Wextra.

-Wold-style-definition (C and Objective-C only)

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

-Wmissing-parameter-type (C and Objective-C only)

Параметр функции объявлен без указания типа в функциях стиля K&R:

void foo(bar) { }

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

-Wmissing-prototypes (C and Objective-C only)

Предупреждать, если глобальная функция определена без предварительного объявления прототипа. Это предупреждение выдаётся даже если само определение предоставляет прототип. Используйте этот параметр для обнаружения глобальных функций, у которых нет соответствующего объявления прототипа в файле заголовков. Этот параметр недействителен для C++, поскольку все объявления функций предоставляют прототипы, а несоответствующее объявление объявляет перегрузку, а не конфликтует с предыдущим объявлением. Используйте -Wmissing-declarations для обнаружения отсутствующих объявлений в C++.

-Wmissing-declarations

Предупреждать, если глобальная функция определена без предыдущего объявления. Делать это даже если само определение предоставляет прототип. Используйте этот параметр для обнаружения глобальных функций, которые не объявлены в заголовочных файлах. В C для функций с предыдущими объявлениями без прототипов не выдаются предупреждения; используйте -Wmissing-prototypes для обнаружения отсутствующих прототипов. В C++ не выдаются предупреждения для шаблонов функций, для встроенных функций или для функций в анонимных именованных пространствах.

-Wmissing-field-initializers

Предупреждать, если инициализатор структуры имеет отсутствующие поля. Например, следующий код вызывает такое предупреждение, потому что 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 };

В C++ этот параметр также не предупреждает об инициализаторе {} , например:

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

Это предупреждение включено в -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, который предупреждает об идентификаторе, который не находится в нормализованной форме ISO 10646 «C», NFC. NFC является рекомендуемой формой для большинства случаев использования. Он эквивалентен -Wnormalized.

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

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

Некоторые символы в ISO 10646 имеют разные значения, но выглядят одинаково в некоторых шрифтах или методах отображения, особенно после применения форматирования. Например, \u207F, «ВЕРХНИЙ ИНДЕКС МАЛЕНЬКАЯ ЛАТИНСКАЯ БУКВА N», отображается так же, как обычная n в верхнем индексе. ISO 10646 определяет схему нормализации NFKC для преобразования всех этих символов в стандартную форму, и GCC предупреждает, если ваш код не находится в NFKC, если вы используете -Wnormalized=nfkc. Это предупреждение аналогично предупреждению о каждом идентификаторе, содержащем букву O, поскольку она может быть перепутана с цифрой 0, и поэтому не является по умолчанию, но может быть полезным локальным соглашением программирования, если среда программирования не может быть настроена для различения этих символов.

-Wno-deprecated

Не выдавать предупреждения об использовании устаревших функций. См. Устаревшие функции.

-Wno-deprecated-declarations

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

-Wno-overflow

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

-Wno-odr

Предупреждать о нарушениях правила одной дефиниции во время оптимизации при компоновке. Требуется включить -flto-odr-type-merging. Включено по умолчанию.

-Wopenmp-simd

Предупреждать, если модель стоимости векторизации переопределяет директивы OpenMP или Cilk Plus simd, заданные пользователем. Параметр -fsimd-cost-model=unlimited можно использовать для смягчения модели стоимости.

-Woverride-init (C and Objective-C only)

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

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

-Woverride-init-side-effects (C and Objective-C only)

Предупреждать, если инициализированное поле с побочными эффектами переопределяется при использовании инициализаторов с указанием (см. Инициализаторы с указанием). Это предупреждение включено по умолчанию.

-Wpacked

Предупреждать, если структуре задан атрибут packed, но атрибут 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

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

-Wnested-externs (C and Objective-C only)

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

-Wnested-externs (C and Objective-C only)

Предупреждать, если встречено объявление extern внутри функции.

-Wno-inherited-variadic-ctor

Подавить предупреждения об использовании наследования конструкторов C++11, когда у базового класса, унаследованного от него, есть конструктор C с переменным числом аргументов; предупреждение включено по умолчанию, потому что многоточие не наследуется.

-Winline

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

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

-Wno-invalid-offsetof (C++ and Objective-C++ only)

Подавляет предупреждения при применении макроса offsetof к типу без POD. Согласно стандарту ISO C++ 2014, применение offsetof к типу без стандартной компоновки является неопределённым. Однако в существующих реализациях C++ offsetof обычно даёт осмысленные результаты. Этот флаг предназначен для пользователей, которые понимают, что они пишут непереносимый код, и которые сознательно выбрали игнорировать предупреждение об этом.

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

-Wno-int-to-pointer-cast

Подавляет предупреждения от приведений к типу указателя целого числа другого размера. В C++, приведение к типу указателя меньшего размера является ошибкой. Wint-to-pointer-cast включено по умолчанию.

-Wno-pointer-to-int-cast (C and Objective-C only)

Подавляет предупреждения от приведений от указателя к целочисленному типу другого размера.

-Winvalid-pch

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

-Wlong-long

Предупреждает, если используется тип long long. Это включено либо с -Wpedantic, либо с -Wtraditional в режимах ISO C90 и C++98. Для отключения предупреждений используйте -Wno-long-long.

-Wvariadic-macros

Предупреждает при использовании псевдопеременных макросов в режиме ISO C90 или если используется альтернативная синтаксическая конструкция GNU в режиме ISO C99. Это включено либо с -Wpedantic, либо с -Wtraditional. Для отключения предупреждений используйте -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 and Objective-C only)

Предупреждает о передаче аргумента указателя или присваивании с разным знаком. Этот параметр поддерживается только для 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 and Objective-C only)

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

-Wno-designated-init (C and Objective-C only)

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

-Whsa

Выдает предупреждение, когда HSAIL не может быть сгенерирован для скомпилированной функции или конструкции OpenMP.

Далее: Параметры отладки, Предыдущее: Параметры форматирования сообщений об ошибках, Вверх: Вызов GCC [Оглавление][Индекс]

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

Spec-Zone.ru

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