Как включить (буквально) ВСЕ предупреждения GCC?

Я хотел бы включить – буквально – ВСЕ предупреждения, которые GCC имеет. (Можно подумать, что это будет легко …)

Как сообщить GCC включить (нет, если есть, и есть, или нет!) Все предупреждения, которые у него есть?

Вы не можете.

Руководство для GCC 4.4.0 является исчерпывающим для этой версии, но в нем перечислены все возможные предупреждения для 4.4.0. Они не все на странице, на которую вы ссылаетесь, например, некоторые параметры, относящиеся к языку, находятся на страницах для опций C ++ или Obj-C. Чтобы найти их все, вам лучше взглянуть на сводку параметров

Включение всего будет включать -Wdouble-promotion который имеет значение только для процессоров с 32-битным модулем с плавающей точкой с одной точкой, который реализует float в аппаратном обеспечении, но эмулирует double программное обеспечение. Выполнение вычислений как double будет использовать эмуляцию программного обеспечения и быть медленнее. Это актуально для некоторых встроенных процессоров, но совершенно неуместно для современных настольных процессоров с поддержкой аппаратного обеспечения для 64-битной плавающей запятой.

Другим предупреждением, которое обычно не полезно, является: – -Wtraditional , который предупреждает о совершенно хорошо сформированном коде, который имеет другое значение (или не работает) в традиционном C, например, "string " "concatenation" или определения функции ISO C! Вы действительно заботитесь о совместимости с 30-летними компиляторами? Вам действительно нужно предупреждение для написания int inc(int i) { return i+1; } int inc(int i) { return i+1; } ?

Я думаю, что -Weffc++ слишком шумно, чтобы быть полезным, он основан на устаревшем первом выпуске Effective C ++ и предупреждает о конструкциях, которые являются вполне допустимыми C ++ (и для которых рекомендации были изменены в последующих выпусках книги.) Я не хочу что я не инициализировал член std::string в моем конструкторе; у него есть конструктор по умолчанию, который делает именно то, что я хочу, зачем мне писать m_str() чтобы называть его? -Weffc++ которые были бы полезны, слишком сложны для того, чтобы компилятор точно определял (давал ложные отрицания), а те, которые не были полезны, например, инициализировали все члены явно, просто вызывают слишком много шума, давая ложные срабатывания.

Люк Дантон предоставил отличный пример бесполезных предупреждений из -Waggregate-return который почти наверняка никогда не имеет смысла для кода на C ++.

т.е. вы действительно не хотите всех предупреждений, вы просто думаете, что делаете.

Пройдите через руководство, прочитайте о них, решите, что вы можете включить, попробуйте их. В любом случае, чтение руководства вашего компилятора – это Good Thing TM , с небольшим сокращением и предупреждениями, которые вы не понимаете, не очень хорошая идея, особенно если это необходимо для того, чтобы избежать RTFM.

Любой, кто просто включает все , вероятно, либо делает это, потому что они невежественны, потому что или заостренный босс сказал «никаких предупреждений».

Некоторые предупреждения важны, а некоторые нет. Вы должны быть дискриминирующими или испортить свою программу. Рассмотрим, например, -Wdouble-promotion . Если вы работаете над встроенной системой, вы можете захотеть этого; если вы работаете с настольной системой, вы, вероятно, этого не делаете. И вы хотите – -Wtraditional ? Я сомневаюсь в этом.

Изменить: см. Также -Wall-all для включения всех предупреждений, закрытых как WONTFIX.

Отредактируйте 2: в ответ на жалобу DevSolar о make-файлах, требующих использования разных предупреждений в зависимости от версии компилятора, если -Wall -Wextra не подходит, то нетрудно использовать спецификации CFLAGS для конкретного компилятора и версии:

 compiler_name := $(notdir $(CC)) ifeq ($(compiler_name),gcc) compiler_version := $(basename $(shell $(CC) -dumpversion)) endif ifeq ($(compile_name),clang) compiler_version := $(shell $(CC) --version | awk 'NR==1{print $$3}') endif # ... wflags.gcc.base := -Wall -Wextra wflags.gcc.4.7 := -Wzero-as-null-pointer-constant wflags.gcc.4.8 := $(wflags.gcc.4.7) wflags.clang.base := -Wall -Wextra wflags.clang.3.2 := -Weverything CFLAGS += $(wflags.$(compiler_name).base) $(wflags.$(compiler_name).$(compiler_version)) 

Я бы согласился с предыдущими ответами о том, что, вероятно, не выгодно допускать буквально все предупреждения, однако GCC действительно обеспечивает достаточно удобный способ достижения этого. Команда

 gcc -Q --help=warning 

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

 gcc -Wall -Wextra -Q --help=warning 

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

 gcc -Q --help=warning | sed -e 's/^\s*\(\-\S*\)\s*\[\w*\]/\1 /gp;d' | tr -d '\n' 

Для моего текущего GCC это дает:

-Wabi -Wabi-tag -Waddress -Waggregate-return -Waggressive-loop-optimizations -Waliasing -Walign-commons -Wampersand -Warray-bounds -Warray-temporaries -Wassign-intercept -Wattributes -Wbad-function-cast -Wbool-compare -Wbuiltin-macro-redefined -Wc ++ – compat -Wc ++ 0x-compat -Wc ++ 14-compat -Wc-binding-type -Wc90-c99-compat -Wc99-c11-compat -Wcast-align -Wcast-qual -Whar-subscript -Wharacter-truncation -Wchkp -Wclobbered -Wcomment -Wcompare-reals -Windows-support -Wconversion -Wconversion-extra -Wconversion-null -Wcoverage-mismatch -Wcpp -Wctor-dtor-privacy -Wdate-time -Wdeclaration -after-statement -Wdelete-incomplete -Wdelete-non-virtual-dtor -Wdeprecated -Wdeprecated-declarations -Wdesignated-init -Wdisabled-optimization -Wdiscarded-array-qualifiers -Wdiscarded-qualifiers -Wdiv-by-zero -Wdouble-promotion -Weffc ++ -Wempty-body -Wendif-labels -Wenum-compare -Wextra -Wfloat-equal -Wformat-contains-nul -Wformat-extra-args -Wformat-nonliteral -Wformat-security -Wformat-signness – Wformat-y2k -Wformat-zero-length -Wfree-nonheap-object -Wfunction-elim -Wignored-qualifiers -Wimplicit -Wimplicit-function-declaration -Wimplicit-int -Wimplicit-interface -Wimplicit-procedure -Wincompatible-pointer-types – Winherited-variadic-ctor -Winit-self -Winline -Wint-conversion -Wint-to-pointer-cast -Wintrinsic-shadow -Wintrinsics-std -Winvalid-memory-model -Winvalid-offsetof -Winvalid-pch -Wjump-misses- init -Wline-truncation -Wliteral-suffix -Wlogical-not-roundheses -Wlogical-op -Wlong-long -Wmain -Wmaybe-uninitialized -Wmemset-transposed-args -Wmissing-braces -Wmissing-declarations -Wimissing-field-initializers – Wmissing-include-dirs -Wmissing-parameter-type -Wmissing-prototypes -Wmultichar -Wnarrowing -Wnested-externs -Wnoexcept -Wnon-template-friend -Wnon-virtual-dtor -Wnonnull -Wodr -Wold-style-cast -Wold- style-declaration -Wold-style-definition -Wopenmp-simd -Woverflow -Woverlength -String -Woverloaded-virtual -Woverride-init -Wpacked -Wpacked-bitfield-compat -Wpadde d -Wparentheses -Wpedantic -Wpmf-conversion -Wpointer-arith -Wpointer-sign -Wpointer-to-cast -Wpragmas -Wproperty-assign-default -Wprotocol -Wreal-q-constant -Wrealloc-lhs -Wrealloc-lhs- все -Wredundant-decls -Wreorder -Wreturn-local-addr -Wreturn-type -Wselector -Wsequence-point -Wshadow -Wshadow-ivar -Wshift-count-negative -Wshift-count-overflow -Wsign-compare -Wsign-promo – Wsized-deallocation -Wsizeof-array-argument -Wsizeof-pointer-memaccess -Wstack-protector -Wstrict-null-sentinel -Wstrict-prototypes -Wstrict-selector-match -Wsuggest-attribute = const -Wsuggest-attribute = format -Wsuggest- атрибут = noreturn -Wsuggest-attribute = pure -Wsuggest-final-methods -Wsuggest-final-types -Wsuggest-override -Wsurprising -Wswitch -Wswitch-bool -Wswitch-default -Wswitch-enum -Wsync-nand -Wsynth -Wsystem- заголовки -Wtabs -Wtarget-lifetime -Wtraditional -Wtraditional-conversion -Wtrampolines -Wtrigraphs -Wtype-limits -Wundeclared-selector -Wundef -Wunderflow -Wuninitialized -Wunknown-pragmas -Wuns afe-loop-optimizations -Wunsuffixed-float-constants -Wunused -Wunused-but-set-parameter -Wunused-but-set-variable -Wunused-dummy-argument -Wunused-function -Wunused-label -Wunused-local-typedefs – Wunused-macros -Wunused-parameter -Wunused-result -Wunused-value -Wunused-variable -Wuse-without-only -Wweless-cast -Wvarargs -Wvariadic-macro -Wvector-performance-performance -Wvirtual-move-assign -Wvla – Wvolatile-register-var -Wwrite-strings -Wzero-as-null-pointer-constant -Wzerotrip -frequire-return-statement

Теперь это можно использовать для вызова GCC, т.е.

 gcc $(gcc -Q --help=warning | sed -e 's/^\s*\(\-\S*\)\s*\[\w*\]/\1 /gp;d' | tr -d '\n') 

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

Просто невозможно запрограммировать все включенные предупреждения (если вы не проигнорируете их, но тогда, зачем беспокоиться?). Например, предположим, что вы используете следующий набор флагов: -Wstrict-prototypes -Wtraditional .

Даже при наличии двух предупреждений следующая программа будет жаловаться.

 /tmp $ cat main.c int main(int argc, char **argv) { return 0; } /tmp $ gcc -Wstrict-prototypes -Wtraditional main.c main.c: In function 'main': main.c:1:5: warning: traditional C rejects ISO C style function definitions [-Wtraditional] int main(int argc, char **argv) { ^ 

Вы можете подумать «ну, я собираюсь использовать прототипы старого стиля». Нет, это не сработает.

 /tmp $ cat main.c int main(argc, argv) int argc; char **argv; { return 0; } /tmp $ gcc -Wstrict-prototypes -Wtraditional main.c main.c:1:5: warning: function declaration isn't a prototype [-Wstrict-prototypes] int main(argc, argv) ^ 

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

 /tmp $ cat main.c int main() { return 0; } /tmp $ gcc -Wstrict-prototypes -Wtraditional main.c main.c:1:5: warning: function declaration isn't a prototype [-Wstrict-prototypes] int main() { ^ 

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

Для C ++ это возможно (флаг -Wtraditional не существует), и очень простые программы могут быть скомпилированы. Чтобы включить все предупреждения, используйте следующий список предупреждений (возможно, некоторые предупреждения дублируются, потому что я не стал фильтровать предупреждения, включенные -Wall ).

 -Wabi -Wctor-dtor-privacy -Wnon-virtual-dtor -Wreorder -Weffc++ -Wstrict-null-sentinel -Wno-non-template-friend -Wold-style-cast -Woverloaded-virtual -Wno-pmf-conversions -Wsign-promo -Wextra -Wall -Waddress -Waggregate-return -Warray-bounds -Wno-attributes -Wno-builtin-macro-redefined -Wc++0x-compat -Wcast-align -Wcast-qual -Wchar-subscripts -Wclobbered -Wcomment -Wconversion -Wcoverage-mismatch -Wno-deprecated -Wno-deprecated-declarations -Wdisabled-optimization -Wno-div-by-zero -Wempty-body -Wenum-compare -Wno-endif-labels -Wfatal-errors -Wfloat-equal -Wformat -Wformat=2 -Wno-format-contains-nul -Wno-format-extra-args -Wformat-nonliteral -Wformat-security -Wformat-y2k -Wignored-qualifiers -Winit-self -Winline -Wno-int-to-pointer-cast -Wno-invalid-offsetof -Winvalid-pch -Wunsafe-loop-optimizations -Wlogical-op -Wlong-long -Wmain -Wmissing-braces -Wmissing-field-initializers -Wmissing-format-attribute -Wmissing-include-dirs -Wmissing-noreturn -Wno-mudflap -Wno-multichar -Wnonnull -Wno-overflow -Woverlength-strings -Wpacked -Wpacked-bitfield-compat -Wpadded -Wparentheses -Wpointer-arith -Wredundant-decls -Wreturn-type -Wsequence-point -Wshadow -Wsign-compare -Wsign-conversion -Wstack-protector -Wstrict-aliasing=1 -Wstrict-overflow=5 -Wswitch -Wswitch-default -Wswitch-enum -Wsync-nand -Wsystem-headers -Wtrigraphs -Wtype-limits -Wundef -Wuninitialized -Wunknown-pragmas -Wno-pragmas -Wunreachable-code -Wunused -Wunused-function -Wunused-label -Wunused-parameter -Wunused-value -Wunused-variable -Wvariadic-macros -Wvla -Wvolatile-register-var -Wwrite-strings 

Gcc 4.3+ nows -Q –help = предупреждения, вы можете даже указать –help = warnings, C, чтобы просто распечатать связанные с C предупреждения.

Я просто написал модуль m4, чтобы воспользоваться этим (также поддерживает clang’s -Weverything), см. Wget_manywarnings.m4

Как использовать его довольно просто, в основном модуль вы включаете каждый флаг предупреждения. И вы удаляете предупреждения по мере необходимости – некоторые действительно очень многословны. Пример: configure.ac

Если вы не используете autotools, вы найдете код для включения всех отключенных предупреждений в модуле m4, который в основном представляет собой вызов gcc через awk:

flags="-Wall -Wextra -Wformat=2 "$(gcc -Wall -Wextra -Wformat=2 -Q --help=warning,C|awk '{ if (($2 == "[disabled]" || $2 == "") && $1!~/=/ && $1~/^-W/&& $1!="-Wall") print $1 }'

С этой страницы :

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

Думаю, вопрос в том, какие из них ? Возможно, вы могли бы grep эту страницу для всех строк, начинающихся с -W, и получить полный список предупреждающих флагов. Затем сравните их со списками под -Wall и -Wextra . Существует также -Wpedantic , хотя вы, очевидно, хотите быть еще более педантичным еще =)

И я до сих пор не знаю, является ли этот список всеобъемлющим.

Вероятно, это, но единственный список, который является 100% всеобъемлющим, является фактическим источником для компилятора. Однако GCC большой ! И я не знаю, собраны ли все параметры командной строки в одном месте или разбросаны по нескольким исходным файлам. Также обратите внимание, что некоторые предупреждения предназначены для предварительного процессора, некоторые для реального компилятора, а некоторые для компоновщика (который является полностью отдельной программой и найден в пакете binutils), поэтому они, скорее всего, распространяются.

Кто-то создал набор инструментов для определения полного набора предупреждений для данной версии GCC или Clang.

Для GCC копирование из полного списка предупреждений, предоставляемых этим инструментом для вашей версии компилятора, является единственным способом обеспечить включение всех предупреждений, поскольку (в отличие от Clang) GCC не предоставляет -Weverything .

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

Репозиторий также содержит текстовые файлы с списками предупреждений, сгенерированными для большинства версий GCC и Clang (в настоящее время Clang 3.2 до 3.7 и GCC с 3.4 по 5.3).

https://github.com/barro/compiler-warnings

  • Каков список допустимых имен предупреждений @SuppressWarnings в Java?
  • В Xcode, как подавлять все предупреждения в определенных исходных файлах?
  • Как найти, какие обещания необработаны в Node.js UnhandledPromiseRejectionWarning?
  • warning: формат не строковый литерал и аргументы формата
  • Msgstr "разглаживающий тип-караульный указатель нарушит правила строгого сглаживания"
  • Log4j Предупреждение при инициализации?
  • «Примечание: неопределенная переменная», «Примечание: неопределенный индекс» и «Примечание: неопределенное смещение» с использованием PHP
  • Как исправить «Выражение типа List требует непроверенного преобразования ...»?
  • Отключить одно предупреждение
  • Отключить предупреждающие сообщения в GCC через файлы заголовков?
  • Игнорировать предупреждения Xcode при использовании Cocoapods
  • Interesting Posts

    Как создать TypeTag вручную?

    C # Справка по чтению иностранных символов с помощью StreamReader

    Остановить ScrollView от автоматической прокрутки до EditText

    Сделайте некоторый контент на USB-накопителе только для чтения

    Принудительная загрузка с использованием в htaccess в корне WWW

    Отклонить приглашение на небольшое дисковое пространство (Suspend, Power Off, Continue)

    Почему HibernateDaoSupport не рекомендуется?

    Какова цель подстановочных знаков и как они отличаются от дженериков?

    Что означают зеленые папки в Windows 7 Explorer?

    Как визуализировать изображение камеры YUV-NV21 на фоне в libgdx с OpenGLES 2.0 в режиме реального времени?

    Как объединить данные из двух листов и условно форматировать строки на основе листа происхождения

    Объединение всех файлов в одну папку из разных папок

    Переопределить домашнюю и обратную кнопку – это случай, когда логическое значение true

    Шифрование файлов cookie в ASP.NET

    Android View исчезает, когда выходит за пределы родителя

    Давайте будем гением компьютера.