Zalecane opcje ostrzeżeń gcc dla C [zamknięte]

Odpowiedzi:

48

Rutynowo używam:

Ten zestaw przyciąga wiele osób, które nie są do niego przyzwyczajone (osoby, których kod mogę skompilować z tymi flagami po raz pierwszy); rzadko sprawia mi to problem (chociaż -Wcast-qual jest czasami uciążliwe).

Jonathan Leffler
źródło
1
Obecnie uważam, że muszę dodać „ -Wdeclaration-after-statement”, aby wykryć kod, którego MSVC (który nadal jest w zasadzie kompilatorem C89) nie będzie obsługiwać. To utrapienie. Dodanie „ -Wextra” może również wykryć inne problemy.
Jonathan Leffler
2
Warto też dodać -O3lub coś podobnego; istnieją ostrzeżenia, które są generowane tylko wtedy, gdy kod jest zoptymalizowany.
Jonathan Leffler
3
zgodnie z dokumentacją gcc, -O2 jest najlepszym narzędziem do wykrywania ostrzeżeń. Nie jestem pewien, czy -O3 implikuje -O2, czy też zezwalam na generowanie większej liczby ostrzeżeń.
Offirmo
3
Pomiń -m64, jeśli nie jesteś w środowisku 64-bitowym.
Tor Klingberg,
1
Używanie obu -m32 i -m64 (oczywiście w oddzielnych przebiegach) zapewnia lepszą ochronę przed różnymi błędami w sposobie używania printf()i scaf()specyfikacjach konwersji.
Jonathan Leffler,
41

Od 2011-09-01, z wersją gcc 4.6.1

Mój obecny alias „deweloperski”

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 \
    -Definicja w stylu złota -Werror \
    -ggdb3 \
    -O0 \
    -fno-omit-frame-pointer -ffloat-store -fno-common -fstrict-aliasing \
    -lm

Alias ​​„zwolnienia”

gcc -std = c89 -pedantic -O3 -DNDEBUG -flto -lm

Od 2009-11-03

alias „deweloperski”

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

alias „release”

gcc -lm -std = c89 -pedantic -O3 -DNDEBUG --combine -fwhole-program -funroll-loops
pmg
źródło
1
-Wfloat-equaldodany do mojego aliasu. Dziękuję Mark
pmg
4
Zauważ, że -Wstrict-aliasing=2faktycznie obniża poziom ostrzeżenia -Wstrict-aliasing=3implikowanego przez -Wall, przynajmniej w najnowszej wersji gcc.
nwellnhof
15

Lubię -Werror. Utrzymuje kod ostrzeżenia za darmo.

JesperE
źródło
21
Bez -Werror wszystkie inne opcje ostrzegawcze są bezcelowe. Traktowanie ostrzeżeń jako błędów jest właściwie jedynym sposobem na rozwiązanie problemu. Jeśli są to tylko ostrzeżenia, programista może zdecydować o pozostawieniu jednego, ponieważ jest pewien, że jest nieważny. Może to nawet prawda, ale następny programista nie naprawi ostrzeżeń, które wprowadził, ponieważ nie widział ich między wszystkimi innymi lub dlatego, że jest to tylko jedno dodatkowe ostrzeżenie.
Kristof Provost,
6
Nie zgadzam się z Kristofem, ponieważ wiele razy wolałbym po prostu najpierw skompilować kopię roboczą, a dopiero potem zająć się błędami.
Yktula,
9
Rozumiem, dlaczego jest to kuszące, ale kiedy / jeśli masz kopię roboczą, będziesz bardziej skłonny zostawić ją tak, jak jest, ponieważ „działa”. Ryzyko to jest jeszcze większe w środowisku korporacyjnym, gdzie będziesz musiał przekonać swojego szefa, aby zostawił Ci trochę czasu na naprawienie ostrzeżeń.
JesperE
2
Rozważam pozbycie #warningsię dobrego efektu ubocznego stosowania -Werror.
JesperE
3
jeśli pracujesz nad rozwiązaniami Open Source, nie używaj -Werrordomyślnie w swoich kompilacjach, denerwuje to pakerów, którzy używają różnych wersji kompilatora od Ciebie, ponieważ ostrzeżenia zmieniają się wraz z wersją kompilatora, czasami kod, który jest ostrzegawczy, będzie dla Ciebie ostrzeżenie dla kogoś innego i następnie muszą zagłębić się w system kompilacji, aby go wyłączyć.
Spudd86
15

Zacząłem od C ++, więc kiedy przestawiłem się na naukę CI, upewniłem się, że jestem ekstra-analityczny:

-f długość-wiadomości = 0
-ansi -pedantic -std = c99
-Werror
-Ściana
-Wextra
-Wpisać ciągi
-Winit-self
-Wcast-align
-Wcast-qual
-Wpointer-arith
-Wcisłe aliasing
-Wformat = 2
-Brak-deklaracji
-Wmissing-include-dirs
-Wno-nieużywany-parametr
-Wuninitialized
-Definicja w stylu złotym
-Wstrict-prototypes
-Brak-prototypów
Tomek
źródło
5
Czy możesz używać -ansi -pedantic -std = c99 w tym samym czasie? Czy -ansi nie jest w przybliżeniu tym samym, co c89? a jeśli tak, jak to działa z flagą c99?
Johan
2
@Johan - możesz i nie jest to konieczne, o czym dowiedziałem się niedawno. -ansi implikuje -std = <default>, więc naprawdę możesz po prostu powiedzieć -std = c99 -pedantic i uzyskać dokładnie ten sam efekt. I tak zwykle go używam, tylko dla efektu dokumentacji. Wydaje mi się, że brzmi: „Ten kod jest zgodny ze standardem ANSI (pedantyczny!), Przy użyciu standardowego C99”. Zaraz potem zwykle pojawia się -Wno-long-long lub podobny ... wszelkie wyjątki od standardu ANSI.
Tom
9

Pobierz instrukcję dla używanej wersji GCC, znajdź wszystkie dostępne opcje ostrzeżeń , a następnie dezaktywuj tylko te, dla których masz do tego ważny powód. (Na przykład niemodyfikowalne nagłówki innych firm, które w przeciwnym razie dawałyby wiele ostrzeżeń). Udokumentuj te powody. (W Makefile lub gdziekolwiek ustawisz te opcje.) Przeglądaj ustawienia przy regularnych interwałach i za każdym razem, gdy aktualizujesz swój kompilator.

Kompilator to twój przyjaciel. Ostrzeżenia są twoim przyjacielem. Daj kompilatorowi jak największą szansę na poinformowanie Cię o potencjalnych problemach.

DevSolar
źródło
1
Do Twojej wiadomości, podręcznik nie zawiera jednej pełnej listy ostrzeżeń. Możesz jednak znaleźć takie listy tutaj , wraz z narzędziami używanymi do ich generowania.
Kyle Strand
5

Używam również:

-Wstrict-overflow = 5

Aby wyłapać te okropne błędy, które mogą wystąpić, gdy napiszę kod, który opiera się na zachowaniu przepełnienia liczb całkowitych.

I:

-Wextra

Co daje pewne opcje, które są również przyjemne. Jednak większość z nich jest przeznaczona dla C ++.

Nils Pipenbrinck
źródło
4
-Wextra wydaje się być nową nazwą dla -W (która jest również nadal obsługiwana)
Sard
2

Zwykle kompiluję z "-W -Wall -ansi -pedantic", co pomaga zapewnić maksymalną jakość i przenośność kodu.

Evan Teran
źródło
3
tylko uwaga -ansi zastępuje -std = c99
Sard
2
Czy -ansi nie jest równoważne użyciu -std = c89?
helpermethod
2

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

W trybie „Zranić mnie dużo” zostawiam -Wnie ...

Lubię, gdy mój kod jest wolny od ostrzeżeń, szczególnie w C ++. Podczas gdy ostrzeżenia kompilatora C często można zignorować, wiele ostrzeżeń C ++ pokazuje podstawowe defekty w kodzie źródłowym.

Thorsten79
źródło
3
Ponieważ łańcuch narzędzi może umieścić literały łańcuchowe w pamięci tylko do odczytu.
DevSolar,
3
Dlaczego -Wno-nieużywany-parametr? Bardzo rzadko wskazuje na rzeczywiste problemy (i „bardzo rzadko” dokładne niebezpieczeństwo związane z jego wyłączeniem: najgorsze do wykrycia są nieprawdopodobne błędy). Na przykład, jeśli może się uruchomić Foo(int dndu, int dndv) : dndu_(dndu), dndv_(dndu) {}-> stosunkowo trudne do wykrycia. Jeśli denerwuje Cię to ostrzeżenie, powinieneś po prostu odkomentować parametr foo (int /*q*/), co również zwiększy czytelność twojego kodu.
Sebastian Mach
Podczas refactoring mam czasami zasłonięta parametru przez pomyłkę z lokalną, pomaga złapać że zbyt
paulm
1

-pedantyczne-błędy

Tom Ritter
źródło
2
@unexist Spróbuj zainstalować clang(kompilator C projektu LLVM), a następnie skompiluj z nim, -Weverythinga zobaczysz, jak przyjemna kompilacja może się stać (niektóre ostrzeżenia są całkowicie szalone, ale technicznie poprawne).
Mecki
1

-Wfloat-equal, -Wshadow, -Wmissing-prototypes,

Mark Bessey
źródło
1

-Wredundant-decls -Wnested-externs -Wstrict-prototypes -Wextra -Werror-implicit-function -laration -Wunused -Wno-unused-value -Wreturn-type

floren
źródło
1

Obecnie używam:

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

Listę tę zaczerpnąłem głównie z książki „Wprowadzenie do gcc”, a następnie z rekomendacji Ulricha Dreppera na temat programowania obronnego ( http://people.redhat.com/drepper/Defensive-slides.pdf ).

Ale nie mam żadnej nauki za moją listą, po prostu czułem się jak dobra lista.

/ Johan


Uwaga: nie lubię jednak tych pedantycznych flag ...

Uwaga: Myślę, że -W i -Wextra to mniej więcej to samo.

Johan
źródło
2
Po użyciu -Wconversion i spędzeniu kilku godzin na testowaniu różnych typów danych w moim kodzie i ponownym kompilowaniu, zbadałem -Wconversion i ogólnie nie polecałbym używania go. Problem polega na tym, że generuje ostrzeżenia o kodzie, takie jak: char a = 5; char b = a - 1; Używa gcc 4.3.2 (Debian 4.3.2.-1.1)
James Morris,
1
-W ostrzeżenia o konwersji można wyeliminować (na przykład w powyższym komentarzu): char a = 5; char b = (char) (a - 1); zwróć uwagę na nawiasy.
James Morris,
1

Generalnie po prostu używam

amaterasu
źródło
1

Ostrzeżenie o niezainicjowanych zmiennych nie działa, chyba że określisz -O, więc umieszczam to na mojej liście:

Josh Lee
źródło