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 не генерирует предупреждения об использовании альтернативных ключевых слов, имена которых начинаются и заканчиваются символом __. Предупреждения pedantic также отключены в выражении, которое следует за
__extension__. Однако эти обходные пути должны использоваться только в системных заголовочных файлах; приложения должны их избегать. См. Альтернативные ключевые слова.Некоторые пользователи пытаются использовать -Wpedantic для проверки программ на соответствие строгому стандарту ISO C. Они быстро обнаруживают, что это не совсем то, что им нужно: она находит некоторые несоответствия ISO, но не все — только те, для которых 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 -Wbool-operation -Wc++11-compat -Wc++14-compat -Wchar-subscripts -Wcomment -Wduplicate-decl-specifier (C and Objective-C only) -Wenum-compare (in C/ObjC; this is on by default in C++) -Wformat -Wint-in-bool-context -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-elt-size -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 -Wimplicit-fallthrough=3 -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. -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. -Wduplicate-decl-specifier (C and Objective-C only)-
Выдавать предупреждение, если в объявлении есть дублирующиеся спецификаторы
const,volatile,restrictили_Atomic. Это предупреждение включено параметром -Wall. -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 указывает, что такие неиспользуемые аргументы разрешены. -Wformat-overflow-Wformat-overflow=level-
Выдавать предупреждения о вызовах функций форматированного ввода/вывода, таких как
sprintfиvsprintf, которые могут привести к переполнению буфера назначения. Если точное количество байтов, записанных директивой формата, не может быть определено на этапе компиляции, оно оценивается на основе эвристик, зависящих от аргумента level и оптимизации. Хотя включение оптимизации в большинстве случаев улучшит точность предупреждения, это также может привести к ложным срабатываниям.-Wformat-overflow-Wformat-overflow=1-
Уровень 1 параметра -Wformat-overflow, включенного с -Wformat, использует консервативный подход, который предупреждает только о вызовах, которые, скорее всего, приведут к переполнению буфера. На этом уровне числовые аргументы к директивам формата с неизвестными значениями предполагают значение один, а строки неизвестной длины — пустую строку. Числовые аргументы, известные как ограниченные поддиапазоном их типа, или строковые аргументы, вывод которых ограничен либо точностью их директивы, либо конечным набором строковых литералов, предполагаются принимать значение в пределах диапазона, что приводит к наибольшему количеству байтов на выходе. Например, вызов
sprintfниже диагностируется, потому что даже если a и b равны нулю, завершающий нулевой символ ('\0') , добавляемый функцией в буфер назначения, будет записан за его пределами. Увеличение размера буфера на один байт достаточно для предотвращения предупреждения, хотя этого может быть недостаточно для предотвращения переполнения.void f (int a, int b) { char buf [12]; sprintf (buf, "a = %i, b = %i\n", a, b); } -Wformat-overflow=2-
Уровень 2 также предупреждает о вызовах, которые могут привести к переполнению буфера назначения при наличии аргумента достаточной длины или величины. На уровне 2 неизвестные числовые аргументы предполагают минимальное представимое значение для знаковых типов с точностью более 1 и максимальное представимое значение в противном случае. Неизвестные строковые аргументы, длина которых не может быть предположена как ограниченная либо точностью директивы, либо конечным набором строковых литералов, к которым они могут быть оценены, или массивом символов, к которому они могут указывать, предполагаются длиной в 1 символ.
На уровне 2 вызов в приведенном выше примере снова диагностируется, но на этот раз, потому что со значением a равным 32-битном
INT_MINпервая директива%iзапишет некоторые из своих цифр за пределами буфера назначения. Для того чтобы сделать вызов безопасным независимо от значений двух переменных, размер буфера назначения должен быть увеличен по крайней мере до 34 байт. GCC включает минимальный размер буфера в информационной заметке, следующей за предупреждением.Альтернативой увеличению размера буфера назначения является ограничение диапазона форматированных значений. Максимальная длина строковых аргументов может быть ограничена путем указания точности в директиве формата. Если числовые аргументы директивы формата могут быть предположительно ограничены меньше точности их типа, выбор соответствующего модификатора длины для спецификатора формата уменьшит требуемый размер буфера. Например, если a и b в приведенном выше примере могут быть предположительно ограничены точностью типа
short int, то использование либо директивы формата%hi, либо приведение аргумента кshort, уменьшает максимальный требуемый размер буфера до 24 байт.void f (int a, int b) { char buf [23]; sprintf (buf, "a = %hi, b = %i\n", a, (short)b); }
-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-truncation-Wformat-truncation=level-
Предупреждать о вызовах функций форматированного ввода/вывода, таких как
snprintfиvsnprintf, которые могут привести к усечению вывода. Если точное количество байтов, записанных директивой формата, не может быть определено на этапе компиляции, оно оценивается на основе эвристик, зависящих от аргумента level и оптимизации. За исключением случаев, о которых упоминается отдельно, параметр использует ту же логику, что и -Wformat-overflow.-Wformat-truncation-Wformat-truncation=1-
Уровень 1 параметра -Wformat-truncation, включенного с -Wformat, использует консервативный подход, который предупреждает только о вызовах ограниченных функций, возвращаемое значение которых не используется, и которые, скорее всего, приведут к усечению вывода.
-Wformat-truncation=2Уровень 2 также предупреждает о вызовах ограниченных функций, возвращаемое значение которых используется, и которые могут привести к усечению при наличии аргумента достаточной длины или величины.
-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.
-Wimplicit-fallthrough-
-Wimplicit-fallthrough эквивалентно -Wimplicit-fallthrough=3, а -Wno-implicit-fallthrough эквивалентно -Wimplicit-fallthrough=0.
-Wimplicit-fallthrough=n-
Выдавать предупреждение, когда в блоке switch происходит переход к следующему случаю (case). Например:
switch (cond) { case 1: a = 1; break; case 2: a = 2; case 3: a = 3; break; }Это предупреждение не выдаётся, когда последнее утверждение в случае (case) не может перейти к следующему случаю, например, когда присутствует оператор return или вызов функции с атрибутом noreturn. -Wimplicit-fallthrough= также учитывает управляющие операторы, такие как if, и предупреждает только при необходимости. Например:
switch (cond) { case 1: if (i > 3) { bar (5); break; } else if (i < 1) { bar (0); } else return; default: … }Поскольку в некоторых случаях пропуск случая (case) в switch желателен, GCC предоставляет атрибут
__attribute__ ((fallthrough)), который следует использовать вместе с пустым оператором для подавления этого предупреждения, которое обычно возникает:switch (cond) { case 1: bar (0); __attribute__ ((fallthrough)); default: … }C++17 предоставляет стандартный способ подавления предупреждения -Wimplicit-fallthrough с помощью
[[fallthrough]];вместо атрибута GNU. В C++11 или C++14 пользователи могут использовать[[gnu::fallthrough]];, что является расширением GNU. Вместо этих атрибутов также можно добавить комментарий fallthrough, чтобы заглушить предупреждение. Весь текст комментария в стиле C или C++ должен соответствовать приведенным ниже регулярным выражениям. Аргумент опции n определяет, какие комментарии принимаются:- -Wimplicit-fallthrough=0 полностью отключает предупреждение.
- -Wimplicit-fallthrough=1 соответствует регулярному выражению
.*, любой комментарий используется как комментарий fallthrough. - -Wimplicit-fallthrough=2 нечувствительно к регистру соответствует регулярному выражению
.*falls?[ \t-]*thr(ough|u).*. - -Wimplicit-fallthrough=3 чувствительно к регистру соответствует одному из следующих регулярных выражений:
-
-fallthrough -
@fallthrough@ -
lint -fallthrough[ \t]* -
[ \t.!]*(ELSE,? |INTENTIONAL(LY)? )?FALL(S | |-)?THR(OUGH|U)[ \t.!]*(-[^\n\r]*)? -
[ \t.!]*(Else,? |Intentional(ly)? )?Fall((s | |-)[Tt]|t)hr(ough|u)[ \t.!]*(-[^\n\r]*)? -
[ \t.!]*([Ee]lse,? |[Ii]ntentional(ly)? )?fall(s | |-)?thr(ough|u)[ \t.!]*(-[^\n\r]*)?
-
- -Wimplicit-fallthrough=4 чувствительно к регистру соответствует одному из следующих регулярных выражений:
-
-fallthrough -
@fallthrough@ -
lint -fallthrough[ \t]* -
[ \t]*FALLTHR(OUGH|U)[ \t]*
-
- -Wimplicit-fallthrough=5 не распознаёт комментарии как комментарии fallthrough, только атрибуты отключают предупреждение.
Комментарий должен следовать за необязательными пробелами и другими комментариями с ключевыми словами
caseилиdefaultили с меткой пользователя, которая предшествует меткамcaseилиdefault.switch (cond) { case 1: bar (0); /* FALLTHRU */ default: … }Предупреждение -Wimplicit-fallthrough=3 включено с -Wextra.
-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, что является иным толкованием, чем в обычной математической записи.Также выдавать предупреждение для опасных случаев использования расширения GNU для
?:с пропущенным средним операндом. Когда условие в операторе?: является булевым выражением, пропущенное значение всегда равно 1. Часто программисты ожидают, что это значение будет вычислено внутри условного выражения.Это предупреждение включено с помощью -Wall.
-Wsequence-point-
Выдавать предупреждение о коде, который может иметь неопределённое поведение из-за нарушений правил точек последовательности в стандартах C и C++.
Стандарты C и C++ определяют порядок оценки выражений в программе C/C++ в терминах точек последовательности, которые представляют частичный порядок между выполнением частей программы: те, которые выполняются до точки последовательности, и те, которые выполняются после неё. Они возникают после оценки полного выражения (которое не является частью более крупного выражения), после оценки первого операнда
&&,||,? :или,(запятой), перед вызовом функции (но после оценки её аргументов и выражения, обозначающего вызываемую функцию), и в некоторых других местах. За исключением тех случаев, которые выражены правилами точки последовательности, порядок оценки подвыражений выражения не определён. Все эти правила описывают только частичный порядок, а не общий порядок, так как, например, если две функции вызываются в рамках одного выражения без точки последовательности между ними, порядок, в котором вызываются функции, не определён. Однако комитет стандартов постановил, что вызовы функций не перекрываются.Не определён момент, когда между точками последовательности изменения значений объектов вступают в силу. Программы, поведение которых зависит от этого, имеют неопределённое поведение; стандарты C и C++ указывают, что «между предыдущей и следующей точкой последовательности объект должен изменить своё сохранённое значение не более одного раза при оценке выражения. Кроме того, предыдущее значение должно быть прочитано только для определения значения, которое будет сохранёно». Если программа нарушает эти правила, результаты на любой конкретной реализации полностью непредсказуемы.
Примеры кода с неопределённым поведением —
a = a++;,a[n] = b[n++]иa[i++] = i;. Некоторые более сложные случаи не диагностируются этой опцией, и она может давать иногда ложноположительные результаты, но в целом она довольно эффективна для обнаружения этого типа проблем в программах.Стандарт C++17 определит порядок оценки операндов в большем количестве случаев: в частности, он требует, чтобы правая часть присваивания оценивалась перед левой, поэтому вышеприведённые примеры больше не неопределённы. Но это предупреждение по-прежнему будет предупреждать о них, чтобы помочь людям избегать написания кода, который неопределён в C и ранних редакциях C++.
Стандарт написан запутанно, поэтому существует некоторое обсуждение относительно точного значения правил точки последовательности в тонких случаях. Ссылки на обсуждения проблемы, включая предлагаемые формальные определения, можно найти на странице с материалами для чтения GCC по адресу http://gcc.gnu.org/readings.html.
Это предупреждение включено с помощью -Wall для C и C++.
-Wno-return-local-addr-
Не выдавать предупреждений об возвращении указателя (или в C++, ссылки) на переменную, область видимости которой выходит за пределы функции после её возврата.
-Wreturn-type-
Выдавать предупреждение всякий раз, когда функция определяется с типом возврата, который по умолчанию
int. Также предупреждать об оператореreturnбез возвращаемого значения в функции, тип возврата которой неvoid(выход за пределы тела функции рассматривается как возврат без значения).Только для C, предупреждать об операторе
returnс выражением в функции, тип возврата которойvoid, если тип выражения такжеvoid. В качестве расширения GNU, последний случай принимается без предупреждения, если не используется -Wpedantic.Для C++, функция без типа возврата всегда генерирует сообщение об ошибке, даже если указана -Wno-return-type. Исключение составляют
mainи функции, определённые в системных заголовках.Это предупреждение включено с помощью -Wall.
-Wshift-count-negative-
Выдавать предупреждение, если сдвиг имеет отрицательное значение. Это предупреждение включено по умолчанию.
-Wshift-count-overflow-
Предупреждать, если счётчик сдвига >= ширины типа. Это предупреждение включено по умолчанию.
-Wshift-negative-value-
Предупреждать, если осуществляется сдвиг влево отрицательного значения. Это предупреждение включено по умолчанию в режимах 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не имеетdefaultcase. -Wswitch-enum-
Предупреждать всякий раз, когда оператор
switchимеет индекс перечислимого типа и отсутствуетcaseдля одного или нескольких именованных кодов этого перечисления.caseметки вне диапазона перечисления также вызывают предупреждения при использовании этого параметра. Единственное различие между -Wswitch и этим параметром заключается в том, что этот параметр выдает предупреждение об опущенном коде перечисления даже если есть меткаdefault. -Wswitch-bool-
Предупреждать всякий раз, когда оператор
switchимеет индекс булевского типа, а значения case выходят за пределы диапазона булевского типа. Предупреждение можно подавить, применив преобразование к управляющему выражению к типу, отличного отbool. Например:switch ((int) (a == 4)) { … }Это предупреждение включено по умолчанию для программ C и C++.
-Wswitch-unreachable-
Предупреждать всякий раз, когда оператор
switchсодержит операторы между управляющим выражением и первой меткой case, которые никогда не будут выполнены. Например:switch (cond) { i = 15; … case 5: … }-Wswitch-unreachable не предупреждает, если оператор между управляющим выражением и первой меткой case — это просто объявление:
switch (cond) { int i; … case 5: i = 5; … }Это предупреждение включено по умолчанию для программ C и C++.
-Wsync-nand (C and C++ only)-
Предупреждать при использовании встроенных функций
__sync_fetch_and_nandи__sync_nand_and_fetch. Эти функции изменили семантику в GCC 4.4. -Wunused-but-set-parameter-
Предупреждать всякий раз, когда параметр функции присваивается, но в остальном не используется (кроме объявления).
Для подавления этого предупреждения используйте атрибут
unused(см. Атрибуты переменных).Это предупреждение также включено параметрами -Wunused вместе с -Wextra.
-Wunused-but-set-variable-
Предупреждать всякий раз, когда локальная переменная присваивается, но в остальном не используется (кроме её объявления). Это предупреждение включено параметром -Wall.
Для подавления этого предупреждения используйте атрибут
unused(см. Атрибуты переменных).Это предупреждение также включено параметром -Wunused, который включен параметром -Wall.
-Wunused-function-
Предупреждать всякий раз, когда статическая функция объявлена, но не определена, или неиспользуемая статическая функция не является inline. Это предупреждение включено параметром -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без static встречается в классе без конструкторов.Если вы хотите предупреждать о коде, который использует неинициализированное значение переменной в её собственном инициализаторе, используйте параметр -Winit-self.
Эти предупреждения возникают для отдельных неинициализированных или перезаписанных элементов структурных, объединяющих или массивно-переменных, а также для переменных, которые неинициализированные или перезаписанные как целое. Они не возникают для переменных или элементов, объявленных
volatile. Поскольку эти предупреждения зависят от оптимизации, точные переменные или элементы, для которых существуют предупреждения, зависят от точных параметров оптимизации и используемой версии GCC.Обратите внимание, что может не быть предупреждения о переменной, используемой только для вычисления значения, которое само по себе никогда не используется, потому что такие вычисления могут быть удалены анализом потока данных перед выводом предупреждений.
-Winvalid-memory-model-
Предупреждать о вызовах __atomic Builtins, __sync Builtins и общих атомарных функциях C11 с аргументом согласованности памяти, который является некорректным для операции или выходит за пределы диапазона значений перечисления
memory_order. Например, поскольку встроенные функции__atomic_storeи__atomic_store_nопределены только для расслабленных, высвобождающих и последовательно согласованных порядков памяти, следующий код диагностируется: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. Это отображается только на самом высоком уровне предупреждения, потому что это упрощение применяется ко многим сравнениям, поэтому этот уровень предупреждений даёт очень большое количество ложных срабатываний.
-Wstringop-overflow-Wstringop-overflow=type-
Предупреждать о вызовах функций обработки строк, таких как
memcpyиstrcpy, которые определены как переполняющие буфер назначения. Дополнительный аргумент на единицу больше типа проверки размера объекта, который используется для определения размера назначения. См. Проверка размера объекта. Аргумент имеет смысл только для функций, которые работают с массивами символов, но не для функций работы с сырой памятью, таких какmemcpy, которые всегда используют тип проверки размера объекта 0. Этот параметр также предупреждает о вызовах, которые указывают размер, превышающий максимальный возможный объект или не болееSIZE_MAX / 2байт. Параметр дает наилучшие результаты при включенной оптимизации, но может обнаруживать небольшую подгруппу простых переполнений буфера даже без оптимизации в вызовах встроенных функций GCC, таких как__builtin_memcpy, которые соответствуют стандартным функциям. В любом случае, параметр предупреждает только о подмножестве переполнений буфера, обнаруженных соответствующими встроенными средствами проверки переполнения. Например, параметр выведет предупреждение для вызоваstrcpyниже, потому что он копирует как минимум 5 символов (строка"blue", включая завершающий NUL) в буфер размером 4.enum Color { blue, purple, yellow }; const char* f (enum Color clr) { static char buf [4]; const char *str; switch (clr) { case blue: str = "blue"; break; case purple: str = "purple"; break; case yellow: str = "yellow"; break; } return strcpy (buf, str); // warning here }Параметр -Wstringop-overflow=2 включён по умолчанию.
-Wstringop-overflow-Wstringop-overflow=1-
Параметр -Wstringop-overflow=1 использует проверку размера объекта типа 0 для определения размеров объектов назначения. Это значение по умолчанию для параметра. В этом режиме параметр не будет предупреждать о записи за границами подобъектов больших объектов, доступных через указатели, если не известен размер самого большого окружающего объекта. Когда назначение может быть одним из нескольких объектов, предполагается, что это самый большой из них. В системах Linux, при включённой оптимизации в этом режиме, параметр предупреждает о том же коде, что и при определении макроса
_FORTIFY_SOURCEне равным нулю. -Wstringop-overflow=2-
Параметр -Wstringop-overflow=2 использует проверку размера объекта типа 1 для определения размеров объектов назначения. В этом режиме параметр будет предупреждать о переполнениях при записи в члены самых больших полных объектов, точный размер которых известен. Однако он не будет предупреждать о чрезмерной записи в те же члены неизвестных объектов, на которые ссылаются указатели, поскольку они могут указывать на массивы, содержащие неизвестное количество элементов.
-Wstringop-overflow=3-
Параметр -Wstringop-overflow=3 использует проверку размера объекта типа 2 для определения размеров объектов назначения. В этом режиме параметр предупреждает о переполнении самого маленького объекта или элемента данных. Это самый ограниченный режим параметра, который может привести к предупреждениям для безопасного кода.
-Wstringop-overflow=4Параметр -Wstringop-overflow=4 использует проверку размера объекта типа 3 для определения размеров объектов назначения. В этом режиме параметр будет предупреждать о переполнении любых элементов данных и когда назначение является одним из нескольких объектов, использует размер наибольшего из них, чтобы решить, выдавать ли предупреждение. Аналогично -Wstringop-overflow=3, этот режим параметра может привести к предупреждениям для безобидного кода.
-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.
-Walloc-zero-
Предупреждать о вызовах функций выделения памяти, помеченных атрибутом
alloc_size, которые указывают на ноль байт, включая те, которые обращаются к встроенным формам функцийaligned_alloc,alloca,calloc,malloc, иrealloc. Поскольку поведение этих функций при вызове с нулевым размером различается в разных реализациях (и в случаеreallocбыло устаревшим) полагаться на это может привести к скрытым проблемам переносимости, и следует избегать этого. -Walloc-size-larger-than=n-
Предупреждать о вызовах функций, помеченных атрибутом
alloc_size, которые пытаются выделить объекты размером больше, чем указанное количество байт, или где результат вычисления размера в целочисленном типе с бесконечной точностью превыситSIZE_MAX / 2. Аргумент опции n может заканчиваться одним из стандартных суффиксов, обозначающих кратные байтам, таких какkBиKiBдля килобайта и кибибайта соответственно,MBиMiBдля мегабайта и мебибайта и так далее. -Walloc-size-larger-than=PTRDIFF_MAX включено по умолчанию. Предупреждения, управляемые опцией, можно отключить, указав n равное SIZE_MAX или больше. См. Атрибуты функций. -Walloca-
Данная опция предупреждает обо всех использования
allocaв исходном коде. -Walloca-larger-than=n-
Эта опция предупреждает о вызовах
alloca, которые не ограничены управляющим предикатом, ограничивающим аргумент целочисленного типа до максимального значения n байт, или вызовахalloca, где граница неизвестна. Аргументы нецелочисленных типов считаются неограниченными, даже если они кажутся ограниченными ожидаемым диапазоном.Например, ограниченный случай
allocaможет выглядеть так:void func (size_t n) { void *p; if (n <= 1000) p = alloca (n); else p = malloc (n); f (p); }В приведенном выше примере передача
-Walloca-larger-than=1000не вызовет предупреждение, потому что вызовallocaизвестен как не более 1000 байт. Однако, если передать-Walloca-larger-than=500, компилятор выведет предупреждение.С другой стороны, неограниченное использование - это использование
allocaбез управляющего предиката, ограничивающего его целочисленный аргумент. Например:void func () { void *p = alloca (n); f (p); }Если передать
-Walloca-larger-than=500, вышеприведенное вызовет предупреждение, но на этот раз из-за отсутствия проверки границ.Обратите внимание, что даже, казалось бы, правильный код, использующий целые числа со знаком, может вызвать предупреждение:
void func (signed int n) { if (n < 500) { p = alloca (n); f (p); } }В приведенном выше примере n может быть отрицательным, что приведет к тому, что аргумент, больше ожидаемого, будет неявно преобразован в вызов
alloca.Эта опция также предупреждает при использовании
allocaв цикле.Это предупреждение не включено по умолчанию с -Wall и активно только при включенной опции -ftree-vrp (по умолчанию для -O2 и выше).
См. также -Wvla-larger-than=n.
-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.
-Wbool-operation-
Предупреждать о подозрительных операциях над выражениями булевого типа. Например, битовое отрицание булевого значения, очень вероятно, является ошибкой в программе. Для C, это предупреждение также предупреждает об инкременте или декременте булевого значения, что редко имеет смысл. (В C++, декремент булевого значения всегда недопустим. Инкремент булевого значения недопустим в C++1z и устарел в противном случае.)
Это предупреждение включено по умолчанию в -Wall.
-Wduplicated-branches-
Предупреждать, когда у if-else есть одинаковые ветви. Это предупреждение обнаруживает случаи, такие как
if (p != NULL) return 0; else return 0;
Оно не предупреждает, когда обе ветви содержат только пустую операцию. Это предупреждение также срабатывает для условных операторов:
int i = x ? *p : *p;
-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. См. Смешанные объявления.
-Wshadow-
Предупреждение, когда локальная переменная или объявление типа затеняют другую переменную, параметр, тип, член класса (в C++) или экземпляра (в Objective-C), или когда затеняется встроенная функция. Обратите внимание, что в C++ компилятор предупреждает, если локальная переменная затеняет явное определение типа, но не если она затеняет структуру/класс/перечисление. То же, что и -Wshadow=global.
-Wno-shadow-ivar (Objective-C only)-
Не выдавать предупреждение, когда локальная переменная затеняет переменную экземпляра в методе Objective-C.
-Wshadow=global-
По умолчанию для -Wshadow. Предупреждает о любом (глобальном) затенении.
-Wshadow=local-
Предупреждение, когда локальная переменная затеняет другую локальную переменную или параметр. Это предупреждение включено параметром -Wshadow=global.
-Wshadow=compatible-local-
Предупреждение, когда локальная переменная затеняет другую локальную переменную или параметр, тип которого совместим с типом затеняющей переменной. В C++ совместимость типов здесь означает, что тип затеняющей переменной может быть преобразован в тип затеняемой переменной. Создание этого флага (в дополнение к -Wshadow=local) основано на идее, что когда локальная переменная затеняет другую с несовместимым типом, это, скорее всего, намеренно, а не ошибка или опечатка, как показано в следующем примере:
for (SomeIterator i = SomeObj.begin(); i != SomeObj.end(); ++i) { for (int i = 0; i < N; ++i) { ... } ... }Поскольку две переменные
iв примере выше имеют несовместимые типы, включение только -Wshadow=compatible-local не выведет предупреждение. Поскольку их типы несовместимы, если программист случайно использует одну вместо другой, проверка типов поймает это и выведет ошибку или предупреждение. Таким образом, отсутствие предупреждения (о затенении) в этом случае не приведёт к незамеченным ошибкам. Использование этого флага вместо -Wshadow=local может, возможно, уменьшить количество предупреждений, вызванных преднамеренным затенением.Это предупреждение включено параметром -Wshadow=local.
-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. -Waligned-new-
Предупреждение об операторе new-выражения типа, который требует большего выравнивания, чем
alignof(std::max_align_t), но использует функцию выделения без явного параметра выравнивания. Этот параметр включён с -Wall.Обычно это предупреждает только о глобальных функциях выделения, но -Waligned-new=all также предупреждает о функциях выделения членов класса.
-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, которые конструируют объект в последнем члене структуры, тип которой является массивом из одного элемента, а размер которого меньше размера конструируемого объекта. В то время как предыдущий пример будет диагностироваться, следующая конструкция использует расширение flexible member array, чтобы избежать предупреждения на уровне 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. -Wpointer-compare-
Предупреждать, если указатель сравнивается с нулевым символом. Обычно это означает, что указатель должен был быть разыменован. Например:
const char *p = foo (); if (p == '\0') return 42;
Обратите внимание, что код выше некорректен в C++11.
Это предупреждение включено по умолчанию.
-Wtype-limits-
Предупреждать, если сравнение всегда истинно или всегда ложно из-за ограниченного диапазона типа данных, но не предупреждать для константных выражений. Например, предупреждать, если беззнаковое переменная сравнивается с нулём с
<или>=. Это предупреждение также включается -Wextra. -Wcomment-Wcomments-
Предупреждать, когда последовательность начала комментария «/*» появляется в комментарии «/*», или когда обратный слэш-новая строка появляется в комментарии «//». Это предупреждение включается -Wall.
-Wtrigraphs-
Предупреждать, если встречаются триграфы, которые могут изменить значение программы. Триграфы внутри комментариев не предупреждают, за исключением тех, которые сформируют эскейп-новые строки.
Этот параметр подразумевается -Wall. Если -Wall не задан, этот параметр всё ещё включён, если триграфы не включены. Чтобы получить преобразование триграфов без предупреждений, но получить другие предупреждения -Wall, используйте ‘-trigraphs -Wall -Wno-trigraphs’.
-Wundef-
Предупреждать, если неопределённый идентификатор оценивается в директиве
#if. Такие идентификаторы заменяются нулём. -Wexpansion-to-defined-
Предупреждать всякий раз, когда встречается «defined» при развёртывании макроса (включая случай, когда макрос развёртывается директивой «#if»). Такое использование не переносимо. Это предупреждение также включается -Wpedantic и -Wextra.
-Wunused-macros-
Предупреждать о макросах, определённых в основном файле, которые не используются. Макрос считается используемым, если он развёртывается или проверяется на существование хотя бы один раз. Препроцессор также предупреждает, если макрос не был использован в момент его переопределения или удаления.
Встроенные макросы, макросы, определённые на командной строке, и макросы, определённые в файлах включения, не предупреждают.
Примечание: Если макрос фактически используется, но используется только в пропущенных условных блоках, то препроцессор сообщает о нём как об unused. Чтобы избежать предупреждения в таком случае, вы можете улучшить область определения макроса, например, перемещая его в первый пропущенный блок. В качестве альтернативы, вы можете предоставить фиктивное использование, используя что-то вроде:
#if defined the_macro_causing_the_warning #endif
-Wno-endif-labels-
Не предупреждать, когда
#elseили#endifследуют за текстом. Это иногда происходит в старых программах с кодом вида#if FOO … #else FOO … #endif FOO
Вторая и третья
FOOдолжны быть в комментариях. Это предупреждение включено по умолчанию. -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.
-Wc++1z-compat (C++ and Objective-C++ only)-
Предупреждать о C++ конструкциях, значение которых отличается между ISO C++ 2014 и предстоящим ISO C++ 2017(?). Это предупреждение включается -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. -Wsubobject-linkage (C++ and Objective-C++ only)-
Предупреждать, если тип класса имеет базовый класс или поле, тип которого использует анонимное пространство имён или зависит от типа без связи. Если тип A зависит от типа B без связи или внутренней связи, его определение в нескольких единицах трансляции будет нарушением ODR, потому что значение B различно в каждой единице трансляции. Если A появляется только в одной единице трансляции, лучший способ предотвратить предупреждение — предоставить ему внутреннюю связь, поместив его также в анонимное пространство имён. Компилятор не выдаёт это предупреждение для типов, определённых в главном файле .C, так как у них маловероятно несколько определений. -Wsubobject-linkage включено по умолчанию.
-Wdangling-else
-
Предупреждение о конструкциях, где может возникнуть неоднозначность, к какому оператору
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 (); } }Это предупреждение включено флагом -Wparentheses.
-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-elt-size-
Предупреждать о подозрительных вызовах встроенной функции
memset, если первый аргумент ссылается на массив, а третий аргумент – число, равное количеству элементов, но не равно размеру массива в памяти. Это указывает на то, что пользователь опустил умножение на размер элемента. Это предупреждение включено флагом -Wall. -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-
Предупреждать об использовании логического отрицания в левом операнде сравнения. Эта опция не предупреждает, если правый операнд рассматривается как булево выражение. Её цель – обнаружить подозрительный код, подобный следующему:
int a; … if (!a > 1) { … }Можно подавить предупреждение, заключив левую часть в скобки:
if ((!a) > 1) { … }Это предупреждение включено флагом -Wall.
-Waggregate-return-
Предупреждать при определении или вызове функций, возвращающих структуры или объединения. (В языках, где можно вернуть массив, это также вызывает предупреждение.)
-Wno-aggressive-loop-optimizations-
Предупреждать, если в цикле с постоянным числом итераций компилятор обнаруживает неопределённое поведение в каком-либо операторе во время одной или нескольких итераций.
-Wno-attributes-
Не выводить предупреждения, если используется неожиданный
__attribute__, такой как нераспознанные атрибуты, атрибуты функций, применённые к переменным и т. д. Это не останавливает ошибки из-за неправильного использования поддерживаемых атрибутов. -Wno-builtin-declaration-mismatch-
Предупреждать, если встроенная функция объявлена с неправильной сигнатурой. Это предупреждение включено по умолчанию.
-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, «SUPERSCRIPT LATIN SMALL LETTER 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, но этот атрибут не оказывает никакого влияния на расположение или размер структуры. Такие структуры могут быть неправильно выровнены с небольшой пользой. Например, в этом коде переменная
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-
Предупреждать, если что-либо объявлено более одного раза в одном и том же объёме, даже в случаях, когда несколько объявлений допустимо и ничего не меняет.
-Wrestrict-
Предупреждать, когда аргумент, переданный в параметр с квалификатором restrict, является алиасом другого аргумента.
-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++. -Wint-in-bool-context-
Предупреждать о подозрительном использовании целочисленных значений там, где ожидаются булевы значения, такие как условные выражения (?:) использующие целочисленные константы, не являющиеся булевыми, в булевом контексте, например
if (a <= b ? 2 : 3). Или сдвиг влево для целых со знаком в булевом контексте, напримерfor (a = 0; 1 << a; a++);. То же самое для всех видов умножений независимо от типа данных. Это предупреждение включено в -Wall. -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 о массивах переменной длины.
-Wvla-larger-than=n-
Если этот параметр используется, компилятор будет предупреждать об использовании массивов переменной длины, где размер либо не ограничен, либо ограничен аргументом, который может быть больше, чем n байт. Это аналогично тому, как работает -Walloca-larger-than=n, но с массивами переменной длины.
Обратите внимание, что GCC может оптимизировать небольшие массивы переменной длины с известным значением в обычные массивы, поэтому это предупреждение может не сработать для таких массивов.
Это предупреждение не включено параметром -Wall и активно только при включении -ftree-vrp (по умолчанию для -O2 и выше).
См. также -Walloca-larger-than=n.
-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. Современные компиляторы обычно позволяют использовать строковые константы, намного длиннее минимального предела стандарта, но очень переносимые программы должны избегать использования более длинных строк.
Предел применяется после конкатенации строковых констант и не включает завершающий нуль. В C90 предел составлял 509 символов; в C99 он был увеличен до 4095. C++98 не определяет нормативный минимальный максимум, поэтому мы не диагностируем чрезмерно длинные строки в C++.
Этот параметр подразумевается параметром -Wpedantic, и его можно отключить с помощью -Wno-overlength-strings.
-Wunsuffixed-float-constants (C and Objective-C only)-
Выдавать предупреждение для любой плавающей константы, у которой нет суффикса. При совместном использовании с -Wsystem-headers это предупреждает о таких константах в системных заголовочных файлах. Это может быть полезно при подготовке кода к использованию с
FLOAT_CONST_DECIMAL64пragma из расширения десятичных чисел с плавающей точкой для 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-7.5.0/gcc/Warning-Options.html