Spec-Zone.ru › GCC 12

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- со старыми компиляторами, но если что-то пойдёт не так, компилятор предупредит о наличии неизвестного параметра.

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

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

-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 не вызывает предупреждений при использовании альтернативных ключевых слов, имена которых начинаются и заканчиваются символом __. Этот альтернативный формат также может быть использован для отключения предупреждений для не-ISO типов __intN, т.е. __intN__. Предупреждения 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)  
-Warray-compare 
-Warray-parameter=2 (C and Objective-C only) 
-Wbool-compare  
-Wbool-operation  
-Wc++11-compat  -Wc++14-compat  
-Wcatch-value (C++ and Objective-C++ only)  
-Wchar-subscripts  
-Wcomment  
-Wdangling-pointer=2  
-Wduplicate-decl-specifier (C and Objective-C only) 
-Wenum-compare (in C/ObjC; this is on by default in C++) 
-Wformat   
-Wformat-overflow  
-Wformat-truncation  
-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++) 
-Wmismatched-dealloc 
-Wmismatched-new-delete (only for C/C++) 
-Wmissing-attributes 
-Wmissing-braces (only for C/ObjC) 
-Wmultistatement-macros  
-Wnarrowing (only for C++)  
-Wnonnull  
-Wnonnull-compare  
-Wopenmp-simd 
-Wparentheses  
-Wpessimizing-move (only for C++)  
-Wpointer-sign  
-Wrange-loop-construct (only for C++)  
-Wreorder   
-Wrestrict   
-Wreturn-type  
-Wsequence-point  
-Wsign-compare (only in C++)  
-Wsizeof-array-div 
-Wsizeof-pointer-div 
-Wsizeof-pointer-memaccess 
-Wstrict-aliasing  
-Wstrict-overflow=1  
-Wswitch  
-Wtautological-compare  
-Wtrigraphs  
-Wuninitialized  
-Wunknown-pragmas  
-Wunused-function  
-Wunused-label     
-Wunused-value     
-Wunused-variable  
-Wuse-after-free=3  
-Wvla-parameter (C and Objective-C only) 
-Wvolatile-register-var  
-Wzero-length-bounds

Обратите внимание, что некоторые флаги предупреждений не подразумеваются -Wall. Некоторые из них предупреждают о конструкциях, которые пользователи обычно не считают сомнительными, но которые иногда можно проверить; другие предупреждают о конструкциях, которые необходимы или сложны в некоторых случаях, и нет простого способа изменить код для подавления предупреждения. Некоторые из них включены -Wextra, но многие из них необходимо включать индивидуально.

-Wextra

Это включает дополнительные флаги предупреждений, которые не включены -Wall. (Эта опция раньше называлась -W. Старое имя всё ещё поддерживается, но новое имя более описательное.)

-Wclobbered  
-Wcast-function-type  
-Wdeprecated-copy (C++ only) 
-Wempty-body  
-Wenum-conversion (C only) 
-Wignored-qualifiers 
-Wimplicit-fallthrough=3 
-Wmissing-field-initializers  
-Wmissing-parameter-type (C only)  
-Wold-style-declaration (C only)  
-Woverride-init  
-Wsign-compare (C only) 
-Wstring-compare 
-Wredundant-move (only for C++)  
-Wtype-limits  
-Wuninitialized  
-Wshift-negative-value (in C++11 to C++17 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++) Базовый класс не инициализируется в конструкторе копирования производного класса.
-Wabi (C, Objective-C, C++ and Objective-C++ only)

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

Поскольку G++ теперь по умолчанию обновляет ABI с каждым основным выпуском, обычно -Wabi предупреждает только о проблемах совместимости ABI C++ при добавлении проверки позже в серии релизов, если возникла проблема ABI, обнаруженная после первоначального выпуска. -Wabi предупреждает о большем количестве вещей, если выбрана более старая версия ABI (с -fabi-version=n).

-Wabi также может использоваться с явным номером версии, чтобы предупредить о совместимости ABI C++ с конкретным уровнем -fabi-version, например, -Wabi=2, чтобы предупредить об изменениях по отношению к -fabi-version=2.

Если указан явный номер версии, а -fabi-compat-version не указан, номер версии из этой опции используется для псевдонимов совместимости. Если явный номер версии не указан с этой опцией, но -fabi-compat-version указан, этот номер версии используется для предупреждений ABI C++.

Хотя предприняты усилия для предупреждения обо всех таких случаях, вероятно, есть некоторые случаи, о которых не предупреждают, даже если G++ генерирует несовместимый код. Также могут быть случаи, когда предупреждения выдаются, даже если сгенерированный код совместим.

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

Известные несовместимости в -fabi-version=2 (который был по умолчанию от GCC 3.4 до 4.9) включают:

  • Шаблон с параметром шаблона без типа типа ссылки был неправильно искажён:
    extern int N;
    template <int &> struct S {};
    void n (S<N>) {2}

    Это было исправлено в -fabi-version=3.

  • Типы векторов SIMD, объявленные с помощью __attribute ((vector_size)), были искажены нестандартным способом, который не позволяет перегружать функции, принимающие векторы разных размеров.

    Искажение было изменено в -fabi-version=4.

  • __attribute ((const)) и noreturn были искажены как квалификаторы типов, и decltype обычного объявления было сложено.

    Эти проблемы с искажением были исправлены в -fabi-version=5.

  • Перечислители с областью действия, передаваемые в качестве аргументов вариативной функции, повышаются как перечислители без области действия, что заставляет va_arg жаловаться. На большинстве платформ это фактически не влияет на ABI передачи параметров, так как нет способа передать аргумент меньше, чем int.

    Кроме того, ABI изменил искажение пакетов параметров шаблона, const_cast, static_cast, префиксное инкрементирование/декрементирование и функцию области класса, используемую как параметр шаблона.

    Эти проблемы были исправлены в -fabi-version=6.

  • Лямбды в области по умолчанию были неправильно искажены, и ABI изменил искажение nullptr_t.

    Эти проблемы были исправлены в -fabi-version=7.

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

    Это было исправлено в -fabi-version=8, по умолчанию для GCC 5.1.

  • decltype(nullptr) неправильно имел выравнивание 1, что приводило к невыровненному доступу. Обратите внимание, что это не повлияло на ABI функции с параметром nullptr_t, так как параметры имеют минимальное выравнивание.

    Это было исправлено в -fabi-version=9, по умолчанию для GCC 5.2.

  • Специфичные для платформы атрибуты, влияющие на идентичность типа, такие как вызовы ia32 на типе функции (stdcall, regparm и т.д.), не влияли на искажённое имя, что приводило к конфликтам имён при использовании указателей на функции в качестве параметров шаблона.

    Это было исправлено в -fabi-version=10, по умолчанию для GCC 6.1.

Эта опция также включает предупреждения о изменениях, связанных с psABI. Известные изменения psABI на данный момент включают:

  • Для SysV/x86-64 объединения с long double членами передаются в памяти как указано в psABI. До GCC 4.4 это не так. Например:
    union U {
      long double ld;
      int i;
    };

    union U теперь всегда передаётся в памяти.

-Wchar-subscripts

Выдавать предупреждение, если индекс массива имеет тип char. Это частая причина ошибок, так как программисты часто забывают, что этот тип на некоторых машинах со знаком. Это предупреждение включено -Wall.

-Wno-coverage-mismatch

Выдавать предупреждение, если профили обратной связи не совпадают при использовании опции -fprofile-use. Если исходный файл изменён между компиляцией с -fprofile-generate и с -fprofile-use, файлы с профилем обратной связи могут не соответствовать исходному файлу, и GCC не сможет использовать информацию профиля обратной связи. По умолчанию это предупреждение включено и обрабатывается как ошибка. -Wno-coverage-mismatch можно использовать для отключения предупреждения, или -Wno-error=coverage-mismatch для отключения ошибки. Отключение ошибки для этого предупреждения может привести к плохо оптимизированному коду и полезно только в случае очень незначительных изменений, таких как исправление ошибок в существующей базе кода. Полное отключение предупреждения не рекомендуется.

-Wno-coverage-invalid-line-number

Выдавать предупреждение, если функция завершается раньше, чем начинается, из-за неверных макросов номера строки. Предупреждение выдаётся только при включённом --coverage.

По умолчанию это предупреждение включено и обрабатывается как ошибка. -Wno-coverage-invalid-line-number можно использовать для отключения предупреждения, или -Wno-error=coverage-invalid-line-number для отключения ошибки.

-Wno-cpp (C, Objective-C, C++, Objective-C++ and Fortran only)

Подавлять сообщения о предупреждениях, выдаваемые директивами #warning.

-Wdouble-promotion (C, C++, Objective-C and Objective-C++ only)

Выдавать предупреждение, когда значение типа float неявно преобразуется в double. ЦП с 32-битным блоком обработки чисел с плавающей запятой «single-precision» реализуют 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 также проверяет аргументы формата null для нескольких функций, -Wformat также подразумевает -Wnonnull. Некоторые аспекты этого уровня проверки форматов можно отключить с помощью параметров: -Wno-format-contains-nul, -Wno-format-extra-args и -Wno-format-zero-length. -Wformat включено с помощью -Wall.

-Wformat=2

Включить -Wformat плюс дополнительные проверки форматов. В настоящее время эквивалентно -Wformat -Wformat-nonliteral -Wformat-security -Wformat-y2k.

-Wno-format-contains-nul

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

-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, равных нулю, завершающий символ NUL ('\0') , добавленный функцией в буфер назначения, будет записан за его пределами. Увеличение размера буфера на один байт достаточно, чтобы избежать предупреждения, хотя этого может быть недостаточно, чтобы избежать переполнения.

void f (int a, int b)
{
  char buf [13];
  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-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, что обычно происходит при оптимизациях в большинстве целей. Точность предупреждений зависит от используемых опций оптимизации.

-Winfinite-recursion

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

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

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

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

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

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

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

Данная опция управляет предупреждениями при отсутствии указания типа в объявлении. Это предупреждение включено по умолчанию в C99 и более поздних диалектах C, а также в -Wall.

-Wno-implicit-function-declaration (C and Objective-C only)

Данная опция управляет предупреждениями, когда функция используется до своего объявления. Это предупреждение включено по умолчанию в C99 и более поздних диалектах C, а также в -Wall. Предупреждение преобразуется в ошибку с помощью -pedantic-errors.

-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 пропускается к следующей. Например:

switch (cond)
  {
  case 1:
    a = 1;
    break;
  case 2:
    a = 2;
  case 3:
    a = 3;
    break;
  }

Это предупреждение не срабатывает, когда последнее утверждение в ветви не может быть пропущено, например, когда есть оператор return или вызов функции, объявленной с атрибутом noreturn. -Wimplicit-fallthrough= также учитывает управляющие операторы, такие как if, и предупреждает только в случае необходимости. Например:

switch (cond)
  {
  case 1:
    if (i > 3) {
      bar (5);
      break;
    } else if (i < 1) {
      bar (0);
    } else
      return;
  default:
    …
  }

Поскольку в некоторых случаях пропуск ветви 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.

-Wno-if-not-aligned (C, C++, Objective-C and Objective-C++ only)

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

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

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

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

-Wno-ignored-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-attributes

Предупреждать, если в объявлении функции отсутствует один или несколько атрибутов, с которыми объявлена связанная функция, и отсутствие которых может негативно повлиять на правильность или эффективность генерируемого кода. Например, предупреждение выдается для объявлений псевдонимов, которые используют атрибуты для указания менее жестких требований, чем у их целевых функций. Это обычно указывает на потенциальную возможность оптимизации. Напротив, опция -Wattribute-alias=2 управляет предупреждениями, которые выдаются, когда псевдоним более строгий, чем целевая функция, что может привести к неправильной генерации кода. Рассматриваемые атрибуты включают alloc_align, alloc_size, cold, const, hot, leaf, malloc, nonnull, noreturn, nothrow, pure, returns_nonnull, и returns_twice.

В C++, предупреждение выдается, когда явная специализация шаблонной функции, объявленной с атрибутом alloc_align, alloc_size, assume_aligned, format, format_arg, malloc, или nonnull, объявляется без него. Атрибуты deprecated, error, и warning подавляют предупреждение. (см. Функциональные атрибуты).

Можно использовать атрибут copy для применения того же набора атрибутов к объявлению, что и в другом объявлении, без явного перечисления атрибутов. Этот атрибут можно применять к объявлениям функций (см. Общие атрибуты функций), переменных (см. Общие атрибуты переменных) или типов (см. Общие атрибуты типов).

-Wmissing-attributes включено в -Wall.

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

template <class T>
T* __attribute__ ((malloc, alloc_size (1)))
allocate (size_t);

template <>
void* __attribute__ ((malloc))   // missing alloc_size
allocate<void> (size_t);
-Wmissing-braces

Предупреждать, если инициализатор агрегата или объединения не полностью заключен в скобки. В следующем примере инициализатор a не полностью заключен в скобки, а инициализатор b заключен полностью.

int a[2][2] = { 0, 1, 2, 3 };
int b[2][2] = { { 0, 1 }, { 2, 3 } };

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

-Wmissing-include-dirs (C, C++, Objective-C, Objective-C++ and Fortran only)

Предупреждение, если указанный пользователем каталог включаемых файлов не существует. Этот параметр по умолчанию отключен для C, C++, Objective-C и Objective-C++. Для Fortran он частично включен по умолчанию, выдавая предупреждение только для -I и -J.

-Wno-missing-profile

Этот параметр управляет предупреждениями, если отсутствуют профили обратной связи при использовании параметра -fprofile-use. Этот параметр диагностирует случаи, когда новая функция или новый файл добавляются между компиляцией с -fprofile-generate и -fprofile-use без перегенерации профилей. В этих случаях файлы данных профилей обратной связи не содержат никакой информации о профилях обратной связи для новой функции или файла соответственно. Также, в случае удаления файлов данных профилей подсчета (.gcda), GCC не может использовать никакую информацию о профилях обратной связи. Во всех этих случаях выдается предупреждение, чтобы сообщить вам о необходимости шага генерации профилей. Игнорирование предупреждения может привести к плохо оптимизированному коду. -Wno-missing-profile можно использовать для отключения предупреждения, но это не рекомендуется и следует делать только тогда, когда отсутствующие данные профилей оправданы.

-Wmismatched-dealloc

Предупреждение о вызовах функций освобождения с указателями-аргументами, возвращаемыми функциями выделения, для которых предыдущая не является подходящей функцией освобождения. Пара функций может быть связана как соответствующие функции выделения и освобождения с помощью атрибута malloc. За исключением случаев, когда параметр -fno-builtin отключен, стандартные функции calloc, malloc, realloc, и free, а также соответствующие формы C++ operator new и operator delete неявно связаны как соответствующие функции выделения и освобождения. В приведенном примере mydealloc является функцией освобождения для указателей, возвращаемых функцией myalloc.

void mydealloc (void*);

__attribute__ ((malloc (mydealloc, 1))) void*
myalloc (size_t);

void f (void)
{
  void *p = myalloc (32);
  // …use p…
  free (p);   // warning: not a matching deallocator for myalloc
  mydealloc (p);   // ok
}

В C++, связанный параметр -Wmismatched-new-delete диагностирует несоответствия, связанные с operator new или operator delete.

Параметр -Wmismatched-dealloc включен в -Wall.

-Wmultistatement-macros

Предупреждение об опасных макросах с несколькими операторами, которые, похоже, защищены клаузой, такой как if, else, for, switch, или while, в которой после развёртывания макроса защищен только первый оператор.

Например:

#define DOIT x++; y++
if (c)
  DOIT;

будет увеличивать y безусловно, а не только тогда, когда c истинно. Это обычно можно исправить, заключив макрос в цикл do-while:

#define DOIT do { x++; y++; } while (0)
if (c)
  DOIT;

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

-Wparentheses

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

Также предупреждает, если встречается сравнение, такое как x<=y<=z; это эквивалентно (x<=y ? 1 : 0) <= z, что является другим толкованием, чем в обычной математической нотации.

Также предупреждает об опасном использовании расширения GNU для ?: с опущенным средним операндом. Когда условие в операторе ? — булево выражение, опушенное значение всегда 1. Программисты часто ожидают, что это будет значение, вычисленное внутри условного выражения.

Для C++ это также предупреждает о некоторых случаях ненужных скобок в объявлениях, которые могут указывать на попытку вызова функции вместо объявления:

{
  // Declares a local variable called mymutex.
  std::unique_lock<std::mutex> (mymutex);
  // User meant std::unique_lock<std::mutex> lock (mymutex);
}

Это предупреждение включено в -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 Readings по адресу https://gcc.gnu.org/readings.html.

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

-Wno-return-local-addr

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

-Wreturn-type

Предупреждение, когда функция определена с типом возврата, который имеет значение по умолчанию int. Также предупреждение об операторе return без возвращаемого значения в функции, тип возврата которой не void (выход за пределы тела функции считается возвратом без значения).

Только для C, предупреждение об операторе return с выражением в функции, тип возврата которой void, если тип выражения также void. В качестве расширения GNU, в последнем случае предупреждение не выдается, если не используется -Wpedantic. Попытка использовать значение возврата не-void функции, отличной от main, которая выходит за пределы, достигая закрывающей фигурной скобки, завершающей тело функции, имеет неопределённое поведение.

В отличие от C, в C++ выход за пределы тела не-void функции, отличной от main, приводит к неопределённому поведению, даже если значение функции не используется.

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

-Wno-shift-count-negative

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

-Wno-shift-count-overflow

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

-Wshift-negative-value

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

-Wno-shift-overflow
-Wshift-overflow=n

Эти параметры управляют предупреждениями о переполнении при сдвиге влево.

-Wshift-overflow=1

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

-Wshift-overflow=2

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

-Wswitch

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

-Wswitch-default

Предупреждение, когда оператор switch не имеет метки default case.

-Wswitch-enum

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

-Wno-switch-bool

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

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

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

-Wno-switch-outside-range

Этот параметр управляет предупреждениями, когда значение case в операторе switch находится за пределами диапазона соответствующего типа. Это предупреждение включено по умолчанию для программ на C и C++.

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

-Wtrivial-auto-var-init

Выдавать предупреждение, когда -ftrivial-auto-var-init не может инициализировать автоматическую переменную. Часто это происходит с автоматической переменной, объявленной между управляющим выражением и первой меткой case оператора switch.

-Wunused-but-set-parameter

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

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

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

-Wunused-but-set-variable

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

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

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

-Wunused-function

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

-Wunused-label

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

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

-Wunused-local-typedefs (C, Objective-C, C++ and Objective-C++ only)

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

-Wunused-parameter

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

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

-Wno-unused-result

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

-Wunused-variable

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

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

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

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

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

-Wunused-const-variable=1

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

-Wunused-const-variable=2

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

-Wunused-value

Выдавать предупреждение, когда оператор вычисляет результат, который явно не используется. Для подавления этого предупреждения преобразуйте неиспользуемое выражение к типу void. Это включает выражение-оператор или левую часть выражения с запятой, не содержащего побочных эффектов. Например, выражение x[i,j] вызывает предупреждение, а x[(void)i,j] — нет.

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

-Wunused

Все вышеперечисленные параметры -Wunused объединены.

Для получения предупреждения о неиспользуемом параметре функции необходимо указать либо -Wextra -Wunused (обратите внимание, что -Wall подразумевает -Wunused), либо отдельно -Wunused-parameter.

-Wuninitialized

Выдавать предупреждение, если объект с автоматическим или выделенным сроком хранения используется без инициализации. В C++, также предупреждать, если нестатическая ссылка или нестатический const член появляется в классе без конструкторов.

Кроме того, передача указателя (или, в C++, ссылки) на неинициализированный объект в const-квалифицированный аргумент встроенной функции, известной тем, что она считывает объект, также распознаётся этим предупреждением. (-Wmaybe-uninitialized выдаётся для обычных функций.)

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

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

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

В C++, это предупреждение также предупреждает об использовании неинициализированных объектов в списках инициализаторов членов. Например, GCC предупреждает о b в следующем фрагменте:

struct A {
  int a;
  int b;
  A() : a(b) { }
};
-Wno-invalid-memory-model

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

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

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

-Wmaybe-uninitialized

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

Кроме того, передача указателя (или, в C++, ссылки) на неинициализированный объект в const-квалифицированный аргумент функции также диагностируется этим предупреждением. (-Wuninitialized выдаётся для встроенных функций, которые известны тем, что считывают объект.) Разметка функции атрибутом access (none) указывает, что аргумент не используется для доступа к объекту и избегает предупреждения (см. Общие атрибуты функций).

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

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

-Wno-prio-ctor-dtor

Не выдавать предупреждения, если для конструктора или деструктора используется приоритет от 0 до 100. Использование атрибутов конструктора и деструктора позволяет назначить приоритет конструктору/деструктору для управления порядком его выполнения до вызова main или после его возврата. Значения приоритета должны быть больше 100, так как компилятор резервирует значения приоритета от 0 до 100 для реализации.

-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+разыменование на стадии обработки исходного кода: *(int*)&some_float. Если оптимизация включена, он также работает на стадии оптимизации, где он обрабатывает несколько случаев с использованием информации о точке назначения, чувствительной к потоку. Предупреждает только тогда, когда преобразованный указатель разыменовывается. Не предупреждает о неполных типах.

-Wstrict-overflow
-Wstrict-overflow=n

Этот параметр активен только при определении переполнения со знаком как неопределённого. Он предупреждает о случаях, когда компилятор оптимизирует, основываясь на предположении, что переполнение со знаком не происходит. Обратите внимание, что он не предупреждает обо всех случаях, когда код может переполниться: он предупреждает только о случаях, когда компилятор реализует какую-либо оптимизацию. Таким образом, это предупреждение зависит от уровня оптимизации.

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

-Wstrict-overflow=1

Предупреждать о случаях, которые являются одновременно сомнительными и легко избежимыми. Например, компилятор упрощает x + 1 > x до 1. Этот уровень -Wstrict-overflow включён в -Wall; более высокие уровни нет, и их необходимо явно запросить.

-Wstrict-overflow=2

Также предупреждать об других случаях, когда сравнение упрощается до константы. Например: abs (x) >= 0. Это может быть упрощено только при неопределённом переполнении целых чисел со знаком, потому что 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. Это сообщается только на самом высоком уровне предупреждений, потому что это упрощение применяется ко многим сравнениям, поэтому этот уровень предупреждений даёт очень большое количество ложных срабатываний.

-Wstring-compare

Предупреждать о вызовах strcmp и strncmp, результат которых определяется как нулевой или ненулевой в тестах на равенство из-за того, что длина одного аргумента больше размера массива, в котором хранится другой аргумент (или границы в случае strncmp). Такие вызовы могут быть ошибками. Например, вызов strcmp ниже диагностируется, потому что его результат обязательно ненулевой независимо от содержимого массива a.

extern char a[4];
void f (char *d)
{
  strcpy (d, "string");
  …
  if (0 == strcmp (a, d))   // cannot be true
    puts ("a and d are the same");
}

-Wstring-compare включён в -Wextra.

-Wno-stringop-overflow
-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, это значение параметра может привести к предупреждениям для доброкачественного кода.

-Wno-stringop-overread

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

Параметр -Wstringop-overread включён по умолчанию.

-Wno-stringop-truncation

Не выдавать предупреждений для вызовов ограниченных функций манипулирования строками, таких как strncat, strncpy, и stpncpy, которые могут либо усекать скопированную строку, либо оставить место назначения неизменённым.

В следующем примере вызов strncat задаёт границу, которая меньше длины исходной строки. В результате копия исходной строки будет усечена, и поэтому вызов будет диагностирован. Чтобы избежать предупреждения, используйте bufsize - strlen (buf) - 1) в качестве границы.

void append (char *buf, size_t bufsize)
{
  strncat (buf, ".txt", 3);
}

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

void copy (char *d, const char *s)
{
  strncpy (d, s, strlen (s));
}

В следующем примере вызов strncpy задаёт размер буфера назначения как границу. Если длина исходной строки равна или больше этого размера, результат копии не будет завершён нулём. Поэтому вызов также диагностируется. Чтобы избежать предупреждения, укажите sizeof buf - 1 в качестве границы и установите последний элемент буфера в NUL.

void copy (const char *s)
{
  char buf[80];
  strncpy (buf, s, sizeof buf);
  …
}

В ситуациях, когда массив символов предназначен для хранения последовательности байтов без завершающего NUL, такой массив может быть аннотирован атрибутом nonstring для предотвращения этого предупреждения. Однако такие массивы не являются подходящими аргументами для функций, которые ожидают NUL-завершённые строки. Для помощи в обнаружении случайных неправильных применений таких массивов GCC выдаёт предупреждения, если не может доказать, что использование безопасно. См. Общие атрибуты переменных.

-Wsuggest-attribute=[pure|const|noreturn|format|cold|malloc]

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

-Wsuggest-attribute=pure
-Wsuggest-attribute=const
-Wsuggest-attribute=noreturn
-Wmissing-noreturn
-Wsuggest-attribute=malloc

Предупреждать о функциях, которые могут быть кандидатами на атрибуты pure, const или noreturn или malloc. Компилятор предупреждает только о функциях, видимых в других единицах компиляции, или (в случае 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-attribute=cold

Предупреждать о функциях, которые могут быть кандидатами на атрибут cold . Это основано на статическом обнаружении и обычно предупреждает только о функциях, которые всегда приводят к вызову другой функции cold , такой как обертки C++ throw или функции отчёта об ошибках, приводящие к abort.

-Walloc-zero

Предупреждать о вызовах функций выделения, помеченных атрибутом alloc_size , которые задают нулевое количество байтов, включая те, которые относятся к встроенным формам функций aligned_alloc, alloca, calloc, malloc, и realloc. Поскольку поведение этих функций при вызове с нулевым размером отличается в разных реализациях (и в случае realloc было устаревшим), полагание на это может привести к скрытым проблемам портируемости и должно быть избегаемо.

-Walloc-size-larger-than=byte-size

Предупреждать о вызовах функций, помеченных атрибутом alloc_size , которые пытаются выделить объекты размером больше, чем указанное количество байтов, или где результат вычисления размера в целочисленном типе с бесконечной точностью превысит значение ‘PTRDIFF_MAX’ на целевой платформе. -Walloc-size-larger-than=‘PTRDIFF_MAX’ включено по умолчанию. Предупреждения, контролируемые опцией, могут быть отключены путём указания byte-size ‘SIZE_MAX’ или больше или путём -Wno-alloc-size-larger-than. См. Атрибуты функций.

-Wno-alloc-size-larger-than

Отключить предупреждения -Walloc-size-larger-than=. Опция эквивалентна -Walloc-size-larger-than=‘SIZE_MAX’ или больше.

-Walloca

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

-Walloca-larger-than=byte-size

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

-Walloca-larger-than=‘PTRDIFF_MAX’ включено по умолчанию, но обычно эффективно только при активном -ftree-vrp (по умолчанию для -O2 и выше).

См. также -Wvla-larger-than=‘byte-size’.

-Wno-alloca-larger-than

Отключить предупреждения -Walloca-larger-than=. Опция эквивалентна -Walloca-larger-than=‘SIZE_MAX’ или больше.

-Warith-conversion

Выдавать предупреждения о неявных преобразованиях при арифметических операциях, даже если преобразование операндов к одному типу не может изменить их значения. Это затрагивает предупреждения от -Wconversion, -Wfloat-conversion и -Wsign-conversion.

void f (char c, int i)
{
  c = c + i; // warns with -Wconversion
  c = c + 1; // only warns with -Warith-conversion
}
-Warray-bounds
-Warray-bounds=n

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

-Warray-bounds=1

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

-Warray-bounds=2

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

-Warray-compare

Предупреждать о равенствах и сравнениях между двумя операндами типа массива. Это сравнение было устаревшим в C++20. Например:

int arr1[5];
int arr2[5];
bool same = arr1 == arr2;

-Warray-compare включен в -Wall.

-Warray-parameter
-Warray-parameter=n

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

Если первое объявление функции использует форму массива, предполагается, что размер, указанный в массиве, представляет собой минимальное количество элементов, ожидаемых при вызовах функции, и максимальное количество элементов, обработаемых ею. Отсутствие аргументов достаточного размера или доступ к большему количеству элементов, чем максимальное, может быть диагностировано предупреждениями, такими как -Warray-bounds. На уровне 1 предупреждение диагностирует несоответствия, связанные с параметрами массива, объявленными с использованием формы T[static N].

Например, предупреждение срабатывает при следующих повторных объявлениях, потому что первое позволяет передавать массив любого размера в f, в то время как второе с ключевым словом static указывает, что аргумент массива должен иметь по крайней мере четыре элемента.

void f (int[static 4]);
void f (int[]);           // warning (inconsistent array form)

void g (void)
{
  int *p = (int *)malloc (4);
  f (p);                  // warning (array too small)
  …
}

На уровне 2 предупреждение также срабатывает при повторных объявлениях, включающих любое другое несоответствие в формах аргументов массива или указателя, обозначающих размеры массивов. Указатели и массивы с неопределённым размером считаются эквивалентными и не вызывают предупреждения.

void g (int*);
void g (int[]);     // no warning
void g (int[8]);    // warning (inconsistent array bound)

-Warray-parameter=2 включено в -Wall. Опция -Wvla-parameter активирует предупреждения для аналогичных несоответствий, связанных с аргументами переменной длины массива.

-Wattribute-alias=n
-Wno-attribute-alias

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

-Wattribute-alias=1

По умолчанию предупреждение -Wattribute-alias диагностирует несовместимости между типом объявления псевдонима и типом его целевого объекта. Такие несовместимости обычно указывают на ошибки.

-Wattribute-alias=2

На этом уровне -Wattribute-alias также диагностирует случаи, когда атрибуты объявления псевдонима более ограничительны, чем атрибуты, применённые к его целевому объекту. Эти несоответствия потенциально могут привести к некорректной генерации кода. В других случаях они могут быть безобидными и могут быть решены простым добавлением отсутствующего атрибута к целевому объекту. Для сравнения см. опцию -Wmissing-attributes, которая управляет диагностикой, когда объявление псевдонима менее ограничительно, чем целевой объект, а не более.

Рассматриваемые атрибуты включают alloc_align, alloc_size, cold, const, hot, leaf, malloc, nonnull, noreturn, nothrow, pure, returns_nonnull, и returns_twice.

-Wattribute-alias эквивалентно -Wattribute-alias=1. Это значение по умолчанию. Вы можете отключить эти предупреждения с помощью -Wno-attribute-alias или -Wattribute-alias=0.

-Wbidi-chars=[none|unpaired|any|ucn]

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

GCC поддерживает три уровня предупреждений. По умолчанию используется -Wbidi-chars=unpaired, которое предупреждает о неправильно завершенных контекстах двунаправленности. -Wbidi-chars=none отключает предупреждение. -Wbidi-chars=any предупреждает обо всех используемых символах двунаправленности.

По умолчанию это предупреждение не предупреждает об UCN. Однако включить проверку UCN можно с помощью -Wbidi-chars=unpaired,ucn или -Wbidi-chars=any,ucn. Использование -Wbidi-chars=ucn является допустимым и эквивалентно -Wbidi-chars=unpaired,ucn, если ранее не указывалось -Wbidi-chars=any.

-Wbool-compare

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

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

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

-Wbool-operation

Предупреждать о подозрительных операциях над выражениями булевского типа. Например, побитовое отрицание булевой переменной, скорее всего, является ошибкой в программе. В C это предупреждение также предупреждает об инкременте или декременте булевой переменной, что редко имеет смысл. (В C++ декремент булевой переменной всегда недопустим. Инкремент булевой переменной недопустим в C++17 и устарел в противном случае.)

Это предупреждение включено в -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.

-Wzero-length-bounds

Предупреждать об обращениях к элементам членов массива нулевой длины, которые могут перекрывать другие члены того же объекта. Объявление внутренних массивов нулевой длины не рекомендуется, так как обращение к ним не определено. См. Нулевая длина.

Например, первые два сохранения в функции bad диагностируются, потому что элементы массива перекрывают последующие члены b и c. Третье сохранение диагностируется -Warray-bounds, потому что оно выходит за пределы окружающего объекта.

struct X { int a[0]; int b, c; };
struct X x;

void bad (void)
{
  x.a[0] = 0;   // -Wzero-length-bounds
  x.a[1] = 1;   // -Wzero-length-bounds
  x.a[2] = 2;   // -Warray-bounds
}

Опция -Wzero-length-bounds включена в -Warray-bounds.

-Wno-div-by-zero

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

-Wsystem-headers

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

-Wtautological-compare

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

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

Это предупреждение также предупреждает о побитовых сравнениях, которые всегда оцениваются как истинными или ложными, например:

if ((a & 16) == 10) { … }

всегда будет ложным.

Это предупреждение включено в -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++ компилятор предупреждает, если локальная переменная затеняет явное typedef, но не затеняет struct/class/enum. Если это предупреждение включено, оно также включает все случаи локального затенения. Это означает, что -Wno-shadow=local и -Wno-shadow=compatible-local игнорируются при использовании -Wshadow. То же самое, что и -Wshadow=global.

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

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

-Wshadow=global

Предупреждать о любом затенении. То же самое, что -Wshadow.

-Wshadow=local

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

-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 может потенциально уменьшить количество предупреждений, вызванных намеренным затенением. Обратите внимание, что это также означает, что затенение const char *i переменной char *i не выдаёт предупреждение.

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

-Wlarger-than=byte-size

Предупреждать, когда объект определяется размером, превышающим byte-size. -Wlarger-than=‘PTRDIFF_MAX’ включено по умолчанию. Предупреждения, управляемые этим параметром, можно отключить, указав byte-size ‘SIZE_MAX’ или большее значение, или с помощью -Wno-larger-than.

Также предупреждать о вызовах ограниченных функций, таких как memchr или strnlen, которые указывают границу, превышающую максимальный возможный объект, который по умолчанию составляет ‘PTRDIFF_MAX’ байтов. Эти предупреждения могут быть отключены только с помощью -Wno-larger-than.

-Wno-larger-than

Отключить предупреждения -Wlarger-than=. Параметр эквивалентен -Wlarger-than=‘SIZE_MAX’ или большему значению.

-Wframe-larger-than=byte-size

Предупреждать, если размер кадра функции превышает byte-size. Вычисление, выполняемое для определения размера стека фрейма, приблизительное и не консервативное. Фактические требования могут быть несколько больше, чем byte-size, даже если предупреждение не выдаётся. Кроме того, любая выделенная память через alloca, массивы переменной длины или аналогичные конструкции не включаются компилятором при определении того, следует ли выдавать предупреждение или нет. -Wframe-larger-than=‘PTRDIFF_MAX’ включено по умолчанию. Предупреждения, управляемые этим параметром, можно отключить, указав byte-size ‘SIZE_MAX’ или большее значение, или с помощью -Wno-frame-larger-than.

-Wno-frame-larger-than

Отключить предупреждения -Wframe-larger-than=. Параметр эквивалентен -Wframe-larger-than=‘SIZE_MAX’ или большему значению.

-Wfree-nonheap-object

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

void f (char *p)
{
  p = stpcpy (p, "abc");
  // ...
  free (p);   // warning
}

-Wfree-nonheap-object включено в -Wall.

-Wstack-usage=byte-size

Предупреждать, если использование стека функции может превысить byte-size. Вычисление, выполняемое для определения использования стека, консервативное. Любая память, выделенная с помощью alloca, массивов переменной длины или аналогичных конструкций, включается компилятором при определении того, следует ли выдавать предупреждение или нет.

Сообщение соответствует выводу -fstack-usage.

  • Если использование стека полностью статическое, но превышает указанную величину, это:
    warning: stack usage is 1120 bytes
  • Если использование стека (частично) динамическое, но ограниченное, это:
    warning: stack usage might be 1648 bytes
  • Если использование стека (частично) динамическое и не ограничено, это:
    warning: stack usage might be unbounded

-Wstack-usage=‘PTRDIFF_MAX’ включено по умолчанию. Предупреждения, управляемые этим параметром, можно отключить, указав byte-size ‘SIZE_MAX’ или большее значение, или с помощью -Wno-stack-usage.

-Wno-stack-usage

Отключить предупреждения -Wstack-usage=. Параметр эквивалентен -Wstack-usage=‘SIZE_MAX’ или большему значению.

-Wunsafe-loop-optimizations

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

-Wno-pedantic-ms-format (MinGW targets only)

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

-Wpointer-arith

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

-Wno-pointer-compare

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

const char *p = foo ();
if (p == '\0')
  return 42;

Обратите внимание, что приведенный выше код недействителен в C++11.

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

-Wtsan

Предупреждать об отсутствующих функциях в ThreadSanitizer.

ThreadSanitizer не поддерживает std::atomic_thread_fence и может сообщать ложные срабатывания.

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

-Wtype-limits

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

-Wabsolute-value (C and Objective-C only)

Предупреждать о вызовах стандартных функций, вычисляющих абсолютное значение аргумента, когда доступна более подходящая стандартная функция. Например, вызов abs(3.14) вызывает предупреждение, так как для вычисления абсолютного значения аргумента типа double должна быть использована функция fabs. Опция также вызывает предупреждения, когда аргумент в вызове такой функции имеет беззнаковый тип. Это предупреждение можно подавить явным приведением типа, и оно также включено -Wextra.

-Wcomment
-Wcomments

Предупреждать всякий раз, когда последовательность начала комментария ‘/*’ появляется в комментарии ‘/*’ или всякий раз, когда обратный слэш-новая строка появляется в комментарии ‘//’. Это предупреждение включено -Wall.

-Wtrigraphs

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

Эта опция подразумевается -Wall. Если -Wall не задано, эта опция по-прежнему включена, если триграммы не включены. Чтобы получить преобразование триграмм без предупреждений, но получить другие предупреждения -Wall, используйте ‘-trigraphs -Wall -Wno-trigraphs’.

-Wundef

Предупреждать, если неопределённый идентификатор оценивается в директиве #if. Такие идентификаторы заменяются нулём.

-Wexpansion-to-defined

Предупреждать всякий раз, когда ‘defined’ встречается при развёртывании макроса (включая случай, когда макрос развёртывается директивой ‘#if’). Такое использование не является переносимым. Это предупреждение также включено -Wpedantic и -Wextra.

-Wunused-macros

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

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

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

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

-Wc11-c2x-compat (C and Objective-C only)

Предупреждать о функциях, отсутствующих в ISO C11, но присутствующих в ISO C2X. Например, предупреждать об опущении строки в _Static_assert, использовании синтаксиса ‘[[]]’ для атрибутов, использовании десятичных типов с плавающей запятой и так далее. Эта опция независима от режима стандартов. Предупреждения отключаются в выражении, следующей за __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++17-compat (C++ and Objective-C++ only)

Предупреждать о конструкциях C++, значение которых отличается между ISO C++ 2014 и ISO C++ 2017. Это предупреждение включено -Wall.

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

Предупреждать о конструкциях C++, значение которых отличается между ISO C++ 2017 и ISO C++ 2020. Это предупреждение включено -Wall.

-Wno-c++11-extensions (C++ and Objective-C++ only)

Не предупреждать о конструкциях C++11 в коде, компилируемом с более старым стандартом C++. Даже без этой опции, некоторые конструкции C++11 будут диагностироваться только при использовании -Wpedantic.

-Wno-c++14-extensions (C++ and Objective-C++ only)

Не предупреждать о конструкциях C++14 в коде, компилируемом с более старым стандартом C++. Даже без этой опции, некоторые конструкции C++14 будут диагностироваться только при использовании -Wpedantic.

-Wno-c++17-extensions (C++ and Objective-C++ only)

Не предупреждать о конструкциях C++17 в коде, компилируемом с более старым стандартом C++. Даже без этой опции, некоторые конструкции C++17 будут диагностироваться только при использовании -Wpedantic.

-Wno-c++20-extensions (C++ and Objective-C++ only)

Не предупреждать о конструкциях C++20 в коде, компилируемом с более старым стандартом C++. Даже без этой опции, некоторые конструкции C++20 будут диагностироваться только при использовании -Wpedantic.

-Wno-c++23-extensions (C++ and Objective-C++ only)

Не предупреждать о конструкциях C++23 в коде, компилируемом с более старым стандартом C++. Даже без этой опции, некоторые конструкции C++23 будут диагностироваться только при использовании -Wpedantic.

-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 * на машинах, где целые числа могут быть доступны только на границах в 2 или 4 байта.

-Wcast-align=strict

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

-Wcast-function-type

Предупреждать, когда указатель на функцию приводится к несовместимому указателю на функцию. При приведении, включающем типы функций с переменным списком аргументов, рассматриваются только типы начальных аргументов, которые предоставляются. Любой параметр типа указателя соответствует любому другому типу указателя. Любые несущественные различия в целочисленных типах игнорируются, например, int против long на целевых ILP32. Аналогично, квалификаторы типа игнорируются. Тип функции void (*) (void) является специальным и соответствует всем значениям, что можно использовать для подавления этого предупреждения. При приведении, включающем типы указателей на члены, это предупреждение предупреждает всякий раз, когда приведение типа изменяет тип указателя на член. Это предупреждение включено -Wextra.

-Wwrite-strings

При компиляции C, присвойте константам строк тип const char[length], чтобы копирование адреса одной в не-const char * указатель выдавало предупреждение. Эти предупреждения помогают найти в момент компиляции код, который может попытаться записать в константу строки, но только если вы очень тщательно использовали const в объявлениях и прототипах. В противном случае это просто раздражает. Именно поэтому мы не заставили -Wall запрашивать эти предупреждения.

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

-Wclobbered

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

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

Предупреждения о преобразовании арифметики из малого типа обратно в этот тип выдаются только с -Warith-conversion.

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

-Wdangling-pointer
-Wdangling-pointer=n

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

-Wdangling-pointer=1

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

int f (int c1, int c2, x)
{
  char *p = strchr ((char[]){ c1, c2 }, c3);
  return p ? *p : 'x';   // warning: dangling pointer to a compound literal
}

В следующей функции сохранение адреса локальной переменной x в переданном указателе *p также вызывает предупреждение.

void g (int **p)
{
  int x = 7;
  *p = &x;   // warning: storing the address of a local variable in *p
}
-Wdangling-pointer=2

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

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

void f (char *s)
{
  if (!s)
    {
      char a[12] = "tmpname";
      s = a;
    }
  strcat (s, ".tmp");   // warning: dangling pointer to a may be used
  ...
}

-Wdangling-pointer=2 включен в -Wall.

-Wdate-time

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

-Wempty-body

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

-Wno-endif-labels

Не выводить предупреждений о случайных маркерах после #else и #endif.

-Wenum-compare

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

-Wenum-conversion

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

-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

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

-Wsizeof-array-div

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

int fn ()
{
  int arr[10];
  return sizeof (arr) / sizeof (short);
}

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

-Wsizeof-pointer-div

Предупреждать о подозрительных делениях двух выражений sizeof, которые делят размер указателя на размер элемента, что обычно используется для вычисления размера массива, но не будет работать корректно с указателями. Это предупреждение выводится, например, о sizeof (ptr) / sizeof (ptr[0]) если ptr не является массивом, а указателем. Это предупреждение включено -Wall.

-Wsizeof-pointer-memaccess

Предупреждать о подозрительных параметрах длины для определённых встроенных функций строк и памяти, если аргумент использует sizeof. Это предупреждение срабатывает, например, для memset (ptr, 0, sizeof (ptr)); если ptr не является массивом, а указателем, и предлагает возможные исправления, или о memcpy (&foo, ptr, sizeof (&foo));. -Wsizeof-pointer-memaccess также предупреждает о вызовах ограниченных функций копирования строк, таких как strncat или strncpy, которые указывают в качестве ограничения выражение sizeof исходного массива. Например, в следующей функции вызов strncat указывает размер исходной строки в качестве ограничения. Это почти наверняка ошибка, поэтому вызов диагностируется.

void make_file (const char *name)
{
  char path[PATH_MAX];
  strncpy (path, name, sizeof path - 1);
  strncat (path, ".text", sizeof ".text");
  …
}

Опция -Wsizeof-pointer-memaccess включена -Wall.

-Wno-sizeof-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 f (void);
void g (void)
{
  if (!func)   // warning: expression evaluates to false
    abort ();
}

сравнениях указателя на строковый литерал, например, в

void f (const char *x)
{
  if (x == "abc")   // warning: expression evaluates to false
    puts ("equal");
}

и проверках результатов сложения или вычитания указателей на равенство нулю, например, в

void f (const int *p, int i)
{
  return p + i == NULL;
}

Такие использования обычно указывают на ошибку программиста: адрес большинства функций и объектов обязательно оценивается как истинное значение (исключение составляют слабые символы), поэтому их использование в условном операторе может указывать на пропущенные скобки в вызове функции или пропущенный разыменовывание в выражении с массивом. Подмножество предупреждения для указателей на объекты может быть подавлено приведением указателя-операнда к целому типу, например, к inptr_t или uinptr_t. Сравнения со строковыми литералами приводят к неопределённому поведению и не являются переносимыми, и предполагают, что целью было вызвать strcmp. Предупреждение подавляется, если подозрительное выражение является результатом макрорасширения. Предупреждение -Waddress включено по умолчанию с -Wall.

-Wno-address-of-packed-member

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

-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-attributes= можно подавить предупреждения об неизвестных атрибутах с областью действия (в C++11 и C2X). Например, -Wno-attributes=vendor::attr отключает предупреждение об следующем объявлении:

[[vendor::attr]] void f();

Также можно отключить предупреждение обо всех атрибутах в пространстве имён, используя -Wno-attributes=vendor::, что предотвращает предупреждение об обоих этих объявлениях:

[[vendor::safe]] void f();
[[vendor::unsafe]] void f2();

Обратите внимание, что -Wno-attributes= не подразумевает -Wno-attributes.

-Wno-builtin-declaration-mismatch

Предупреждать, если встроенная функция объявлена с несовместимой сигнатурой или как не функция, или если встроенная функция, объявленная с типом, не включающим прототип, вызывается с аргументами, типы которых после преобразования не соответствуют типам, ожидаемым функцией. При указании -Wextra также предупреждать, если встроенная функция, принимающая аргументы, объявлена без прототипа. Предупреждение -Wbuiltin-declaration-mismatch включено по умолчанию. Чтобы избежать предупреждения, включите соответствующий заголовок, чтобы прототипы встроенных функций были в области видимости.

Например, вызов memset ниже диагностируется предупреждением, потому что функция ожидает значение типа size_t в качестве аргумента, но тип 32 равен int. С -Wextra объявление функции также диагностируется.

extern void* memset ();
void f (void *d)
{
  memset (d, '\0', 32);
}
-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)

Предупреждать, если используется определение функции старого стиля. Предупреждение выдаётся, даже если имеется предыдущий прототип. Определение с использованием ‘()’ не считается определением старого стиля в режиме C2X, потому что в этом случае оно эквивалентно ‘(void)’, но считается определением старого стиля для более старых стандартов.

-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 этот параметр не предупреждает об универсальном инициализаторе нулевого значения ‘{ 0 }’:

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

Аналогично, в C++ этот параметр не предупреждает об пустом инициализаторе { }:

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

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

-Wno-missing-requires

По умолчанию компилятор предупреждает об id концепта, появляющегося как простое требование C++20:

bool satisfied = requires { C<T> };

Здесь ‘satisfied’ будет истинным, если ‘C<T>’ является допустимым выражением, что верно для всех T. Вероятно, пользователь хотел написать

bool satisfied = requires { requires C<T> };

поэтому ‘satisfied’ истинно только если концепция ‘C’ удовлетворяется для типа ‘T’.

Это предупреждение можно отключить с помощью -Wno-missing-requires.

-Wno-missing-template-keyword

Операторы доступа к членам ., -> и :: должны следовать за ключевым словом template если родительский объект является зависимым, а имя члена — шаблон.

template <class X>
void DoStuff (X x)
{
  x.template DoSomeOtherStuff<X>(); // Good.
  x.DoMoreStuff<X>(); // Warning, x is dependent.
}

В редких случаях могут возникать ложные срабатывания. Чтобы их устранить, поместите выражение в скобки. Например, следующее считается шаблоном, даже когда m и N являются целыми числами:

void NotATemplate (my_class t)
{
  int N = 5;

  bool test = t.m < N > (0); // Treated as a template.
  test = (t.m < N) > (0); // Same meaning, but not treated as a template.
}

Это предупреждение можно отключить с помощью -Wno-missing-template-keyword.

-Wno-multichar

Не выводить предупреждение, если используется многосимвольная константа (‘'FOOF'’). Обычно они указывают на ошибку в коде пользователя, так как они имеют значения, определяемые реализацией, и не должны использоваться в переносимом коде.

-Wnormalized=[none|id|nfc|nfkc]

В ISO C и ISO C++ два идентификатора различны, если они являются разными последовательностями символов. Однако иногда, когда используются символы за пределами основного набора символов ASCII, у вас могут быть две разные последовательности символов, которые выглядят одинаково. Чтобы избежать путаницы, стандарт ISO 10646 устанавливает некоторые правила нормализации, которые, при применении, гарантируют, что две последовательности, которые выглядят одинаково, преобразуются в одну и ту же последовательность. GCC может предупреждать вас, если вы используете идентификаторы, которые не были нормализованы; этот параметр контролирует это предупреждение.

GCC поддерживает четыре уровня предупреждений. По умолчанию используется -Wnormalized=nfc, которое предупреждает об идентификаторах, не находящихся в нормализованной форме «C» ISO 10646, NFC. NFC является рекомендуемой формой для большинства случаев использования. Она эквивалентна -Wnormalized.

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

Некоторые символы в ISO 10646 имеют различные значения, но выглядят одинаково в некоторых шрифтах или методах отображения, особенно после применения форматирования. Например \u207F, «верхний индекс латинская строчная буква n», отображается так же, как обычная n , которая размещена в верхнем индексе. ISO 10646 определяет схему нормализации NFKC для преобразования всех этих символов в стандартную форму, и GCC предупреждает, если ваш код не находится в NFKC, если вы используете -Wnormalized=nfkc. Это предупреждение сопоставимо с предупреждением о каждом идентификаторе, содержащем букву O, так как она может быть спутана с цифрой 0, и поэтому не является по умолчанию, но может быть полезно в качестве локальной соглашения об кодировании, если среда программирования не может отобразить эти символы различительно.

-Wno-attribute-warning

Не предупреждать о использовании функций (см. Атрибуты функций) объявленных с warning атрибутом. По умолчанию это предупреждение включено. -Wno-attribute-warning можно использовать для отключения предупреждения, или -Wno-error=attribute-warning для отключения ошибки при компиляции с флагом -Werror.

-Wno-deprecated

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

-Wno-deprecated-declarations

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

-Wno-overflow

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

-Wno-odr

Предупреждать о нарушениях Правила одной дефиниции во время оптимизации на этапе линковки. Включено по умолчанию.

-Wopenacc-parallelism

Предупреждать о потенциально неэффективных решениях, связанных с параллелизмом OpenACC.

-Wopenmp-simd

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

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

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

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

-Wno-override-init-side-effects (C and Objective-C only)

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

-Wpacked

Предупреждать, если структуре присваивается атрибут packed, но атрибут packed не влияет на расположение или размер структуры. Такие структуры могут быть неправильно выровнены без существенной пользы. Например, в этом коде переменная f.x в struct bar неправильно выровнена, хотя struct bar сама не имеет атрибута packed:

struct foo {
  int x;
  char a, b, c, d;
} __attribute__((packed));
struct bar {
  char z;
  struct foo f;
};
-Wnopacked-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 для отключения этого предупреждения.

-Wpacked-not-aligned (C, C++, Objective-C and Objective-C++ only)

Предупреждать, если поле структуры с явно указанным выравниванием в структуре или объединении с атрибутом packed выровнено неправильно. Например, будет выдано предупреждение для struct S, как, warning: alignment 1 of 'struct S' is less than 8, в этом коде:

struct __attribute__ ((aligned (8))) S8 { char a[8]; };
struct __attribute__ ((packed)) S {
  struct S8 s8;
};

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

-Wpadded

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

-Wredundant-decls

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

-Wrestrict

Предупреждать, когда к объекту, на который ссылается параметр с квалификатором restrict (или, в C++, с квалификатором __restrict) имеет доступ другой аргумент, или когда копии между такими объектами перекрываются. Например, вызов функции strcpy ниже пытается обрезать строку, заменяя ее начальные символы последними четырьмя. Однако, поскольку вызов записывает завершающий NUL в a[4], копии перекрываются, и вызов диагностируется.

void foo (void)
{
  char a[] = "abcd1234";
  strcpy (a, a + 4);
  …
}

Параметр -Wrestrict обнаруживает некоторые примеры простого перекрытия даже без оптимизации, но лучше всего работает при -O2 и выше. Он включён в -Wall.

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

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

-Winline

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

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

-Winterference-size

Предупреждать о использовании C++17 std::hardware_destructive_interference_size без указания его значения с помощью --param destructive-interference-size. Также предупреждать о сомнительных значениях этого параметра.

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

struct independent_fields {
  alignas(std::hardware_destructive_interference_size) std::atomic<int> one;
  alignas(std::hardware_destructive_interference_size) std::atomic<int> two;
};

Здесь ‘one’ и ‘two’ предназначены для того, чтобы они находились достаточно далеко друг от друга, чтобы записи в один не требовали доступа к другому для перезагрузки строки кэша.

По умолчанию --param destructive-interference-size и --param constructive-interference-size устанавливаются на основе текущего параметра -mtune, как правило, равного размеру строки L1 кэша для конкретного целевого процессора, иногда к диапазону, если настройка предназначена для общего целевого процессора. Таким образом, все единицы трансляции, зависящие от совместимости ABI для использования этих переменных, должны быть скомпилированы с тем же параметром -mtune (или -mcpu).

Если стабильность ABI важна, например, если использование находится в заголовке библиотеки, вы, вероятно, не должны использовать переменные размера аппаратных конфликтов вообще. В качестве альтернативы, вы можете принудительно установить определённое значение с помощью --param.

Если вы уверены, что ваше использование переменной не влияет на ABI за пределами одного сборки вашего проекта, вы можете отключить предупреждение с помощью -Wno-interference-size.

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

-Wno-varargs

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

-Wvector-operation-performance

Предупреждать, если операция над векторами не реализована с помощью возможностей SIMD архитектуры. В основном полезно для настройки производительности. Операция над векторами может быть реализована piecewise, что означает, что скалярная операция выполняется над каждым элементом вектора; in parallel, что означает, что операция над векторами реализована с использованием скаляров более широкого типа, что обычно более эффективно с точки зрения производительности; и as a single scalar, что означает, что вектор помещается в скалярный тип.

-Wvla

Предупреждать, если в коде используется массив переменной длины. -Wno-vla предотвращает предупреждение -Wpedantic о массивах переменной длины.

-Wvla-larger-than=byte-size

Если этот параметр используется, компилятор предупреждает о объявлениях массивов переменной длины, размер которых либо неограничен, либо ограничен аргументом, который позволяет размер массива превышать byte-size байт. Это аналогично тому, как работает -Walloca-larger-than=byte-size, но с массивами переменной длины.

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

-Wvla-larger-than=‘PTRDIFF_MAX’ включен по умолчанию, но обычно эффективен только когда активен -ftree-vrp (по умолчанию для -O2 и выше).

См. также -Walloca-larger-than=byte-size.

-Wno-vla-larger-than

Отключить предупреждения -Wvla-larger-than=. Параметр эквивалентен -Wvla-larger-than=‘SIZE_MAX’ или больше.

-Wvla-parameter

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

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

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

void f (int n, int[n]);
void f (int, int[]);     // warning: argument 2 previously declared as a VLA

void g (int n)
{
    if (n > 4)
      return;
    int a[n];
    f (sizeof a, a);     // warning: access to a by f may be out of bounds
  …
}

-Wvla-parameter включен в -Wall. Параметр -Warray-parameter вызывает предупреждения о похожих проблемах, связанных с обычными аргументами-массивами.

-Wvolatile-register-var

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

-Wdisabled-optimization

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

-Wpointer-sign (C and Objective-C only)

Предупреждать об указателях с разными знаками при передаче в качестве аргумента или присваивании. Этот параметр поддерживается только для C и Objective-C. Он подразумевается параметром -Wall и -Wpedantic, которые можно отключить с помощью -Wno-pointer-sign.

-Wstack-protector

Этот параметр активен только когда активен -fstack-protector. Он предупреждает о функциях, которые не защищены от нарушения стека.

-Woverlength-strings

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

Предел применяется после конкатенации строковых констант и не учитывает заключительный символ NUL. В C90 предел составлял 509 символов; в C99 он был повышен до 4095. C++98 не определяет нормативный минимальный максимальный предел, поэтому мы не диагностируем слишком длинные строки в C++.

Этот параметр подразумевается параметром -Wpedantic и может быть отключен с помощью -Wno-overlength-strings.

-Wunsuffixed-float-constants (C and Objective-C only)

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

-Wno-lto-type-mismatch

Во время оптимизации на этапе компоновки не выводить предупреждения о несовпадении типов в глобальных объявлениях из разных единиц компиляции. Требуется включить -flto. Включено по умолчанию.

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

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

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

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

Spec-Zone.ru

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