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не имеетdefaultcase. -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], чтобы копирование адреса одного в указатель, не являющийсяconstchar *, вызывало предупреждение. Эти предупреждения помогают найти код, который может попытаться записать в строковую константу, только если вы очень внимательно использовали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_DECIMAL64pragma из расширения для чисел с плавающей точкой десятичной системы 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