Какие еще предупреждения, кроме -Wall, люди сочли полезными?
http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Warning-Options.html
Какие еще предупреждения, кроме -Wall, люди сочли полезными?
http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Warning-Options.html
Ответы:
Обычно я использую:
gcc -m64 -std=c99 -pedantic -Wall -Wshadow -Wpointer-arith -Wcast-qual \
-Wstrict-prototypes -Wmissing-prototypes
Этот набор очень привлекает людей, которые к нему не привыкли (людей, чей код я могу скомпилировать с этими флагами впервые); это редко вызывает у меня проблемы (хотя -Wcast-qual иногда мешает).
-O3
что-нибудь подобное; есть предупреждения, которые генерируются только при оптимизации кода.
-m32
и -m64
(разумеется, в отдельных прогонах) обеспечивает лучшую защиту от различных ошибок в способах использования printf()
и scaf()
спецификациях преобразования.
По состоянию на 01.09.2011, с версией gcc 4.6.1
Мой текущий псевдоним "разработки"
gcc -std = c89 -pedantic -Wall \ -Wno-missing-braces -Wextra -Wno-missing-field-initializers -Wformat = 2 \ -Wswitch-default -Wswitch-enum -Wcast-align -Wpointer-arith \ -Wbad-function-cast -Wstrict-overflow = 5 -Wstrict-prototypes -Winline \ -Wundef -Wnested-externs -Wcast-qual -Wshadow -Wunreachable-code \ -Wlogical-op -Wfloat-equal -Wstrict-aliasing = 2 -Wredundant-decls \ -Wold-style-определение -Werror \ -ggdb3 \ -O0 \ -fno-omit-frame-pointer -ffloat-store -fno-common -fstrict-aliasing \ -lm
Псевдоним "выпуска"
gcc -std = c89 -pedantic -O3 -DNDEBUG -flto -lm
По состоянию на 03.11.2009
псевдоним "разработка"
gcc -Wall -Wextra -Wformat = 2 -Wswitch-default -Wcast-align -Wpointer-arith \ -Wbad-function-cast -Wstrict-prototypes -Winline -Wundef -Wnested-externs \ -Wcast-qual -Wshadow -Wwrite-strings -Wconversion -Wunreachable-code \ -Wstrict-aliasing = 2 -ffloat-store -fno-common -fstrict-aliasing \ -lm -std = c89 -pedantic -O0 -ggdb3 -pg --coverage
псевдоним "выпуска"
gcc -lm -std = c89 -pedantic -O3 -DNDEBUG --combine -fwhole-program -funroll-loops
-Wfloat-equal
добавлен к моему псевдониму. Спасибо, Марк
-Wstrict-aliasing=2
фактически снижает уровень предупреждений, -Wstrict-aliasing=3
подразумеваемых -Wall
, по крайней мере, в последней версии gcc.
Мне нравится -Werror. Сохраняет код предупреждения свободным.
#warning
хорошего побочного эффекта от использования -Werror
.
-Werror
по умолчанию не используются в ваших сборках, это раздражает упаковщиков, которые используют разные версии компилятора от вас, поскольку предупреждения меняются с версией компилятора, иногда код, который предупреждает вас бесплатно, будет иметь предупреждение для кого-то еще и затем им придется копаться в вашей системе сборки, чтобы отключить ее.
Я начал с C ++, поэтому, когда я переключился на изучение CI, я постарался быть экстра-анальным:
-fmessage-length = 0 -ansi -pedantic -std = c99 -Ошибка -Стена -Wextra -Wwrite-строки -Выиграть сам -Wcast-align -Wcast-qual -Wpointer-arith -Wstrict-aliasing -Wformat = 2 -Wmissing-декларации -Wmissing-include-dirs -Wno-unused-параметр -Wuninitialized -Декоративный стиль -Wstrict-прототипы -Wmissing-прототипы
Получите руководство для используемой версии GCC, найдите все доступные варианты предупреждений и затем отключите только те, для которых у вас есть веские основания для этого. (Например, немодифицируемые сторонние заголовки, которые в противном случае выдали бы вам множество предупреждений.) Задокументируйте эти причины. (В Makefile или где бы вы ни установили эти параметры.) Проверяйте настройки через регулярные промежутки времени и всякий раз , когда вы обновляете свой компилятор.
Компилятор - ваш друг. Предупреждения - ваш друг. Дайте компилятору как можно больше шансов сообщить вам о потенциальных проблемах.
Еще я использую:
-Wstrict-overflow = 5
Чтобы отловить эти неприятные ошибки, которые могут возникнуть, если я напишу код, основанный на поведении переполнения целых чисел.
И:
-Wextra
Это позволяет использовать некоторые параметры, которые тоже неплохо иметь. Однако большинство из них предназначены для C ++.
Я обычно компилирую с помощью "-W -Wall -ansi -pedantic", это помогает обеспечить максимальное качество и переносимость кода.
-pedantic -Wall -Wextra -Wno-write-strings -Wno-unused-parameter
Для режима "Сделай мне больно" я оставляю -Нет ...
Мне нравится, когда в моем коде нет предупреждений, особенно в C ++. Хотя предупреждения компилятора C часто можно игнорировать, многие предупреждения C ++ указывают на фундаментальные дефекты исходного кода.
Foo(int dndu, int dndv) : dndu_(dndu), dndv_(dndu) {}
-> относительно трудно обнаружить. Если вас раздражает это предупреждение, просто закомментируйте параметр foo (int /*q*/)
, это также повысит читаемость вашего кода.
-педантические-ошибки
clang
(компилятор C проекта LLVM), а затем скомпилировать с помощью, -Weverything
и вы увидите, насколько действительно интересной может стать компиляция (некоторые из предупреждений совершенно безумны, но технически верны).
-Wfloat-equal, -Wshadow, -Wmissing-prototypes,
Сейчас использую:
-Wall -W -Wextra -Wconversion -Wshadow -Wcast-qual -Wwrite-strings -Werror
Я взял этот список в основном из книги «Введение в gcc», а затем из рекомендаций Ульриха Дреппера по защитному программированию ( http://people.redhat.com/drepper/Defensive-slides.pdf ).
Но у меня нет никакой науки за моим списком, это просто хороший список.
/ Йохан
Примечание: мне не нравятся эти педантичные флаги ....
Примечание: я думаю, что -W и -Wextra более или менее одно и то же.
Я обычно просто использую
gcc -Wall -W -Wunused-parameter -Wmissing-declarations -Wstrict-prototypes -Wmissing-prototypes -Wsign-compare -Wconversion -Wshadow -Wcast-align -Wparentheses -Wsequence-point -Wdeclaration-after-statement -Wundef -Wpointer-arith -Wnested-externs -Wredundant-decls -Werror -Wdisabled-optimization -pedantic -funit-at-a-time -o
-Wfatal-errors
-Wdeclaration-after-statement
', чтобы обнаружить код, который MSVC (который по-прежнему является компилятором C89) не обрабатывается. Это неприятность. Добавление "-Wextra
может выявить и другие проблемы.