Рекомендовані параметри попередження Gcc для C [закрито]


83

Крім -Wall, які ще застереження люди вважають корисними?

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

Відповіді:


48

Я регулярно використовую:

    gcc -m64 -std=c99 -pedantic -Wall -Wshadow -Wpointer-arith -Wcast-qual \
        -Wstrict-prototypes -Wmissing-prototypes

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


1
У наші дні я вважаю, що мені потрібно додати ' -Wdeclaration-after-statement', щоб виявити код, який MSVC (який досі є в основному компілятором C89) не може обробити. 'Це неприємність. Додавання ' -Wextra' також може виявити деякі інші проблеми.
Джонатан Леффлер,

2
Крім того, це гарна ідея додати -O3або щось подібне; є попередження, які генеруються лише при оптимізації коду.
Джонатан Леффлер

3
згідно з gcc doc, -O2 є найкращим для виявлення попереджень. Я не впевнений, якщо -O3 має на увазі -O2 або дозволить генерувати більше попереджень.
Офірмо

3
Пропустіть -m64, якщо ви перебуваєте не в 64-розрядному середовищі.
Тор Клінгберг

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

40

Станом на 01.09.2011, з gcc версії 4.6.1

Мій нинішній псевдонім "розробки"

gcc -std = c89 -педантичний -Стіна \
    -Wno-відсутні-фігурні дужки -Wextra -Wno-відсутні-поле-ініціалізатори -Wformat = 2 \
    -Wswitch-за замовчуванням -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-jednaкий -Wstrict-aliasing = 2 -Непотрібні відхилення \
    -Визначення стилю Wld -Помилка \
    -ggdb3 \
    -O0 \
    -fno-omit-frame-pointer -ffloat-store -fno-common -fstrict-aliasing \
    -lm

Псевдонім "звільнення"

gcc -std = c89 -педантик -O3 -DNDEBUG -flto -lm

Станом на 2009-11-03

"псевдонім розвитку"

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 \
    -Wrestrict-псевдонім = 2 -ffloat-store -fno-common -fstrict-aliasing \
    -lm -std = c89 -пемантичний -O0 -ggdb3 -pg - покриття

"звільнити" псевдонім

gcc -lm -std = c89 -педантик -O3 -DNDEBUG --комбінат -fwhole-program -funroll-loops

1
-Wfloat-equalдодано до мого псевдоніма. Дякую Марк
pmg

4
Зверніть увагу, що -Wstrict-aliasing=2насправді знижує рівень попередження, що -Wstrict-aliasing=3мається на увазі -Wall, принаймні з останньою версією gcc.
nwellnhof

15

Мені подобається -Werror. Зберігає попередження коду вільним.


21
Без -Werror всі інші варіанти попередження безглузді. Поводження з попередженнями як з помилками - це майже єдиний спосіб забезпечити вирішення попереджень. Якщо це лише попередження, розробник може вирішити залишити таке, оскільки він впевнений, що воно недійсне. Це може навіть бути правдою, але наступний розробник не буде виправляти застереження, які він ввів, оскільки він не бачив їх між усіма іншими, або тому, що це лише ще одне попередження.
Kristof Provost

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

9
Я розумію, чому це спокусливо, але коли / якщо у вас є робоча копія, ви, швидше за все, залишите її такою, якою вона є, бо "вона працює". Цей ризик ще більший у корпоративному середовищі, де вам доведеться переконати начальника залишити вам трохи часу, щоб виправити попередження.
JesperE

2
Я вважаю, що позбутися #warningхорошого побічного ефекту від використання -Werror.
JesperE

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

15

Я почав з C ++, тому, коли я перейшов до вивчення CI, переконався, що маю додатковий анал:

-fmessage-length = 0
-ansi -педантичний -std = c99
-Помилка
-Стіна
-Векстра
-Wwrite-рядки
-Winit-self
-Wcast-вирівнювання
-Wcast-qual
-Зимовка-ариф
-Штрихове згладжування
-Формат = 2
-Відсутні декларації
-Відсутні-включають-рези
-Не використовується параметр
-Вуніціалізований
-Визначення у стилі дерева
-Wstrict-прототипи
-Відсутні прототипи

5
Чи можете ви одночасно використовувати -ansi -pedantic -std = c99? Чи не -ansi приблизно те саме, що c89? і якщо так, то як це працює з прапором c99?
Йохан

2
@ Джохан - ти можеш, і це насправді не потрібно, як я дізнався нещодавно. -ansi має на увазі -std = <за замовчуванням>, тож насправді ви можете просто сказати -std = c99 -pedantic і отримати точно такий же ефект. Я, як правило, використовую його в будь-якому випадку, лише для ефекту документації. Я відчуваю, що там написано: "Цей код є стандартом ANSI (педантичний!), Використовуючи стандарт C99". Відразу після цього, як правило, приходить -Не-довго-довго або подібне ... будь-які винятки зі стандарту ANSI.
Том,

9

Отримайте посібник для використовуваної версії GCC, знайдіть усі доступні опції попередження , а потім деактивуйте лише ті, для яких у вас є вагома причина для цього. (Наприклад, незмінні сторонні заголовки, які в протилежному випадку дають вам багато попереджень.) Документуйте ці причини. (У Makefile або там, де ви встановлюєте ці параметри.) Переглядайте параметри під час регулярного інтервалу та кожного разу, коли ви оновлюєте свій компілятор.

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


1
До уваги, посібник не містить єдиного вичерпного переліку попереджень. Однак ви можете знайти такі списки тут , разом із інструментами, що використовуються для їх створення.
Kyle Strand

5

Я також використовую:

-Wstrict-overflow = 5

Щоб вловити ці неприємні помилки, які можуть трапитися, якщо я напишу код, який покладається на поведінку переповнення цілих чисел.

І:

-Векстра

Що дає змогу також мати приємні варіанти. Більшість з них призначені для C ++.


4
-Wextra, здається, нова назва для -W (що також досі підтримується)
Сард

2

Я зазвичай компілюю з "-W -Wall -ansi -pedantic", це допомагає забезпечити максимальну якість і портативність коду.


3
просто примітка -ansi замінює -std = c99
Сард

2
Чи не еквівалент -ansi використанню -std = c89?
helpermethod

2

-пемантичний -Стіна -Векстра -Не писати-рядки -Не використовується-параметр

У режимі "Нашкодь мені багато" я залишаю -Не ...

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


3
Оскільки ланцюжок інструментів має змогу поміщати рядкові літерали в пам’ять лише для читання.
DevSolar

3
Чому -Wno-unused-параметр? Дуже рідко це вказує на реальні проблеми (і "дуже рідко" точна небезпека при його відключенні: неймовірні помилки виявляються найгірше). Наприклад, якщо це може спрацьовувати Foo(int dndu, int dndv) : dndu_(dndu), dndv_(dndu) {}-> відносно важко помітити. Якщо вас дратує це попередження, вам слід просто перевиконати параметр foo (int /*q*/), це також підвищує читабельність вашого коду.
Себастьян Мах

Під час рефакторингу я іноді помилково затінював параметр з локальним, це допомагає вловити і це
paulm

1

-пемантичні-помилки


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


1

-Непотрібні відхилення -Змінені-екстерни -Обмежені-прототипи -Векстра -Помилка-неявна функція-декларація -Використано -Не використовуване значення -Вернення типу


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
-Попередження про перетворення можна усунути (наприклад, у коментарі вище): char a = 5; char b = (char) (a - 1); дужки приміток.
Джеймс Морріс,

1

Я взагалі просто використовую

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

1

Попередження про неініціалізовані змінні не працює, якщо ви не вказали -O, тому я включаю це до свого списку:

-g -O -Wall -Werror -Wextra -pedantic -std=c99

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.