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

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

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

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

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

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

#warning "this is a note to myself"

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

# предупреждение нестандартное; Я думаю, что #error довольно универсален, хотя

Mikeage 01.01.2009 16:53
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
47
1
32 160
14

Ответы 14

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

Итак, если gcc выдает вам 100 предупреждений, вы просматриваете их все при каждой компиляции? В противном случае я не понимаю, как вы справляетесь с настоящими предупреждениями, похороненными в куче ложных срабатываний ...

Paulius 30.12.2008 12:34

Я тоже не использую Werror. Существуют предупреждения (неиспользуемые функции), исходящие из исходного кода, сгенерированного flex / bison, которые было бы трудно подавить.

Juan 30.12.2008 12:35

Вы можете обойти предупреждения flex / bison, используя методы, описанные здесь: wiki.services.openoffice.org/wiki/Writing_warning-free_code

codelogic 30.12.2008 12:40

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

codelogic 30.12.2008 12:43

Паулюс, если он выдаст мне 100 предупреждений, я исправлю их, поэтому у меня осталось только несколько предупреждений, о которых мне не о чем беспокоиться. использование хороших библиотек позволяет избежать страниц с предупреждениями. также, что говорит codelogic. У меня есть регулярные фазы "предупреждения об убийстве", на которых я их убиваю :)

Johannes Schaub - litb 30.12.2008 12:46

codelogic, спасибо за ссылку. Оказывается, я оставил только одно предупреждение в flex. Я использую:% option noyywrap% option nounput для подавления предупреждений об этих функциях. Тот, от которого я не могу избавиться: Scanner.cc:1241: предупреждение: сравнение знаковых и беззнаковых целочисленных выражений

Juan 30.12.2008 12:55

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

strager 30.12.2008 14:12

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

Paulius 30.12.2008 16:35

Продолжение: И если вы не оставляете эти предупреждения, то я не вижу причин не использовать -Werror, потому что вы все равно их все исправляете ...

Paulius 30.12.2008 16:37

Паулюс, очень редко я получаю предупреждение, которое не исправлю. но когда это так, тогда действительно просто оставлю это. emacs отлично раскрашивает предупреждения, поэтому я не пропущу других :)

Johannes Schaub - litb 30.12.2008 16:46

в любом случае, я считаю, что лучше включить все предупреждения, чем включить только несколько, но включить -Werror только потому, что в противном случае невозможно было бы скомпилировать без ошибок. но это вроде достаточно субъективный вопрос :)

Johannes Schaub - litb 30.12.2008 16:47

Давным-давно при обучении Си предоставленные заголовки библиотек вызвали предупреждения. Вздох.

David Thornley 30.12.2008 20:50

Дэвид, у gcc есть особые способы справиться с этим: gcc.gnu.org/onlinedocs/cpp/System-Headers.html

Johannes Schaub - litb 30.12.2008 22:35

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

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

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

У нас есть особые предупреждения, на которые мы явно не обращаем внимания, и чистая политика компиляции (без предупреждений) для всего остального.

David Thornley 30.12.2008 20:48

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

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

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

#pragma message ("note to self")

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

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

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

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

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

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

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

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

if (something);
   classic_way_to_leak_memory();

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

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

There's a nice list of options for GCC here: http://mces.blogspot.com/2008/12/year-end-cleaning-ie-on-warning-options.htm. -Wall не включает все возможные предупреждения, а некоторые должны быть включены явно.

А еще лучше см. Руководство GCC: gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Warning-Options.html

strager 30.12.2008 14:21

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

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

Кто-то задал аналогичный вопрос, связанный с gcc, и на этот пост была ссылка. Я обновил этот ответ, чтобы удалить повторяющиеся предупреждения (например, -Wformat = 2 подразумевает -Wformat-y2k). См .: stackoverflow.com/a/9862800/852254

David Stone 28.03.2012 04:37

g ++ не будет собираться с -Wimplicit, он специфичен для C / ObjC.

user1244033 24.08.2014 02:37

Кажется, здесь много избыточности. Например (по крайней мере, на GCC) -Wall подразумевает -Wunused. Кроме того, этот ответ был бы намного лучше, если бы вы объяснили флаги.

Lii 03.02.2016 16:04

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

gcc -ansi эквивалентно gcc -std = c89; если это то, что вы хотите, это нормально, но если вы предпочитаете C99, используйте '-std = c99'.

Jonathan Leffler 31.12.2008 00:18

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

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

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

о компиляторе 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 выдает несколько предупреждений для одного ключа, например для ключа -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

Другие вопросы по теме