Лучший уровень предупреждения компилятора для компиляторов C/С++?

Какой уровень предупреждений компилятора вы рекомендуете для разных компиляторов C/С++?

gcc и g++ позволят вам уйти с большим количеством на уровне по умолчанию. Я считаю, что лучший уровень предупреждения для меня - это "-Все". И я всегда стараюсь удалить исправление кода для предупреждений, которые он генерирует. (Даже глупые об использовании круглых скобок для логических правил приоритета или, я говорю, "если (x = y)" )

Каковы ваши любимые уровни для разных компиляторов, таких как Sun CC, aCC (HPUX?), Visual Studio, intel?

Edit:

Я просто хотел указать, что я не использую "-Werror" (но я понимаю его полезность) на gcc/g++, потому что, я использую:

#warning "this is a note to myself"

в нескольких местах моего кода. Все компиляторы понимают макроС#warning?

Ответ 1

Это набор лишних параноидных флагов, которые я использую для кода С++:

    -g -O -Wall -Weffc++ -pedantic  \
    -pedantic-errors -Wextra -Waggregate-return -Wcast-align \
    -Wcast-qual  -Wchar-subscripts  -Wcomment -Wconversion \
    -Wdisabled-optimization \
    -Werror -Wfloat-equal  -Wformat  -Wformat=2 \
    -Wformat-nonliteral -Wformat-security  \
    -Wformat-y2k \
    -Wimplicit  -Wimport  -Winit-self  -Winline \
    -Winvalid-pch   \
    -Wunsafe-loop-optimizations  -Wlong-long -Wmissing-braces \
    -Wmissing-field-initializers -Wmissing-format-attribute   \
    -Wmissing-include-dirs -Wmissing-noreturn \
    -Wpacked  -Wpadded -Wparentheses  -Wpointer-arith \
    -Wredundant-decls -Wreturn-type \
    -Wsequence-point  -Wshadow -Wsign-compare  -Wstack-protector \
    -Wstrict-aliasing -Wstrict-aliasing=2 -Wswitch  -Wswitch-default \
    -Wswitch-enum -Wtrigraphs  -Wuninitialized \
    -Wunknown-pragmas  -Wunreachable-code -Wunused \
    -Wunused-function  -Wunused-label  -Wunused-parameter \
    -Wunused-value  -Wunused-variable  -Wvariadic-macros \
    -Wvolatile-register-var  -Wwrite-strings

Это должно дать вам кое-что для начала. В зависимости от проекта вам может потребоваться его тон, чтобы не видеть предупреждения, поступающие от сторонних библиотек (которые, как правило, довольно неосторожны относительно бесплатного предупреждения). Например, векторный/матричный код Boost заставит g++ испускать много шума.

Лучший способ справиться с такими случаями - написать оболочку вокруг g++, которая по-прежнему использует предупреждения, настроенные до max, но позволяет подавлять их от просмотра определенных файлов/номеров строк. Я написал такой инструмент давно и выпустил его, как только у меня есть время его очистить.

Ответ 2

В Visual С++ я использую /W4 и /WX (рассматриваю предупреждения как ошибки).

VC также имеет /Wall, но он несовместим со стандартными заголовками.

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

Ответ 3

Я считаю, что VC также поддерживает

#pragma message ("note to self")

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

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

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

#pragma warning ( push )
#pragma warning ( 4191 : disable )
// violent code, properly documented
#pragma warning ( pop )

I просто прочитал, у них также есть прагма warning ( N : suppress ).

Ответ 4

Я обычно использую -Wall (потому что все делают ошибки, никто не идеален), но я не использую -Werror (рассматриваю предупреждения как ошибки), потому что время от времени gcc предупреждает о вещах, которые являются правильными в любом случае ( ложные срабатывания).

Ответ 5

Я согласен с litb, чтобы всегда использовать -Wall. Кроме того, если вы хотите, чтобы ваш код был совместим, вы также можете использовать -pedantic. Еще одно предупреждение, которое может быть полезно, если вы обрабатываете союзы и структуры на байтовом уровне, - Wpadded.

Ответ 6

Я делаю все разработки с предупреждением при включении ошибок.

Так как я все еще развивается в VC6, у меня много # прагмы в моем коде (4786 в основном).

Ответ 7

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

if (something);
   classic_way_to_leak_memory();

В Unix-подобных системах вы должны подчиняться предпочтениям пользователя ENV.. поэтому то, что они видят и сообщают, может быть совершенно иным, чем то, что вам нужно:)

Я тоже типа punning fiend, поэтому я предпочитаю устанавливать -Fno-strict-aliasing, если только пользователь этого не хочет. Безопасное управление памятью в классическом C трудно выполнить иначе.

Ответ 9

В Visual C я использую /w 3. Я нахожу, что w4 вызывает слишком много шума (много из библиотек MS), чтобы пройти через каждую сборку. Дополнительные предупреждения очень незначительны и до сих пор не были причиной ошибки.

Ответ 10

В GCC для предпочтения я использую "-Wall -Wextra -Wwrite-strings -Werror", а также задает стандарт со std =. Какой стандарт зависит от проекта: в основном от того, насколько портативным оно должно быть.

Причина, по которой я использую -Werror, заключается в том, что предупреждения неприемлемы (для меня), даже если они не представляют собой реальную ошибку. Я предпочел бы обойти все, что вызвало предупреждение, чем игнорировать предупреждения каждый раз, когда я собираюсь всю оставшуюся жизнь. Как только вы разрешите предупреждения в компиляции, просто слишком легко пропустить тот, который не был в последний раз.

Конечно, имея дело с сторонним кодом, иногда вы не можете избавиться от предупреждений. Затем я решил в каждом конкретном случае решить, следует ли ослабить опции -W, удалить -Werror и написать script, чтобы проверить, что только ожидают предупреждения, или, возможно, изменить сторонний код (либо на "исправить" предупреждение или отключить его с помощью прагм, если это возможно).

Ответ 12

Мне также нравится проверять все возможные предупреждения, которые дают компилятор в моем проекте. К сожалению, ответ о компиляторе Intel С++ был для меня не очень информативным (ссылка мертва). Я провел собственное исследование.

Поскольку я использую Qt 5 и qmake, у меня есть предопределенный уровень предупреждения -w1. Не могу с этим ничего не делать. Но это еще не все, и ICC имеет больше ключей:

-Wcomment 
-Weffc++ 
-Wextra-tokens 
-Wformat 
-Winline // don't use, show only for example
-Wmain 
-Wmissing-declarations 
-Wmissing-prototypes 
-Wnon-virtual-dtor 
-Wp64 
-Wpointer-arith 
-Wremarks 
-Wreturn-type 
-Wsign-compare 
-Wstrict-aliasing 
-Wstrict-prototypes 
-Wtrigraphs 
-Wuninitialized 
-Wunknown-pragmas 
-Wunused-variable

Подробнее о клавишах.

Также я хочу добавить, что, в отличие от GCC, ICC создает несколько предупреждений для одного ключа, например key -WeffС++. Если вы хотите увидеть только несколько предупреждений из всех списков, используйте клавишу -wd.

Я отключу: -wd1418,2012,2015,2017,2022,2013. И предупреждения -wd1572,873,2259,2261 по умолчанию отключены в qmake.

Я использую PCH и нашел очень раздражающим, чтобы видеть в сообщениях Qt Creator об использовании файла PCH, такого как ошибка. Чтобы отключить, используйте -Wno-pch-messages.

Для отключения предупреждения в коде я используйте:

#if defined(Q_CC_INTEL)
    #pragma warning( push )
    #pragma warning( disable: 2021 )
#endif

// some code

#if defined(Q_CC_INTEL)
    #pragma warning( pop )
#endif

Ответ 13

Спасибо всем за их ответы. Прошло некоторое время с тех пор, как я использовал что-либо, кроме gcc/g++. Я уже давно использовал

-fmessage-length = 0 (since g++ had an ugly habit of line breaking messages)

-Wno-deprecated      (since I worked on a code base pre-existing the std namespace)

Я помню, что (как минимум 5 лет назад) ничего выше уровня предупреждения по умолчанию в компиляторе Sun Workshop CC было слишком много. Я также думаю, что это могло быть правдой для компилятора Intel. Я не был в курсе компиляторов non gnu некоторое время.

Ответ 14

Компиляторы GCC становятся более строгими с каждой новой версией. Используйте флаг -ansi для получения предупреждений о нарушениях строжайшей интерпретации стандартов языка ANSI. Обычно это то, что просто происходит в вашем текущем компиляторе, но может приводить к ошибкам в следующей версии или в других компиляторах. Этот флаг поможет вам избежать необходимости переносить свой код каждый раз при переключении компиляторов/версий.