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

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

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

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

Редактировать:

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

 #warning "это записка для меня"

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

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

    -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, но позволяет подавлять их от просмотра определенных файлов / номеров строк. Я давно написал такой инструмент и выпустим его, как только у меня будет время его очистить.

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

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

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

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

     #pragma message ("note to self") 

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

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

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

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

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

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

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

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

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

    Здесь есть отличный список GCC: http://mces.blogspot.com/2008/12/year-end-cleaning-ie-on-warning-options.htm . -Wall не включает все возможные предупреждения, а некоторые из них должны быть включены явно.

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

     if (something); classic_way_to_leak_memory(); 

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

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

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

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

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

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

    никто еще не упомянул компилятор Intel:

    https://software.intel.com/sites/products/documentation/doclib/iss/2013/compiler/cpp-lin/GUID-D060680A-1A18-4574-8291-5C74E6E31335.htm

    -w3 довольно болтливый, поэтому я бы предложил -w2

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

    Поскольку я использую 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 -Weffc ++ . Если вы хотите увидеть только несколько предупреждений из всех списков, используйте ключ -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 

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

     -fmessage-length = 0 (поскольку g ++ имел уродливую привычку сообщения о разрыве строк)
    
     -Wno-deprecated (поскольку я работал над базой кода, ранее существовавшей пространство имен std)
    

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

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

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