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. В этом руководстве перечислены только один из двух вариантов, который не является по умолчанию. Для получения дополнительных вариантов, специфичных для языка, также обратитесь к Вариантaм диалекта C++ и Вариантaм диалекта Objective-C и Objective-C++.
Когда запрашивается неизвестный вариант предупреждения (например, -Wunknown-warning), GCC выводит диагностическое сообщение, указывающее, что этот вариант не распознан. Однако, если используется форма -Wno-, поведение немного отличается: диагностическое сообщение для -Wno-unknown-warning не выводится, если не выводятся и другие диагностические сообщения. Это позволяет использовать новые -Wno- варианты со старыми компиляторами, но если что-то пойдёт не так, компилятор предупреждает о наличии нераспознанного варианта.
-
-Wpedantic-pedantic - Выдавать все предупреждения, требуемые строгим ISO C и ISO C++; отклонять все программы, использующие запрещённые расширения, и некоторые другие программы, не соответствующие ISO C и ISO C++. Для ISO C следует версии стандарта ISO C, указанной любым параметром
-std.Правильные программы ISO C и ISO C++ должны компилироваться корректно с этим параметром или без него (хотя редкие программы требуют
-ansiили параметр-std, указывающий требуемую версию ISO C). Однако без этого параметра также поддерживаются некоторые расширения GNU и традиционные функции C и C++. С этим параметром они отклоняются.-Wpedanticне вызывает предупреждений при использовании альтернативных ключевых слов, имена которых начинаются и заканчиваются символом ‘__’. Предупреждения с повышенной строгостью также отключены в выражении, следующего за__extension__. Однако эти обходные пути следует использовать только для системных заголовочных файлов; программы-приложения должны их избегать. См. Альтернативные ключевые слова.Некоторые пользователи пытаются использовать
-Wpedanticдля проверки программ на соответствие строгому стандарту ISO C. Они быстро обнаруживают, что это не совсем то, что им нужно: оно находит некоторые нестандартные практики, но не все — только те, для которых ISO C требует диагностику, и некоторые другие, для которых диагностика была добавлена.Функция для отслеживания несоответствия стандарту ISO C может быть полезна в некоторых случаях, но потребовала бы значительных дополнительных работ и существенно отличалась бы от
-Wpedantic. В ближайшее время мы не планируем поддерживать такую функцию.Если стандарт, указанный с помощью
-std, представляет собой расширенный диалект C от GNU, такой как ‘gnu90’ или ‘gnu99’, существует соответствующий базовый стандарт — версия ISO C, на которой основан расширенный диалект GNU. Предупреждения от-Wpedanticвыдаются там, где они требуются базовым стандартом. (Не имеет смысла выдавать такие предупреждения только для функций, отсутствующих в указанном диалекте GNU C, поскольку по определению диалекты GNU C включают все функции, которые компилятор поддерживает с данным параметром, и не было бы ничего, о чем можно было бы предупредить.) -pedantic-errors- Подобно
-Wpedantic, за исключением того, что генерируются ошибки вместо предупреждений. -Wall- Это включает все предупреждения о конструкциях, которые некоторые пользователи считают сомнительными и которые легко избежать (или изменить, чтобы предотвратить предупреждение), даже в сочетании с макросами. Это также включает некоторые специфичные для языка предупреждения, описанные в Параметрах диалекта C++ и Параметрах диалекта Objective-C и Objective-C++.
-Wallвключает следующие флаги предупреждений:-Waddress -Warray-bounds (only with
-O2) -Wc++11-compat -Wchar-subscripts -Wenum-compare (in C/ObjC; this is on by default in C++) -Wimplicit-int (C and Objective-C only) -Wimplicit-function-declaration (C and Objective-C only) -Wcomment -Wformat -Wmain (only for C/ObjC and unless-ffreestanding) -Wmaybe-uninitialized -Wmissing-braces (only for C/ObjC) -Wnonnull -Wopenmp-simd -Wparentheses -Wpointer-sign -Wreorder -Wreturn-type -Wsequence-point -Wsign-compare (only in C++) -Wstrict-aliasing -Wstrict-overflow=1 -Wswitch -Wtrigraphs -Wuninitialized -Wunknown-pragmas -Wunused-function -Wunused-label -Wunused-value -Wunused-variable -Wvolatile-register-varОбратите внимание, что некоторые флаги предупреждений не подразумеваются параметром
-Wall. Некоторые из них предупреждают о конструкциях, которые пользователи обычно не считают сомнительными, но иногда вам может потребоваться проверить их; другие предупреждают о конструкциях, которые в некоторых случаях необходимы или сложны для избежания, и нет простого способа изменить код, чтобы подавить предупреждение. Некоторые из них включаются параметром-Wextra, но многие из них должны быть включены индивидуально. -Wextra- Это включает некоторые дополнительные флаги предупреждений, которые не включены параметром
-Wall. (Этот параметр раньше назывался-W. Старое название по-прежнему поддерживается, но новое название более описательное.)-Wclobbered -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers -Wmissing-parameter-type (C only) -Wold-style-declaration (C only) -Woverride-init -Wsign-compare -Wtype-limits -Wuninitialized -Wunused-parameter (only with
.-Wunusedor-Wall) -Wunused-but-set-parameter (only with-Wunusedor-Wall)Параметр
-Wextraтакже выводит сообщения о предупреждениях в следующих случаях:- Указатель сравнивается с целым нулём с помощью ‘
<’, ‘<=’, ‘>’ или ‘>=’. - (Только C++) Перечисление и неперечисление присутствуют в условном выражении.
- (Только C++) Неоднозначные виртуальные базовые классы.
- (Только C++) Индексирование массива, объявленного ‘
register’. - (Только C++) Получение адреса переменной, объявленной ‘
register’. - (Только C++) Базовый класс не инициализируется в конструкторе копирования производного класса.
- Указатель сравнивается с целым нулём с помощью ‘
-Wchar-subscripts- Выдавать предупреждение, если индекс массива имеет тип
char. Это частая причина ошибок, так как программисты часто забывают, что этот тип на некоторых машинах со знаком. Это предупреждение включается параметром-Wall. -Wcomment- Выдавать предупреждение всякий раз, когда последовательность начала комментария ‘
/*’ появляется в комментарии ‘/*’, или всякий раз, когда появляется обратный слэш-новая строка в комментарии ‘//’. Это предупреждение включается параметром-Wall. -Wno-coverage-mismatch- Выдавать предупреждение, если профили отзывов не совпадают при использовании параметра
-fprofile-use. Если исходный файл изменяется между компиляцией с параметром-fprofile-genи компиляцией с-fprofile-use, файлы с профилем отзывов могут не совпадать с исходным файлом, и GCC не сможет использовать информацию профиля отзывов. По умолчанию это предупреждение включено и обрабатывается как ошибка.-Wno-coverage-mismatchможет быть использован для отключения предупреждения, или-Wno-error=coverage-mismatchможет быть использован для отключения ошибки. Отключение ошибки для этого предупреждения может привести к плохо оптимизированному коду и полезно только в случае очень незначительных изменений, таких как исправление ошибок в существующем кодовом базисе. Полное отключение предупреждения не рекомендуется. -Wno-cpp-
(Только для C, Objective-C, C++, Objective-C++ и Fortran)
Подавлять сообщения о предупреждениях, выводимые директивами
#warning. -
-Wdouble-promotion(Только для C, C++, Objective-C и Objective-C++) - Выдавать предупреждение, когда значение типа
floatнеявно преобразуется вdouble. ЦП с 32-разрядным "однозначным" плавающим пунктом выполняютfloatв аппаратном обеспечении, но эмулируютdoubleв программном обеспечении. На такой машине выполнение вычислений с использованием значенийdoubleзначительно дороже из-за накладных расходов, необходимых для программной эмуляции.Легко случайно выполнять вычисления с
double, потому что литералы с плавающей запятой неявно имеют типdouble. Например, в:float area(float radius) { return 3.14159 * radius * radius; }компилятор выполняет все вычисления с
double, потому что литерал с плавающей запятой имеет типdouble. -
-Wformat-Wformat=n - Проверять вызовы
printfиscanf, и т.д., чтобы убедиться, что предоставленные аргументы имеют типы, соответствующие указанной строке формата, и что указанные в строке формата преобразования имеют смысл. Это включает стандартные функции и другие, указанные атрибутами формата (см. Атрибуты функций), в семействахprintf,scanf,strftimeиstrfmon(расширение X/Open, отсутствующее в стандарте C) (или других семействах, специфичных для целевой платформы). Какие функции проверяются без указанных атрибутов формата, зависит от выбранной версии стандарта, и такие проверки функций без указанного атрибута отключаются параметрами-ffreestandingили-fno-builtin.Форматы проверяются по отношению к функциям формата, поддерживаемым GNU libc версии 2.2. К ним относятся все функции ISO C90 и C99, а также функции из Single Unix Specification и некоторые расширения BSD и GNU. Другие реализации библиотек могут не поддерживать все эти функции; GCC не поддерживает предупреждения о функциях, которые выходят за рамки ограничений конкретной библиотеки. Однако, если
-Wpedanticиспользуется с-Wformat, выдаются предупреждения о функциях формата, отсутствующих в выбранной версии стандарта (но не для форматовstrfmon, поскольку они не присутствуют ни в одной версии стандарта C). См. Параметры, контролирующие диалект C.-
-Wformat=1-Wformat - Параметр
-Wformatэквивалентен-Wformat=1, а-Wno-formatэквивалентен-Wformat=0. Поскольку-Wformatтакже проверяет нулевые аргументы формата для нескольких функций,-Wformatтакже подразумевает-Wnonnull. Некоторые аспекты этого уровня проверки форматов можно отключить с помощью параметров:-Wno-format-contains-nul,-Wno-format-extra-args, и-Wno-format-zero-length.-Wformatвключается параметром-Wall. -Wno-format-contains-nul- Если указан параметр
-Wformat, не выдавать предупреждение о строках формата, содержащих нулевые байты. -Wno-format-extra-args- Если указан параметр
-Wformat, не выдавать предупреждение об избыточных аргументах для функции форматаprintfилиscanf. Стандарт C предусматривает, что такие аргументы игнорируются.Если неиспользуемые аргументы находятся между используемыми аргументами, указанными с помощью спецификаций номера операнда ‘
$’, обычно всё ещё выдаются предупреждения, так как реализация не может знать, какой тип передать функцииva_argдля пропуска неиспользуемых аргументов. Однако в случае форматовscanfэтот параметр подавляет предупреждение, если все неиспользуемые аргументы являются указателями, так как Single Unix Specification гласит, что такие неиспользуемые аргументы разрешены. -Wno-format-zero-length- Если указан параметр
-Wformat, не выдавать предупреждение о нулевой длине формата. Стандарт C допускает нулевую длину формата. -Wformat=2- Включить
-Wformatплюс дополнительные проверки формата. В настоящее время эквивалентно-Wformat -Wformat-nonliteral -Wformat-security -Wformat-y2k. -Wformat-nonliteral- Если указан параметр
-Wformat, также выдавать предупреждение, если строка формата не является строковым литералом и не может быть проверена, если функция формата не получает аргументы формата какva_list. -Wformat-security- Если указан параметр
-Wformat, также выдавать предупреждение об использовании функций формата, которые представляют возможные проблемы безопасности. В настоящее время это предупреждение о вызовах функцийprintfиscanf, где строка формата не является строковым литералом и не содержат аргументы формата, как вprintf (foo);. Это может быть уязвимостью безопасности, если строка формата получена из ненадежных данных и содержит ‘%n’. (В настоящее время это подмножество того, о чем предупреждает-Wformat-nonliteral, но в будущем к предупреждениям, выдаваемым-Wformat-security, могут быть добавлены предупреждения, которые не включены в-Wformat-nonliteral.) -Wformat-y2k- Если указан параметр
-Wformat, также выдавать предупреждение о форматахstrftime, которые могут давать только двузначный год.
-
-Wnonnull
- Предупреждать о передаче нулевого указателя для аргументов, помеченных как требующие ненулевого значения атрибутом функции
nonnull.-Wnonnullвключено в-Wallи-Wformat. Его можно отключить с помощью опции-Wno-nonnull. -
-Winit-self(Только C, C++, Objective-C и Objective-C++) - Предупреждать об инициализированных переменных, инициализированных самими собой. Обратите внимание, что эта опция может использоваться только с опцией
-Wuninitialized.Например, GCC предупреждает о том, что
iне инициализировано в следующем фрагменте кода только при указании-Winit-self:int f() { int i = i; return i; }Это предупреждение включено
-Wallв C++. -
-Wimplicit-int(Только C и Objective-C) - Предупреждать, когда в объявлении не указан тип. Это предупреждение включено
-Wall. -
-Wimplicit-function-declaration(Только C и Objective-C) - Выводить предупреждение всякий раз, когда функция используется до объявления. В режиме C99 (
-std=c99или-std=gnu99) это предупреждение включено по умолчанию, а в ошибку его преобразует-pedantic-errors. Это предупреждение также включено-Wall. -
-Wimplicit(Только C и Objective-C) - То же, что и
-Wimplicit-intи-Wimplicit-function-declaration. Это предупреждение включено-Wall. -
-Wignored-qualifiers(Только C и C++) - Предупреждать, если тип возвращаемого значения функции имеет квалификатор типа, например,
const. Для ISO C такой квалификатор не имеет эффекта, так как значение, возвращаемое функцией, не является lvalue. Для C++, предупреждение выдается только для скалярных типов илиvoid. ISO C запрещает квалифицированныеvoidтипы возвращаемых значений в определениях функций, поэтому такие типы возвращаемых значений всегда получают предупреждение даже без этой опции.Это предупреждение также включено
-Wextra. -Wmain- Предупреждать, если тип «
main» подозрителен. «main» должен быть функцией с внешней связью, возвращающей int, принимающей либо ноль аргументов, либо два или три аргумента соответствующих типов. Это предупреждение включено по умолчанию в C++ и включается либо-Wall, либо-Wpedantic. -Wmissing-braces- Предупреждать, если инициализатор агрегата или объединения не полностью заключен в скобки. В приведенном ниже примере инициализатор для ‘
a’ не полностью заключен в скобки, а для ‘b’ — полностью. Это предупреждение включено-Wallв C.int a[2][2] = { 0, 1, 2, 3 }; int b[2][2] = { { 0, 1 }, { 2, 3 } };Это предупреждение включено
-Wall. -
-Wmissing-include-dirs(Только C, C++, Objective-C и Objective-C++) - Предупреждать, если указанная пользователем директория включения не существует.
-Wparentheses- Предупреждать, если скобки опущены в определенных контекстах, таких как при присваивании в контексте, где ожидается логическое значение, или при вложенных операторах, приоритет которых люди часто путают.
Также предупреждать, если появляется сравнение, например, ‘
x<=y<=z’; это эквивалентно ‘(x<=y ? 1 : 0) <= z’, что является другим толкованием, отличным от обычных математических обозначений.Также предупреждать о конструкциях, где может возникнуть путаница, к какой
ifинструкции относитсяelseветвь. Вот пример такого случая:{ if (a) if (b) foo (); else bar (); }В C/C++ каждая
elseветвь относится к самой внутренней возможнойifинструкции, которая в данном примере —if (b). Это часто не то, чего ожидал программист, как показано в приведенном выше примере с использованием отступов, которые выбрал программист. Когда существует потенциальная путаница, GCC выдает предупреждение при указании этого флага. Чтобы устранить предупреждение, добавьте явные фигурные скобки вокруг самой внутреннейifинструкции, чтобы не было возможности, чтоelseможет относиться к окружающейif. Результирующий код выглядит так:{ if (a) { if (b) foo (); else bar (); } }Также предупреждать об опасном использовании расширения GNU для
?:с опущенным средним операндом. Когда условие в операторе?: — логическое выражение, опушенное значение всегда равно 1. Часто программисты ожидают, что это будет значение, вычисляемое внутри условного выражения.Это предупреждение включено
-Wall. -Wsequence-point- Предупреждать о коде, у которого могут быть неопределенные семантика из-за нарушений правил точек последовательности в стандартах C и C++.
Стандарты C и C++ определяют порядок вычисления выражений в программе C/C++ в терминах точек последовательности, которые представляют частичный порядок между выполнением частей программы: те, которые выполняются до точки последовательности, и те, которые выполняются после нее. Они появляются после вычисления полного выражения (которое не является частью более крупного выражения), после вычисления первого операнда оператора
&&,||,? :или,(запятой), перед вызовом функции (но после вычисления ее аргументов и выражения, обозначающего вызываемую функцию), и в некоторых других местах. Помимо того, как выражены правила точек последовательности, порядок вычисления подвыражений выражения не определен. Все эти правила описывают только частичный порядок, а не полный порядок, поскольку, например, если две функции вызываются в одном выражении без точки последовательности между ними, порядок вызова функций не определен. Однако комитет стандартов постановил, что вызовы функций не перекрываются.Не определено, когда между точками последовательности изменения значений объектов вступают в силу. Программы, поведение которых зависит от этого, имеют неопределенное поведение; стандарты C и C++ указывают, что «между предыдущей и следующей точкой последовательности значение объекта должно быть изменено не более одного раза в результате вычисления выражения. Более того, предыдущее значение должно быть прочитано только для определения хранимого значения». Если программа нарушает эти правила, результаты на любой конкретной реализации полностью непредсказуемы.
Примеры кода с неопределенным поведением —
a = a++;,a[n] = b[n++]иa[i++] = i;. Некоторые более сложные случаи не диагностируются этой опцией, и она может давать иногда ложноположительные результаты, но в целом она довольно эффективна для обнаружения такого рода проблем в программах.Стандарт сформулирован запутанно, поэтому существуют некоторые споры о точном значении правил точек последовательности в тонких случаях. Ссылки на обсуждения проблемы, включая предлагаемые формальные определения, можно найти на странице GCC readings на странице http://gcc.gnu.org/readings.html.
Это предупреждение включено
-Wallдля C и C++. -Wno-return-local-addr- Не предупреждать о возвращении указателя (или в C++, ссылки) на переменную, область видимости которой выходит за пределы функции после возврата из функции.
-Wreturn-type- Предупреждать всякий раз, когда функция определена с типом возврата, который по умолчанию
int. Также предупреждать о любойreturnинструкции без возвращаемого значения в функции, тип возврата которой неvoid(выход за пределы тела функции считается возвращением без значения), и обreturnинструкции с выражением в функции, тип возврата которойvoid.Для C++, функция без типа возврата всегда генерирует сообщение об ошибке, даже при указании
-Wno-return-type. Исключение составляют ‘main’ и функции, определенные в системных заголовочных файлах.Это предупреждение включено
-Wall. -Wswitch- Предупреждать всякий раз, когда
switchинструкция имеет индекс перечислимого типа и отсутствуетcaseдля одного или нескольких именованных кодов этого перечисления. (Наличие меткиdefaultпредотвращает это предупреждение.) Меткиcaseза пределами диапазона перечисления также вызывают предупреждения при использовании этой опции (даже если есть меткаdefault). Это предупреждение включено-Wall. -Wswitch-default- Предупреждать всякий раз, когда
switchинструкция не имеетdefaultслучая. -Wswitch-enum- Предупреждать всякий раз, когда
switchинструкция имеет индекс перечислимого типа и отсутствуетcaseдля одного или нескольких именованных кодов этого перечисления. Меткиcaseза пределами диапазона перечисления также вызывают предупреждения при использовании этой опции. Единственное отличие между-Wswitchи этой опцией заключается в том, что эта опция выдает предупреждение об опущенном коде перечисления даже если есть меткаdefault. -
-Wsync-nand(Только C и C++) - Предупреждать при использовании встроенных функций
__sync_fetch_and_nandи__sync_nand_and_fetch. Эти функции изменили семантику в GCC 4.4. -Wtrigraphs- Предупреждать, если обнаружены какие-либо триграммы, которые могут изменить смысл программы (триграммы в комментариях не вызывают предупреждения). Это предупреждение включено
-Wall. -Wunused-but-set-parameter- Предупреждать всякий раз, когда параметр функции присваивается, но в противном случае не используется (кроме его объявления).
Чтобы подавить это предупреждение, используйте атрибут ‘
unused’ (см. Атрибуты переменных).Это предупреждение также включено
-Wunusedвместе с-Wextra. -Wunused-but-set-variable- Предупреждать всякий раз, когда локальная переменная присваивается, но в противном случае не используется (кроме ее объявления). Это предупреждение включено
-Wall.Чтобы подавить это предупреждение, используйте атрибут ‘
unused’ (см. Атрибуты переменных).Это предупреждение также включено
-Wunused, которое включено-Wall. -Wunused-function- Предупреждать всякий раз, когда статическая функция объявлена, но не определена, или неиспользуемая статическая функция не является встроенной. Это предупреждение включено
-Wall. -Wunused-label- Предупреждать всякий раз, когда метка объявлена, но не используется. Это предупреждение включено
-Wall.Чтобы подавить это предупреждение, используйте атрибут ‘
unused’ (см. Атрибуты переменных).
-
-Wunused-local-typedefs(C, Objective-C, C++ и Objective-C++ только) - Предупреждать, когда typedef, определённый локально в функции, не используется. Это предупреждение включено опцией
-Wall. -Wunused-parameter- Предупреждать всякий раз, когда параметр функции не используется, кроме как в её объявлении.
Чтобы подавить это предупреждение, используйте атрибут ‘
unused’ (см. Атрибуты переменных). -Wno-unused-result- Не выводить предупреждение, если вызывающая функция, помеченная атрибутом
warn_unused_result(см. Атрибуты функций), не использует её возвращаемое значение. По умолчанию-Wunused-result. -Wunused-variable- Предупреждать всякий раз, когда локальная переменная или статическая переменная, не являющаяся константой, не используется, кроме как в её объявлении. Это предупреждение включено опцией
-Wall.Чтобы подавить это предупреждение, используйте атрибут ‘
unused’ (см. Атрибуты переменных). -Wunused-value- Предупреждать всякий раз, когда оператор вычисляет результат, который явно не используется. Чтобы подавить это предупреждение, приведите неиспользуемое выражение к типу ‘
void’. Это включает выражение-оператор или левую часть выражения с запятой, не содержащего побочных эффектов. Например, выражение, такое как ‘x[i,j]’, вызывает предупреждение, в то время как ‘x[(void)i,j]’ — нет.Это предупреждение включено опцией
-Wall. -Wunused- Все вышеперечисленные
-Wunusedопции объединены.Чтобы получить предупреждение о параметре функции, который не используется, необходимо либо указать
-Wextra -Wunused(обратите внимание, что-Wallподразумевает-Wunused), либо отдельно указать-Wunused-parameter. -Wuninitialized- Предупреждать, если автоматическая переменная используется без предварительной инициализации или если переменная может быть перезаписана вызовом
setjmp. В C++, предупреждать, если нестатическая ссылка или нестатическое ‘const’ член появляется в классе без конструкторов.Если вы хотите предупреждать о коде, использующем неинициализированное значение переменной в своём инициализаторе, используйте опцию
-Winit-self.Эти предупреждения возникают для отдельных неинициализированных или перезаписанных элементов переменных структуры, объединения или массива, а также для переменных, которые не инициализированы или перезаписаны целиком. Они не возникают для переменных или элементов, объявленных
volatile. Поскольку эти предупреждения зависят от оптимизации, точные переменные или элементы, для которых имеются предупреждения, зависят от точных опций оптимизации и используемой версии GCC.Обратите внимание, что может не быть предупреждения о переменной, используемой только для вычисления значения, которое само по себе никогда не используется, потому что такие вычисления могут быть удалены анализом потока данных перед выводом предупреждений.
-Wmaybe-uninitialized- Для автоматической переменной, если существует путь от входа в функцию к использованию переменной, которая инициализирована, но существуют и другие пути, для которых переменная не инициализирована, компилятор выдает предупреждение, если не может доказать, что пути с неинициализированными переменными не будут выполнены во время выполнения. Эти предупреждения сделаны необязательными, потому что GCC недостаточно умён, чтобы увидеть все причины, по которым код может быть правильным, несмотря на видимую ошибку. Вот один пример того, как это может произойти:
{ int x; switch (y) { case 1: x = 1; break; case 2: x = 4; break; case 3: x = 5; } foo (x); }Если значение
yвсегда равно 1, 2 или 3, тоxвсегда инициализируется, но GCC об этом не знает. Чтобы подавить предупреждение, необходимо предоставить обработчик по умолчанию с assert(0) или подобным кодом.Эта опция также предупреждает, когда не-volatile автоматическая переменная может быть изменена вызовом
longjmp. Эти предупреждения также возможны только в режиме компиляции с оптимизациями.Компилятор видит только вызовы
setjmp. Он не может знать, где будет вызванlongjmp; на самом деле, обработчик сигналов может вызвать его в любой точке кода. В результате вы можете получить предупреждение, даже если на самом деле нет проблемы, потому чтоsetjmpфактически не может быть вызван в месте, которое вызвало бы проблему.Некоторые ложные предупреждения можно избежать, если объявить все используемые функции, которые никогда не возвращают значение, как
noreturn. См. Атрибуты функций.Это предупреждение включено опциями
-Wallили-Wextra. -Wunknown-pragmas- Предупреждать при обнаружении директивы
#pragma, которая не поддерживается GCC. Если используется эта опция командной строки, предупреждения выдаются даже для неизвестных пragma в системных заголовочных файлах. Это не так, если предупреждения включены только опцией командной строки-Wall. -Wno-pragmas- Не выдавать предупреждения о неправильном использовании пragma, таких как неправильные параметры, неверный синтаксис или конфликты между пragma. Также см.
-Wunknown-pragmas. -Wstrict-aliasing- Эта опция активна только при активной опции
-fstrict-aliasing. Она предупреждает о коде, который может нарушить строгие правила алиасинга, используемые компилятором для оптимизации. Предупреждение не ловит все случаи, но пытается поймать наиболее распространённые ошибки. Оно включено в-Wall. Оно эквивалентно-Wstrict-aliasing=3 -Wstrict-aliasing=n- Эта опция активна только при активной опции
-fstrict-aliasing. Она предупреждает о коде, который может нарушить строгие правила алиасинга, используемые компилятором для оптимизации. Более высокие уровни соответствуют большей точности (меньше ложноположительных результатов). Более высокие уровни также означают больше усилий, аналогично тому, как работает-O.-Wstrict-aliasingэквивалентно-Wstrict-aliasing=3.Уровень 1: Самый агрессивный, быстрый, наименее точный. Возможно, полезен, когда более высокие уровни не предупреждают, но
-fstrict-aliasingвсё ещё нарушает код, так как имеет очень мало ложноотрицательных результатов. Однако у него много ложноположительных результатов. Предупреждает обо всех преобразованиях указателей между потенциально несовместимыми типами, даже если они никогда не разыменовываются. Работает только в переднем конце.Уровень 2: Агрессивный, быстрый, не очень точный. Может по-прежнему иметь много ложноположительных результатов (хотя не так много, как на уровне 1), и мало ложноотрицательных результатов (но, возможно, больше, чем на уровне 1). В отличие от уровня 1, он предупреждает только при взятии адреса. Предупреждает об неполных типах. Работает только в переднем конце.
Уровень 3 (по умолчанию для
-Wstrict-aliasing): Должен иметь очень мало ложноположительных и ложноотрицательных результатов. Несколько медленнее, чем уровни 1 или 2, когда включена оптимизация. Обрабатывает распространённый шаблон pun+dereference в переднем конце:*(int*)&some_float. Если оптимизация включена, он также работает в заднем конце, где обрабатывает несколько случаев операторов с использованием информации о ссылках, чувствительной к потоку. Предупреждает только при разыменовании преобразованного указателя. Не предупреждает об неполных типах. -
-Wstrict-overflow-Wstrict-overflow=n - Эта опция активна только при активной опции
-fstrict-overflow. Она предупреждает о случаях, когда компилятор оптимизирует, исходя из предположения, что переполнение со знаком не происходит. Обратите внимание, что она не предупреждает обо всех случаях, когда код может переполниться: она предупреждает только о случаях, когда компилятор выполняет оптимизацию. Таким образом, это предупреждение зависит от уровня оптимизации.Оптимизация, которая предполагает, что переполнение со знаком не происходит, совершенно безопасна, если значения вовлечённых переменных таковы, что переполнение никогда не происходит на самом деле. Поэтому это предупреждение может легко дать ложноположительный результат: предупреждение о коде, который на самом деле не является проблемой. Для концентрации внимания на важных проблемах определены несколько уровней предупреждений. Предупреждения не выдаются для использования неопределённого переполнения со знаком при оценке количества итераций цикла, в частности, при определении того, будет ли цикл выполняться вообще.
-Wstrict-overflow=1- Предупреждать о случаях, которые вызывают сомнения и легко избегаются. Например, с
-fstrict-overflow, компилятор упрощаетx + 1 > xдо1. Этот уровень-Wstrict-overflowвключён-Wall; более высокие уровни нет и их необходимо запросить явно. -Wstrict-overflow=2- Также предупреждать о других случаях, когда сравнение упрощается до константы. Например:
abs (x) >= 0. Это можно упростить только тогда, когда-fstrict-overflowэффективно, потому чтоabs (INT_MIN)переполняется доINT_MIN, что меньше нуля.-Wstrict-overflow(без уровня) то же самое, что-Wstrict-overflow=2. -Wstrict-overflow=3- Также предупреждать о других случаях, когда сравнение упрощается. Например:
x + 1 > 1упрощается доx > 0. -Wstrict-overflow=4- Также предупреждать о других упрощениях, не покрытых вышеперечисленными случаями. Например:
(x * 10) / 5упрощается доx * 2. -Wstrict-overflow=5- Также предупреждать о случаях, когда компилятор уменьшает значение константы, участвующей в сравнении. Например:
x + 2 > yупрощается доx + 1 >= y. Об этом сообщается только на самом высоком уровне предупреждений, потому что это упрощение применяется к множеству сравнений, поэтому этот уровень предупреждений даёт очень большое количество ложноположительных результатов.
-
-Wsuggest-attribute=[pure|const|noreturn|format]
- Предупреждать в случаях, когда добавление атрибута может быть полезным. Атрибуты, которые в настоящее время поддерживаются, перечислены ниже.
-
-Wsuggest-attribute=pure-Wsuggest-attribute=const-Wsuggest-attribute=noreturn - Предупреждать о функциях, которые могут быть кандидатами для атрибутов
pure,constилиnoreturn. Компилятор предупреждает только о функциях, видимых в других единицах компиляции, или (в случаеpureиconst) если он не может доказать, что функция возвращает нормально. Функция возвращает нормально, если она не содержит бесконечного цикла или не возвращает аномально, выбрасывая исключение, вызываяabort()или перехватывая исключение. Для этого анализа требуется опция-fipa-pure-const, которая включена по умолчанию начиная с-Oи выше. Более высокие уровни оптимизации повышают точность анализа. -
-Wsuggest-attribute=format-Wmissing-format-attribute - Предупреждать о указателях на функции, которые могут быть кандидатами для атрибутов
format. Обратите внимание, что это только возможные кандидаты, а не абсолютные. GCC предполагает, что указатели на функции с атрибутамиformat, которые используются в операциях присваивания, инициализации, передаче параметров или возвращаемого значения, должны иметь соответствующий атрибутformatв результирующем типе. То есть левая часть присваивания или инициализации, тип переменной параметра или тип возвращаемого значения содержащей функции, соответственно, также должны иметь атрибутformatдля предотвращения предупреждения.GCC также предупреждает о определениях функций, которые могут быть кандидатами для атрибутов
format. Опять же, это только возможные кандидаты. GCC предполагает, что атрибутыformatмогут быть уместными для любой функции, которая вызывает функцию, подобнуюvprintfилиvscanf, но это не всегда так, и некоторые функции, для которых атрибутыformatявляются подходящими, могут не быть обнаружены.
-
-Warray-bounds- Эта опция активна только тогда, когда активна опция
-ftree-vrp(по умолчанию для-O2и выше). Она предупреждает о индексах массивов, которые всегда выходят за пределы. Это предупреждение включено опцией-Wall. -Wno-div-by-zero- Не выдавать предупреждение о целочисленном делении на ноль во время компиляции. Предупреждение не выдаётся о делении с плавающей точкой на ноль, так как оно может быть законным способом получения бесконечности и NaN.
-Wsystem-headers- Выводить сообщения о предупреждениях для конструкций, найденных в системных заголовочных файлах. Предупреждения из системных заголовочных файлов обычно подавляются, исходя из предположения, что они обычно не указывают на реальные проблемы и только усложняют вывод компилятора. Использование этой командной строки говорит GCC о том, что он должен выводить предупреждения из системных заголовочных файлов так, как будто они произошли в пользовательском коде. Однако обратите внимание, что использование
-Wallв сочетании с этой опцией не предупреждает о неизвестных препроцессорных директивах в системных заголовочных файлах — для этого необходимо также использовать-Wunknown-pragmas. -Wtrampolines- Предупреждать о тремполинах, сгенерированных для указателей на вложенные функции.
Тремполин — это небольшой фрагмент данных или кода, создаваемый во время выполнения на стеке, когда берётся адрес вложенной функции, и используется для вызова вложенной функции косвенно. Для некоторых целей он состоит только из данных и, таким образом, не требует специального обращения. Но для большинства целей он состоит из кода и, следовательно, требует, чтобы стек был исполняемым, для того, чтобы программа работала правильно.
-Wfloat-equal- Предупреждать, если значения с плавающей точкой используются в сравнениях на равенство.
Идея заключается в том, что иногда удобно (для программиста) рассматривать значения с плавающей точкой как приближения к бесконечно точным вещественным числам. Если вы это делаете, то вам нужно вычислить (путем анализа кода или каким-то другим способом) максимальную или предполагаемую максимальную ошибку, которую вносит вычисление, и учесть её при выполнении сравнений (и при формировании вывода, но это другая проблема). В частности, вместо проверки на равенство, вы должны проверить, пересекаются ли диапазоны двух значений; и это делается с помощью операторов сравнения, поэтому сравнения на равенство, вероятно, ошибочны.
-
-Wtraditional(Только для C и Objective-C) - Предупреждать о некоторых конструкциях, которые ведут себя по-разному в традиционном и 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 из библиотек
PARAMSиVPARAMS. Это предупреждение также пропускается для вложенных функций, так как эта функция уже является расширением GCC и, следовательно, не относится к совместимости с традиционным C.
-
-Wtraditional-conversion(Только для C и Objective-C) - Предупреждать, если прототип приводит к преобразованию типа, которое отличается от того, что произошло бы с тем же аргументом в отсутствие прототипа. Это включает преобразования от фиксированной точки к плавающей и наоборот, и преобразования, изменяющие ширину или знаковый тип аргумента с фиксированной точкой, за исключением случаев, когда это совпадает с преобразованием по умолчанию.
-
-Wdeclaration-after-statement(Только для C и Objective-C) - Предупреждать, когда объявление находится после оператора в блоке. Эта конструкция, известная из C++, была введена с ISO C99 и по умолчанию разрешена в GCC. Она не поддерживается ISO C90 и не поддерживалась версиями GCC до GCC 3.0. См. Смешанные объявления.
-Wundef- Предупреждать, если неопределённый идентификатор оценивается в директиве ‘
#if’. -Wno-endif-labels- Не выдавать предупреждение, когда ‘
#else’ или ‘#endif’ следуют за текстом. -Wshadow- Предупреждать всякий раз, когда локальная переменная или объявление типа затеняют другую переменную, параметр, тип или член класса (в C++), или когда затеняется встроенная функция. Обратите внимание, что в C++, компилятор предупреждает, если локальная переменная затеняет явный typedef, но не если она затеняет struct/class/enum.
-
-Wlarger-than=len - Предупреждать всякий раз, когда определяется объект размером более len байтов.
-
-Wframe-larger-than=len - Предупреждать, если размер стековой рамки функции больше, чем len байтов. Вычисления, выполняемые для определения размера стековой рамки, приблизительны и не консервативны. Фактические требования могут быть несколько больше, чем len, даже если предупреждение не выдаётся. Кроме того, любая память, выделенная с помощью
alloca, массивов переменной длины или похожих конструкций, не включается компилятором при определении того, выдавать ли предупреждение. -Wno-free-nonheap-object- Не выдавать предупреждение при попытке освободить объект, который не был выделен в куче.
-
-Wstack-usage=len - Предупреждать, если использование стека функцией может быть больше, чем len байтов. Вычисления, выполняемые для определения использования стека, консервативны. Любая память, выделенная с помощью
alloca, массивов переменной длины или подобных конструкций, включается компилятором при определении того, выдавать ли предупреждение.Сообщение соответствует выводу
-fstack-usage.- Если использование стека полностью статичное, но превышает указанное значение, это:
warning: stack usage is 1120 bytes
- Если использование стека (частично) динамическое, но ограниченное, это:
warning: stack usage might be 1648 bytes
- Если использование стека (частично) динамическое и неограниченное, это:
warning: stack usage might be unbounded
- Если использование стека полностью статичное, но превышает указанное значение, это:
-Wunsafe-loop-optimizations
- Предупреждать, если цикл нельзя оптимизировать, так как компилятор не может сделать предположений о границах индексов цикла. С помощью
-funsafe-loop-optimizationsпредупреждать, если компилятор делает такие предположения. -
-Wno-pedantic-ms-format(Только для целей MinGW) - При использовании в сочетании с
-Wformatи-pedanticбез расширений GNU, этот параметр отключает предупреждения о спецификаторах формата шириныprintf/scanfвне ISOI32,I64, иIиспользуемых на целевых платформах Windows, которые зависят от среды выполнения MS. -Wpointer-arith- Предупреждать о любых зависимостях от «размера» типа функции или типа
void. GNU C присваивает этим типам размер 1 для удобства в расчетах с указателями наvoid *и указателями на функции. В C++, также предупреждать, когда арифметическое выражение включает в себяNULL. Это предупреждение также включается параметром-Wpedantic. -Wtype-limits- Предупреждать, если сравнение всегда истинно или всегда ложно из-за ограниченного диапазона типа данных, но не предупреждать для константных выражений. Например, предупреждать, если беззнаковое переменная сравнивается с нулём с помощью ‘
<’ или ‘>=’. Это предупреждение также включается параметром-Wextra. -
-Wbad-function-cast(Только для C и Objective-C) - Предупреждать всякий раз, когда вызов функции приводится к несоответствующему типу. Например, предупреждать, если
int malloc()приводится кanything *. -
-Wc++-compat(Только для C и Objective-C) - Предупреждать об конструкциях ISO C, которые выходят за рамки общего подмножества ISO C и ISO C++, например, запрос на неявное преобразование из
void *в указатель на не-voidтип. -
-Wc++11-compat(Только для C++ и Objective-C++) - Предупреждать о конструкциях C++, чьё значение отличается между ISO C++ 1998 и ISO C++ 2011, например, идентификаторы в ISO C++ 1998, которые являются ключевыми словами в ISO C++ 2011. Это предупреждение включает
-Wnarrowingи включается параметром-Wall. -Wcast-qual- Предупреждать всякий раз, когда указатель приводится к типу, из которого удалено квалификатор типа. Например, предупреждать, если
const char *приводится к обычномуchar *.Также предупреждать при приведении, которое добавляет квалификатор типа небезопасным образом. Например, приведение
char **кconst char **небезопасно, как в этом примере:/* p is char ** value. */ const char **q = (const char **) p; /* Assignment of readonly string to const char * is OK. */ *q = "string"; /* Now char** pointer points to read-only memory. */ **p = 'b';
-Wcast-align- Предупреждать всякий раз, когда указатель приводится так, что требуется выравнивание целевого типа увеличивается. Например, предупреждать, если
char *приводится кint *на машинах, где к целым числам можно получить доступ только на границах в два или четыре байта. -Wwrite-strings- При компиляции C, присваивать строковым константам тип
const char[длина], чтобы копирование адреса одной в не-constchar *указатель выдавало предупреждение. Эти предупреждения помогают найти код, который может попытаться записать в строковую константу во время компиляции, но только если вы очень осторожны с использованиемconstв объявлениях и прототипах. В противном случае, это просто раздражение. Именно поэтому мы не заставляем-Wallзапрашивать эти предупреждения.При компиляции C++, предупреждать о устаревшем преобразовании строковых литералов в
char *. Это предупреждение по умолчанию включено для C++ программ. -Wclobbered- Предупреждать о переменных, которые могут быть изменены ‘
longjmp’ или ‘vfork’. Это предупреждение также включается параметром-Wextra. -
-Wconditionally-supported(Только для C++ и Objective-C++) - Предупреждать о конструкциях, которые условно поддерживаются (C++11 [intro.defs]).
-Wconversion- Предупреждать об неявных преобразованиях, которые могут изменить значение. Это включает в себя преобразования между вещественными и целыми числами, такие как
abs (x), когдаxявляетсяdouble; преобразования между знаковыми и беззнаковыми, такие какunsigned ui = -1; и преобразования в типы меньшего размера, такие какsqrtf (M_PI). Не предупреждать для явных приведений, таких какabs ((int) x)иui = (unsigned) -1, или если значение не изменяется преобразованием, как вabs (2.0). Предупреждения о преобразованиях между знаковыми и беззнаковыми целыми числами могут быть отключены с помощью-Wno-sign-conversion.Для C++, также предупреждать о путанице в разрешении перегрузки для пользовательских преобразований; и преобразования, которые никогда не используют оператор преобразования типов: преобразования к
void, тому же типу, базовому классу или ссылке на них. Предупреждения о преобразованиях между знаковыми и беззнаковыми целыми числами отключены по умолчанию в C++, если-Wsign-conversionне включено явно. -
-Wno-conversion-null(Только для C++ и Objective-C++) - Не предупреждать о преобразованиях между
NULLи не-указателями типов.-Wconversion-nullвключено по умолчанию. -
-Wzero-as-null-pointer-constant(Только для C++ и Objective-C++) - Предупреждать, когда литерал '0' используется в качестве константы нулевого указателя. Это может быть полезно для облегчения перехода к
nullptrв C++11. -Wdate-time- Предупреждать, когда встречаются макросы
__TIME__,__DATE__или__TIMESTAMP__, так как они могут помешать битово-тождественным воспроизводимым компиляциям. -
-Wdelete-incomplete(Только для C++ и Objective-C++) - Предупреждать при удалении указателя на неполный тип, что может привести к неопределённому поведению во время выполнения. Это предупреждение включено по умолчанию.
-
-Wuseless-cast(Только для C++ и Objective-C++) - Предупреждать, когда выражение приводится к его собственному типу.
-Wempty-body- Предупреждать, если пустой блок встречается в операторе ‘
if’, ‘else’ или ‘do while’. Это предупреждение также включается параметром-Wextra. -Wenum-compare- Предупреждать о сравнении значений разных перечислимых типов. В C++ несоответствия перечислимых типов в условных выражениях также диагностируются, и предупреждение включено по умолчанию. В C это предупреждение включено параметром
-Wall. -
-Wjump-misses-init(Только для C и Objective-C) - Предупреждать, если оператор
gotoили операторswitchперепрыгивает вперёд через инициализацию переменной или назад к метке после инициализации переменной. Это предупреждает только о переменных, которые инициализируются при объявлении. Это предупреждение поддерживается только для C и Objective-C; в C++ этот тип ветвления является ошибкой в любом случае.-Wjump-misses-initвключено в-Wc++-compat. Его можно отключить с помощью параметра-Wno-jump-misses-init. -Wsign-compare- Предупреждать, когда сравнение между знаковыми и беззнаковыми значениями может привести к некорректному результату при преобразовании знакового значения в беззнаковое. Это предупреждение также включается параметром
-Wextra; чтобы получить другие предупреждения-Wextraбез этого предупреждения, используйте-Wextra -Wno-sign-compare. -Wsign-conversion- Предупреждать о неявных преобразованиях, которые могут изменить знак целочисленного значения, например, присваивание знакового целочисленного выражения беззнаковой целочисленной переменной. Явное приведение отключает предупреждение. В C, этот параметр также включён
-Wconversion. -Wfloat-conversion- Предупреждать о неявных преобразованиях, которые могут уменьшить точность вещественного значения. Это включает в себя преобразования из вещественного в целое число, и от вещественного с большей точностью к вещественному с меньшей точностью. Этот параметр также включён
-Wconversion. -Wsizeof-pointer-memaccess- Предупреждать о подозрительных параметрах длины для определённых строковых и встроенных функций памяти, если аргумент использует
sizeof. Это предупреждение, например, оmemset (ptr, 0, sizeof (ptr));еслиptrне массив, а указатель, и предлагает возможную правку, или оmemcpy (&foo, ptr, sizeof (&foo));. Это предупреждение включается параметром-Wall. -Waddress- Предупреждать о подозрительных использованиях адресов памяти. Включает использование адреса функции в условном выражении, например,
void func(void); if (func), и сравнения с адресом памяти строкового литерала, например,if (x == "abc"). Такие использования обычно указывают на ошибку программиста: адрес функции всегда оценивается как истинное, поэтому их использование в условном выражении обычно означает, что программист забыл скобки в вызове функции; и сравнения со строковыми литералами приводят к неопределённому поведению и не являются переносимыми в C, поэтому они обычно означают, что программист хотел использоватьstrcmp. Это предупреждение включается параметром-Wall. -Wlogical-op- Предупреждать о подозрительных использованиях логических операторов в выражениях. Включает использование логических операторов в контекстах, где ожидается битовый оператор.
-Waggregate-return- Предупреждать, если любые функции, возвращающие структуры или объединения, определены или вызваны. (В языках, где вы можете вернуть массив, это также вызывает предупреждение.)
-Wno-aggressive-loop-optimizations- Предупреждать, если в цикле с постоянным числом итераций компилятор обнаруживает неопределённое поведение в каком-либо операторе во время одной или нескольких итераций.
-Wno-attributes- Не предупреждать, если используется неожиданное
__attribute__, такое как нераспознанные атрибуты, атрибуты функций, применённые к переменным и т. д. Это не останавливает ошибки из-за неправильного использования поддерживаемых атрибутов. -Wno-builtin-macro-redefined- Не предупреждать, если определённые встроенные макросы переопределяются. Это подавляет предупреждения о переопределении
__TIMESTAMP__,__TIME__,__DATE__,__FILE__, и__BASE_FILE__. -
-Wstrict-prototypes(Только для C и Objective-C) - Предупреждать, если функция объявлена или определена без указания типов аргументов. (Определение функции старого стиля разрешено без предупреждения, если ему предшествует объявление, которое указывает типы аргументов.)
-
-Wold-style-declaration(Только для C и Objective-C) - Предупреждать об устаревших использованиях, согласно стандарту C, в объявлении. Например, предупреждать, если спецификаторы класса хранения, такие как
static, не являются первыми элементами в объявлении. Это предупреждение также включается параметром-Wextra. -
-Wold-style-definition(Только для C и Objective-C)
- Предупреждение, если используется старое определение функции. Предупреждение выдаётся даже при наличии предыдущего прототипа.
-
-Wmissing-parameter-type(Только для C и Objective-C) - Параметр функции объявлен без указания типа в функциях в стиле K&R:
void foo(bar) { }Это предупреждение также включается с помощью
-Wextra. -
-Wmissing-prototypes(Только для C и Objective-C) - Предупреждение, если глобальная функция определена без предварительного объявления прототипа. Это предупреждение выдаётся даже если само определение предоставляет прототип. Используйте этот параметр для обнаружения глобальных функций, у которых нет соответствующего объявления прототипа в заголовочном файле. Этот параметр недействителен для C++, так как все объявления функций предоставляют прототипы, а несоответствующее объявление будет объявлять перегрузку, а не конфликтовать с более ранним объявлением. Для обнаружения отсутствующих объявлений в C++ используйте
-Wmissing-declarations. -Wmissing-declarations- Предупреждение, если в инициализаторе структуры отсутствуют некоторые поля. Например, следующий код вызывает такое предупреждение, потому что
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 };Это предупреждение включено в
-Wextra. Чтобы получить другие-Wextraпредупреждения без этого, используйте-Wextra -Wno-missing-field-initializers. -Wno-multichar- Не выводить предупреждение, если используется многосимвольный константный символ (‘
'FOOF'’). Обычно они указывают на ошибку в коде пользователя, так как имеют значения, определяемые реализацией, и не должны использоваться в переносимом коде. -Wnormalized=<none|id|nfc|nfkc>- В стандартах ISO C и ISO C++ два идентификатора отличаются, если они представляют собой разные последовательности символов. Однако иногда, когда используются символы за пределами основного набора ASCII, у вас могут быть две разные последовательности символов, которые выглядят одинаково. Чтобы избежать путаницы, стандарт ISO 10646 устанавливает некоторые правила нормализации, которые, когда применяются, гарантируют, что две последовательности, которые выглядят одинаково, преобразуются в одну и ту же последовательность. GCC может предупреждать вас, если вы используете идентификаторы, которые не были нормализованы; этот параметр контролирует это предупреждение.
GCC поддерживает четыре уровня предупреждений. По умолчанию это
-Wnormalized=nfc, которое предупреждает об идентификаторах, не находящихся в нормализованной форме «C» ISO 10646, NFC. NFC — рекомендуемая форма для большинства случаев.К сожалению, в идентификаторах, разрешенных ISO C и ISO C++, есть некоторые символы, которые, когда они переводятся в NFC, не допускаются в качестве идентификаторов. То есть нет способа использовать эти символы в переносимом ISO C или C++ и иметь все ваши идентификаторы в NFC.
-Wnormalized=idподавляет предупреждение для этих символов. Надеемся, что будущие версии этих стандартов исправят это, поэтому этот параметр не является по умолчанию.Вы можете отключить предупреждение для всех символов, написав
-Wnormalized=none. Вы должны это делать только в том случае, если вы используете какую-либо другую схему нормализации (например, «D»), так как в противном случае вы легко можете создать ошибки, которые буквально невозможно увидеть.Некоторые символы в ISO 10646 имеют разные значения, но выглядят идентично в некоторых шрифтах или методах отображения, особенно после применения форматирования. Например,
\u207F, «верхний индекс латинская малая буква n», отображается так же, как обычнаяnс верхним индексом. ISO 10646 определяет схему нормализации NFKC для преобразования всех их в стандартную форму, и GCC предупреждает, если ваш код не находится в NFKC, если вы используете-Wnormalized=nfkc. Это предупреждение сопоставимо с предупреждением о каждом идентификаторе, содержащем букву O, потому что она может быть спутана с цифрой 0, и поэтому не является по умолчанию, но может быть полезным локальным соглашением программирования, если среду программирования нельзя настроить так, чтобы эти символы отображались различимо. -Wno-deprecated- Не выводить предупреждение об использовании устаревших функций. См. Устаревшие функции.
-Wno-deprecated-declarations- Не выводить предупреждение об использовании функций (см. Атрибуты функций), переменных (см. Атрибуты переменных) и типов (см. Атрибуты типов), помеченных как устаревшие с помощью атрибута
deprecated. -Wno-overflow- Не выводить предупреждение о переполнении в выражениях во время компиляции.
-Wopenmp-simd- Выводить предупреждение, если модель затрат векторного процессора переопределяет директивы simd OpenMP или Cilk Plus, заданные пользователем.
-fsimd-cost-model=unlimitedможет быть использована для смягчения модели затрат. -
-Woverride-init(Только для C и Objective-C) - Предупреждение, если инициализированное поле без побочных эффектов переопределяется при использовании инициализаторов с указанием поля (см. Инициализаторы с указанием поля).
Это предупреждение включено в
-Wextra. Чтобы получить другие-Wextraпредупреждения без этого, используйте-Wextra -Wno-override-init. -Wpacked- Предупреждение, если структуре задан атрибут packed, но этот атрибут не оказывает влияния на расположение или размер структуры. Такие структуры могут быть неверно выровнены без особой пользы. Например, в этом коде переменная
f.xвstruct barневерно выровнена, даже еслиstruct barсам по себе не имеет атрибута packed:struct foo { int x; char a, b, c, d; } __attribute__((packed)); struct bar { char z; struct foo f; }; -Wpacked-bitfield-compat- Серии GCC 4.1, 4.2 и 4.3 игнорируют атрибут
packedдля полей-битов типаchar. Это было исправлено в GCC 4.4, но это изменение может привести к различиям в структуре расположения. GCC информирует вас, когда смещение такого поля изменилось в GCC 4.4. Например, больше нет 4-битового заполнения между полемaиbв этой структуре:struct foo { char a:4; char b:8; } __attribute__ ((packed));Это предупреждение включено по умолчанию. Используйте
-Wno-packed-bitfield-compatдля отключения этого предупреждения. -Wpadded- Предупреждение, если в структуре включено заполнение, либо для выравнивания элемента структуры, либо для выравнивания всей структуры. Иногда в таких случаях можно переупорядочить поля структуры, чтобы уменьшить заполнение и сделать структуру меньше.
-Wredundant-decls- Предупреждение, если что-либо объявлено более одного раза в одном и том же области видимости, даже в тех случаях, когда множественное объявление допустимо и ничего не меняет.
-
-Wnested-externs(Только для C и Objective-C) - Предупреждение, если встречается объявление
externвнутри функции. -Wno-inherited-variadic-ctor- Подавление предупреждений об использовании наследования конструкторов C++11, когда у базового класса, унаследованного от него, есть конструктор с переменным числом аргументов; предупреждение включено по умолчанию, так как многоточие не наследуется.
-Winline- Предупреждение, если функция, объявленная как inline, не может быть вставлена. Даже с этим параметром компилятор не предупреждает о неудачах при вставке функций, объявленных в системных заголовочных файлах.
Компилятор использует различные эвристики для определения того, вставлять ли функцию. Например, компилятор учитывает размер вставляемой функции и количество вставок, уже выполненных в текущей функции. Поэтому, казалось бы, незначительные изменения в исходном коде могут привести к появлению или исчезновению предупреждений, выдаваемых
-Winline. -
-Wno-invalid-offsetof(Только для C++ и Objective-C++) - Подавление предупреждений при применении макроса ‘
offsetof’ к типу, не являющемуся POD. Согласно стандарту ISO C++ 1998, применение ‘offsetof’ к типу, не являющемуся POD, неопределено. Однако в существующих реализациях C++ ‘offsetof’ обычно даёт осмысленные результаты даже при применении к определённым видам типов, не являющихся POD (например, к простому типу ‘struct’, который не является типом POD только благодаря наличию конструктора). Этот флаг предназначен для пользователей, которые знают, что пишут непереносимый код, и которые намеренно решили игнорировать предупреждение об этом.Ограничения на ‘
offsetof’ могут быть ослаблены в будущей версии стандарта C++. -Wno-int-to-pointer-cast- Подавление предупреждений при приведении к типу указателя целого числа другого размера. В C++ приведение к типу указателя меньшего размера является ошибкой.
Wint-to-pointer-castвключено по умолчанию. -
-Wno-pointer-to-int-cast(Только для C и Objective-C) - Подавление предупреждений при приведении указателя к целочисленному типу другого размера.
-Winvalid-pch- Предупреждение, если прекомпилированный заголовок (см. Прекомпилированные заголовки) найден в пути поиска, но не может быть использован.
-Wlong-long- Предупреждение, если используется тип ‘
long long’. Это включено либо-Wpedantic, либо-Wtraditionalв режимах ISO C90 и C++98. Чтобы запретить предупреждения, используйте-Wno-long-long. -Wvariadic-macros- Предупреждение при сомнительном использовании макросов для обработки переменного числа аргументов, таких как ‘
va_start’. Это значение по умолчанию. Для отключения предупреждений используйте-Wno-variadic-macros. -Wvarargs- Предупреждение при сомнительном использовании макросов для обработки переменного числа аргументов, таких как ‘
va_start’. Это значение по умолчанию. Чтобы запретить предупреждения, используйте-Wno-varargs. -Wvector-operation-performance- Предупреждение, если векторная операция не реализована с помощью возможностей SIMD архитектуры. В основном полезно для оптимизации производительности. Векторная операция может быть реализована
piecewise, что означает, что скалярная операция выполняется для каждого элемента вектора;in parallel, что означает, что векторная операция реализована с использованием скаляров более широкого типа, что обычно более эффективно с точки зрения производительности; иas a single scalar, что означает, что вектор помещается в скалярный тип. -Wno-virtual-move-assign
- Предупреждение о наследовании от виртуального базового класса с нетривиальным оператором перемещения C++11. Это опасно, потому что если виртуальный базовый класс достижим по нескольким путям, он будет перемещён несколько раз, что может означать, что оба объекта окажутся в состоянии перемещения. Если оператор перемещения написан так, чтобы избегать перемещения из перемещённого объекта, это предупреждение можно отключить.
-Wvla- Выдавать предупреждение, если в коде используется массив переменной длины.
-Wno-vlaпредотвращает предупреждение-Wpedanticо массиве переменной длины. -Wvolatile-register-var- Выдавать предупреждение, если регистровая переменная объявлена как volatile. Модификатор volatile не препятствует всем оптимизациям, которые могут устранять чтение и/или запись в регистровые переменные. Это предупреждение включено
-Wall. -Wdisabled-optimization- Предупреждение, если запрошенный этап оптимизации отключён. Это предупреждение обычно не указывает на наличие ошибок в вашем коде; оно просто указывает, что оптимизаторы GCC не могут эффективно обработать код. Часто проблема заключается в том, что ваш код слишком большой или слишком сложный; GCC отказывается оптимизировать программы, когда сама оптимизация, вероятно, займёт чрезмерно много времени.
-
-Wpointer-sign(только для C и Objective-C) - Предупреждение о передаче или присваивании аргумента указателя с разным знаком. Этот параметр поддерживается только для 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 и Objective-C) - Выдавать предупреждение для любой плавающей константы, у которой нет суффикса. В сочетании с
-Wsystem-headersон предупреждает о таких константах в системных заголовочных файлах. Это может быть полезно при подготовке кода для использования сFLOAT_CONST_DECIMAL64pragma из расширения десятичных чисел с плавающей точкой для C99.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-4.9.4/gcc/Warning-Options.html