Spec-Zone.ru › GCC 5

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

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

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

-fsyntax-only

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

-fmax-errors=n

Ограничивает максимальное количество сообщений об ошибках до n, после чего GCC прекращает обработку исходного кода, вместо попытки продолжить. Если n равно 0 (по умолчанию), ограничений на количество сообщений об ошибках нет. Если также указан параметр -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, представляет собой расширенный диалект GNU C, такой как ‘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)  
-Wc++11-compat  -Wc++14-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.

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

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

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

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

-Wshift-count-negative

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

-Wshift-count-overflow

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

-Wswitch

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

-Wswitch-default

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

-Wswitch-enum

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

-Wswitch-bool

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

Предупреждать всякий раз, когда локальная переменная или статическая переменная, не являющаяся константой, не используется, кроме её объявления. Это предупреждение включено с помощью -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) или аналогичным кодом.

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

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

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

-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 и выше). Он предупреждает о индексах массивов, которые всегда находятся за пределами границ. Это предупреждение включено параметром -Wall.

-Warray-bounds=1

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

-Warray-bounds=2

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

-Wbool-compare

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

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

Это предупреждение включено параметром -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 в сочетании с этим параметром не предупреждает об неизвестных пragma в системных заголовочных файлах — для этого необходимо также использовать -Wunknown-pragmas.

-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, но не затеняет структуру/класс/перечисление.

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

-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 , операторе _Generic , ключевом слове Alignof и так далее. Этот параметр независим от режима стандартов. Предупреждения отключены в выражении, следующему за __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] , чтобы копирование адреса одного в указатель, не являющийся const char * , вызывало предупреждение. Эти предупреждения помогают найти код, который может попытаться записать в строковую константу, только если вы очень внимательно использовали 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.

-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

Предупреждать при сравнении знакового и беззнакового значений, которое может привести к неверному результату при преобразовании знакового значения в беззнаковое. Это предупреждение также включено параметром -Wextra; чтобы получить другие предупреждения -Wextra без этого предупреждения, используйте -Wextra -Wno-sign-compare.

-Wsign-conversion

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

-Wfloat-conversion

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

-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

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

-Wlogical-not-parentheses

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

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)

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

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

Предупреждать об нарушениях правила одной дефиниции (One Definition Rule) во время оптимизации на этапе компоновки. Требуется включить -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.

-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

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

-Wredundant-decls

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

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

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

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

Spec-Zone.ru

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