Рекомендуемые параметры предупреждений gcc для C [закрыто]


83

Какие еще предупреждения, кроме -Wall, люди сочли полезными?

http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Warning-Options.html

Ответы:


48

Обычно я использую:

Этот набор очень привлекает людей, которые к нему не привыкли (людей, чей код я могу скомпилировать с этими флагами впервые); это редко вызывает у меня проблемы (хотя -Wcast-qual иногда мешает).


1
В наши дни я считаю, что мне нужно добавить ' -Wdeclaration-after-statement', чтобы обнаружить код, который MSVC (который по-прежнему является компилятором C89) не обрабатывается. Это неприятность. Добавление " -Wextraможет выявить и другие проблемы.
Джонатан Леффлер,

2
Кроме того, неплохо было бы добавить -O3что-нибудь подобное; есть предупреждения, которые генерируются только при оптимизации кода.
Джонатан Леффлер,

3
Согласно документу gcc, -O2 лучше всего обнаруживает предупреждения. Я не уверен, подразумевает ли -O3 -O2 или допускает создание большего количества предупреждений.
Offirmo

3
Пропустите -m64, если вы не в 64-битной среде.
Тор Клингберг

1
Использование обоих -m32 и -m64 (разумеется, в отдельных прогонах) обеспечивает лучшую защиту от различных ошибок в способах использования printf()и scaf()спецификациях преобразования.
Джонатан Леффлер,

41

По состоянию на 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

1
-Wfloat-equalдобавлен к моему псевдониму. Спасибо, Марк
pmg

4
Обратите внимание, что -Wstrict-aliasing=2фактически снижает уровень предупреждений, -Wstrict-aliasing=3подразумеваемых -Wall, по крайней мере, в последней версии gcc.
nwellnhof

15

Мне нравится -Werror. Сохраняет код предупреждения свободным.


21
Без -Werror все остальные варианты предупреждений бессмысленны. Обработка предупреждений как ошибок - практически единственный способ гарантировать устранение предупреждений. Если это просто предупреждения, разработчик может решить оставить одно, потому что он уверен, что оно недействительно. Это может даже быть правдой, но следующий разработчик не будет исправлять введенные им предупреждения, потому что он не видел их среди всех остальных, или потому что это просто еще одно предупреждение.
Кристоф Провост

6
Я не согласен с Кристофом, потому что во многих случаях я бы предпочел сначала скомпилировать рабочую копию, а затем исправлять ошибки.
Yktula

9
Я понимаю, почему это заманчиво, но когда / если у вас есть рабочая копия, вы с большей вероятностью оставите ее как есть, потому что «она работает». Этот риск еще выше в корпоративной среде, где вам придется убедить своего начальника дать вам время на исправление предупреждений.
JesperE

2
Считаю избавление от #warningхорошего побочного эффекта от использования -Werror.
JesperE

3
если вы работаете с материалами с открытым исходным кодом, которые -Werrorпо умолчанию не используются в ваших сборках, это раздражает упаковщиков, которые используют разные версии компилятора от вас, поскольку предупреждения меняются с версией компилятора, иногда код, который предупреждает вас бесплатно, будет иметь предупреждение для кого-то еще и затем им придется копаться в вашей системе сборки, чтобы отключить ее.
Spudd86

15

Я начал с 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-прототипы

5
Можно ли одновременно использовать -ansi -pedantic -std = c99? Разве -ansi не то же самое, что c89? и если да, то как это работает с флагом c99?
Johan

2
@Johan - можно, но в этом нет необходимости, как я узнал совсем недавно. -ansi подразумевает -std = <default>, поэтому на самом деле вы можете просто сказать -std = c99 -pedantic и получить точно такой же эффект. Я все равно использую его, просто для эффекта документации. Мне кажется, он гласит: «Этот код является стандартом ANSI (педантичным!) С использованием стандарта C99». Сразу после этого обычно идет -Wno-long-long или подобное ... любые исключения из стандарта ANSI.
Том

9

Получите руководство для используемой версии GCC, найдите все доступные варианты предупреждений и затем отключите только те, для которых у вас есть веские основания для этого. (Например, немодифицируемые сторонние заголовки, которые в противном случае выдали бы вам множество предупреждений.) Задокументируйте эти причины. (В Makefile или где бы вы ни установили эти параметры.) Проверяйте настройки через регулярные промежутки времени и всякий раз , когда вы обновляете свой компилятор.

Компилятор - ваш друг. Предупреждения - ваш друг. Дайте компилятору как можно больше шансов сообщить вам о потенциальных проблемах.


1
К вашему сведению, в руководстве нет единого исчерпывающего списка предупреждений. Однако вы можете найти здесь такие списки вместе с инструментами, используемыми для их создания.
Кайл Стрэнд,

5

Еще я использую:

-Wstrict-overflow = 5

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

И:

-Wextra

Это позволяет использовать некоторые параметры, которые тоже неплохо иметь. Однако большинство из них предназначены для C ++.


4
-Wextra, похоже, новое имя для -W (которое также все еще поддерживается)
Сард

2

Я обычно компилирую с помощью "-W -Wall -ansi -pedantic", это помогает обеспечить максимальное качество и переносимость кода.


3
просто примечание -ansi переопределяет -std = c99
Сард

2
Разве -ansi не эквивалентно использованию -std = c89?
helpermethod 01

2

-pedantic -Wall -Wextra -Wno-write-strings -Wno-unused-parameter

Для режима "Сделай мне больно" я оставляю -Нет ...

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


3
Потому что инструментальная цепочка может помещать строковые литералы в постоянную память.
DevSolar 05

3
Почему -Wno-unused-параметр? Очень редко он указывает на реальные проблемы (и «очень редко» - на точную опасность его отключения: труднее всего обнаружить маловероятные ошибки). Например, если может сработать Foo(int dndu, int dndv) : dndu_(dndu), dndv_(dndu) {}-> относительно трудно обнаружить. Если вас раздражает это предупреждение, просто закомментируйте параметр foo (int /*q*/), это также повысит читаемость вашего кода.
Себастьян Мах

Во время рефакторинга я иногда по ошибке
затенял

1

-педантические-ошибки


2
@unexist Попробуйте установить clang(компилятор C проекта LLVM), а затем скомпилировать с помощью, -Weverythingи вы увидите, насколько действительно интересной может стать компиляция (некоторые из предупреждений совершенно безумны, но технически верны).
Mecki 08


1

-Wredundant-decls -Wnested-externs -Wstrict-prototypes -Wextra -Werror-неявное-объявление-функции -Wunused -Wno-unused-value -Wreturn-type


1

Сейчас использую:

-Wall -W -Wextra -Wconversion -Wshadow -Wcast-qual -Wwrite-strings -Werror

Я взял этот список в основном из книги «Введение в gcc», а затем из рекомендаций Ульриха Дреппера по защитному программированию ( http://people.redhat.com/drepper/Defensive-slides.pdf ).

Но у меня нет никакой науки за моим списком, это просто хороший список.

/ Йохан


Примечание: мне не нравятся эти педантичные флаги ....

Примечание: я думаю, что -W и -Wextra более или менее одно и то же.


2
После использования -Wconversion и потратив пару часов на тестирование различных типов данных в моем коде и повторную сборку, я исследовал -Wconversion и не рекомендовал бы использовать его в целом. Проблема в том, что он генерирует предупреждения о коде, например: char a = 5; char b = a - 1; Используется gcc 4.3.2 (Debian 4.3.2.-1.1)
Джеймс Моррис,

1
-Wconversion предупреждения могут быть устранены (например, в комментарии выше): char a = 5; char b = (char) (a - 1); обратите внимание на скобки.
Джеймс Моррис,

1

Я обычно просто использую


1

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.