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_DECIMAL64pragma из расширения десятичных чисел с плавающей точкой для 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