Jak włączyć (dosłownie) WSZYSTKIE ostrzeżenia GCC?

194

Chciałbym włączyć - dosłownie - WSZYSTKIE ostrzeżenia, które ma GCC. (Myślisz, że to będzie łatwe ...)

  • Pomyślałbyś, że -Wallmoże załatwić sprawę, ale nie! Nadal potrzebuję -Wextra.

  • Pomyślałbyś, że -Wextramoże załatwić sprawę, ale nie! Nie wszystkie ostrzeżenia wymienione tutaj (na przykład -Wshadow) są włączone przez to. I nadal nie mam pojęcia, czy ta lista jest wyczerpująca.

Jak powiedzieć GCC, aby włączyła (nie, jeśli, i, ale, ale!) Wszystkie ostrzeżenia, które ma?

użytkownik541686
źródło
27
@Arafangion: Nie rozumiem, co jest „niejasne” w tym pytaniu - tak, chciałbym włączyć wszystkie ostrzeżenia, które dotyczą mojego kodu, bez względu na to, jak pedantyczne. Z tego powodu jest to bardzo proste: znalazłem niektóre ostrzeżenia, które nie są włączane przez -Wall lub -Wextra, które są pomocne, dlatego chcę wypróbować resztę, aby sprawdzić, czy mogę poprawić swój kod. To takie proste.
user541686,
12
@JachachPileborg: Przed czym ostrzega kompilator?” Potencjalne błędy i / lub zły styl? To znaczy, gdybym znał wszystkie dokładne ostrzeżenia, po prostu włączyłbym je ręcznie, bez potrzeby zadawania pytań. Jeśli odpowiedź brzmi „musisz spojrzeć na kod źródłowy, aby znaleźć je wszystkie”, opublikuj je jako odpowiedź!
user541686,
56
Oferty Clang 3.1 -Weverything.
Alexandre Hamez
5
@Arafangion Cóż, pytanie jest oznaczone jako C ++, więc ... :)
Jakiś programista koleś
5
@JoachimPileborg A teraz jest (wreszcie) zautomatyzowany sposób na wyodrębnienie ostrzeżeń ze źródła: github.com/barro/compiler-warnings
Kyle Strand

Odpowiedzi:

129

Nie możesz

Podręcznik dla GCC 4.4.0 jest wyczerpujący tylko dla tej wersji, ale zawiera listę wszystkich możliwych ostrzeżeń dla 4.4.0. Nie wszystkie znajdują się na stronie, do której prowadzi link, na przykład niektóre opcje specyficzne dla języka znajdują się na stronach opcji C ++ lub Obj-C. Aby znaleźć je wszystkie, lepiej spojrzeć na Podsumowanie opcji

Włączenie wszystkiego obejmowałoby to, -Wdouble-promotionco dotyczy tylko procesorów z 32-bitową jednostką zmiennoprzecinkową o pojedynczej precyzji, która implementuje się floatw sprzęcie, ale emuluje doublew oprogramowaniu. Wykonywanie obliczeń w doublesposób podobny do emulacji oprogramowania i wolniejsze. Jest to istotne w przypadku niektórych wbudowanych procesorów, ale zupełnie nie ma znaczenia w przypadku współczesnych procesorów do komputerów stacjonarnych ze sprzętową obsługą 64-bitowych liczb zmiennoprzecinkowych.

Innym ostrzeżeniem, które zwykle nie jest przydatne, jest -Wtraditionalostrzeżenie o doskonale uformowanym kodzie, który ma inne znaczenie (lub nie działa) w tradycyjnych C, np. W "string " "concatenation"definicjach funkcji ISO C! Czy naprawdę zależy Ci na kompatybilności z 30-letnimi kompilatorami? Czy na pewno chcesz ostrzeżenia do pisania int inc(int i) { return i+1; }?

Myślę, że -Weffc++jest zbyt głośny, aby był użyteczny, opiera się na przestarzałym pierwszym wydaniu Effective C ++ i ostrzega o konstrukcjach, które są całkowicie poprawne w C ++ (i dla których wytyczne zmieniły się w późniejszych wydaniach książki). Nie chcę być ostrzegł, że nie zainicjowałem std::stringczłonka w moim konstruktorze; ma domyślnego konstruktora, który robi dokładnie to, co chcę, dlaczego mam pisać, m_str()aby to nazwać? Te -Weffc++ostrzeżenia, które byłyby pomocne są zbyt trudne dla kompilator wykryć dokładnie (co daje fałszywie ujemne), a te, które nie są użyteczne, takie jak inicjowanie wszystkich członków jawnie, tylko produkować zbyt dużo hałasu, dając fałszywe alarmy.

Luc Danton podał świetny przykład bezużytecznych ostrzeżeń z -Waggregate-returntego, że prawie na pewno nigdy nie ma sensu dla kodu C ++.

tzn. tak naprawdę nie chcesz wszystkich ostrzeżeń, po prostu myślisz, że tak.

Przejrzyj instrukcję, przeczytaj o nich, zdecyduj, które chcesz włączyć, wypróbuj je. W każdym razie przeczytanie instrukcji kompilatora jest dobrą rzeczą. Skrócenie i włączenie ostrzeżeń, których nie rozumiesz, nie jest dobrym pomysłem, zwłaszcza jeśli chcesz uniknąć korzystania z RTFM.

Każdy, kto po prostu wszystko włącza, prawdopodobnie robi to, ponieważ nie ma pojęcia, bo albo spiczasty szef powiedział „bez ostrzeżeń”.

Niektóre ostrzeżenia są ważne, a niektóre nie. Musisz być dyskryminujący lub popsuć swój program. Rozważmy na przykład -Wdouble-promotion. Jeśli pracujesz w systemie wbudowanym, możesz tego chcieć; jeśli pracujesz na systemie stacjonarnym, prawdopodobnie nie. A chcesz -Wtraditional? Wątpię.

Edycja: Zobacz także -Wall-all, aby włączyć wszystkie ostrzeżenia, które są zamknięte jako WONTFIX.

Edycja 2: w odpowiedzi na skargę DevSolar dotyczącą plików makefile, które muszą używać różnych ostrzeżeń w zależności od wersji kompilatora, jeśli -Wall -Wextranie jest to odpowiednie, użycie CFLAGS specyficznych dla kompilatora i wersji:

compiler_name := $(notdir $(CC))
ifeq ($(compiler_name),gcc)
compiler_version := $(basename $(shell $(CC) -dumpversion))
endif
ifeq ($(compile_name),clang)
compiler_version := $(shell $(CC) --version | awk 'NR==1{print $$3}')
endif
# ...
wflags.gcc.base := -Wall -Wextra
wflags.gcc.4.7 := -Wzero-as-null-pointer-constant
wflags.gcc.4.8 := $(wflags.gcc.4.7)
wflags.clang.base := -Wall -Wextra
wflags.clang.3.2 := -Weverything
CFLAGS += $(wflags.$(compiler_name).base) $(wflags.$(compiler_name).$(compiler_version))
Jonathan Wakely
źródło
38
„Przejrzyj instrukcję, przeczytaj o nich, zdecyduj, które chcesz włączyć, wypróbuj je”. Problemem są kroki, które pominąłeś: „Ponownie odwiedź instrukcję dla każdej wersji kompilatora i dostosuj listę ostrzeżeń, ponieważ się zmieniają. Spraw, by Twoje Makefile sprawdzały dokładną wersję kompilatora i używają innej listy ostrzeżeń dla każdego z nich ”. Mamy optymalizacje utrzymywane przez opiekuna; dlaczego nie mieliby się przejmować zapewnianiem tej samej usługi ostrzeżeń?
DevSolar
17
@JonathanWakely: Mam swoje projekty i nie ma wśród nich GCC. Wskazuję na słabość ich produktu. Albo to naprawią, albo zaakceptują winę, że tego nie zrobili, ale to nie ode mnie to zależy, OSS niech to diabli.
DevSolar
14
@JathanathanWakely: „Jeśli chcesz czegoś, poproś o to, nie rób o tym dziwki”. - Nie jestem zobowiązany do udziału w projekcie GCC w celu skrytykowania go, zwłaszcza jeśli nie jest już oznaczony # 31573 jako WONTFIX. To umieszcza ten temat z „zapytaj o to” w „boks o to”.
DevSolar
61
-Weverythingjest, moim zdaniem, lepszym rozwiązaniem niż strategia gcc polegająca na nie dawaniu takiej możliwości. Używam tej flagi z clang, ponieważ moja filozofia polega na tym, że domyślnie chcę, aby wszystkie ostrzeżenia były włączone (ponieważ ktoś uważał, że wystarczy dodać go do kompilatora), a jeśli mi się to nie podoba, wyłączam to ostrzeżenie. Chodzi o to, że nie wiesz o ostrzeżeniach, które się nie uruchamiają, ale wiesz o ostrzeżeniach, których nie chcesz, aby się uruchamiały, i można je łatwo wyłączyć.
David Stone
17
@JathanathanWakely Tak, ale są marne. Najłatwiejszym sposobem sprawdzenia, które ostrzeżenia mogą być istotne dla Twojego kodu, jest sprawdzenie, które ostrzeżenia są wywoływane przez Twój kod; w tym momencie możesz zobaczyć odpowiedni przykład potencjalnie niebezpiecznego kodu z prawdziwego życia przed podjęciem decyzji o wyłączeniu ostrzeżenia. Można to łatwo zrobić za pomocą -Weverythingopcji Clanga , ale nie jest to możliwe w przypadku GCC.
Kyle Strand
71

Zgadzam się z poprzednimi odpowiedziami, że włączenie dosłownie wszystkich ostrzeżeń prawdopodobnie nie jest korzystne, jednak GCC zapewnia dość dogodny sposób na osiągnięcie tego. Komenda

gcc -Q --help=warning

zawiera listę wszystkich obsługiwanych opcji ostrzeżeń z informacją, czy są one aktywne. Można to przy okazji wykorzystać, aby dowiedzieć się, które opcje są (nie) włączone przez np. -WallI-Wextra

gcc -Wall -Wextra -Q --help=warning

Aby włączyć wszystkie ostrzeżenia, możesz użyć wyrażenia regularnego, aby wyodrębnić parametry wiersza polecenia

gcc -Q --help=warning | sed -e 's/^\s*\(\-\S*\)\s*\[\w*\]/\1 /gp;d' | tr -d '\n'

Dla mojego obecnego GCC daje to:

-Wabi -Wabi-tag -Waddress -Waggregate-return -Waggressive-loop-optimizations -Waliasing -Walign-commons -Wampersand -Warray-bounds -Warray-temporaries -Wassign-intercept -Wattributes -Wbad-function-cast -Wbool-porównaj -Wbuiltin-makro-przedefiniowany -Wc ++ - kompatybilny -Wc ++ 0x-kompatybilny -Wc ++ 14-kompatybilny -Wc-typ wiązania -Wc90-c99-kompatybilny -Wc99-c11-kompatybilny -Wcast-align -Wcast-Qual -Wchar-subscripts -Wcharacter-truncation -Wchkp -Wclobbered -Wcomment -Wcompare-reals -Wconditionally-obsługiwane -Wconversion -Wconversion-extra -Wconversion-null -Wcoverage-mismatch -Wcpp -Wctor-dtor-privacy -Wdate-date-date -after-statement -Wdelete-niekompletne -Wdelete-non-virtual-dtor -Wdeprecated -Wdeprecated-declarations -Wdesignated-init -Wdisabled-optimization -Wdiscarded-array-qualifiers -Wdiscarded-kwalifikatory -Wdiv-by-zero -Wdouble-Promotion -Weffc ++ -Wempty-body-Wendif-etykiety -Wenum-porównaj -Wextra -Wfloat-równe -Wformat-zawiera-nul -Wformat-dodatkowe-args -Wformat-nieliteralny -Wformat-bezpieczeństwo -Wformat-podpisanie -Wformat-y2k -Wformat-zero-długość -Wolne -nonheap-object -Wfunction-eliminacja -Wignored-kwalifikatory -Wimplicit -Wimplicit-funkcja-deklaracja -Wimplicit-int -Wimplicit-interface -Wimplicit-procedure -Wincompatible-pointer-types -Winherited-variadic-ctor -Winit-self -Winline -Wint-konwersji -Wint-to-pointer-cast -Wintrinsic-shadow -Wintrinsics-std -Winvalid-memory-model -Winvalid-offsetof -Winvalid-pch -Wjump-misses-init -Wline-truncation -Wliteral-sufiks -Wlogical -nie-nawiasy -Wlogiczne-op -Długi-długi -Dziewczyna -Wmaybe-niezainicjowany -Wmemset-transponowane-args -Wiss-nawiasy klamrowe -Wississ-deklaracje -Wississ-field-inicjalizatory -Wississ-include-dirs -Wississ-parametr-type -Brak prototypów-Wmultichar -Wnarrowing -Wnested-externs -Wnoexcept -Wnon-template-friend -Wnon-virtual-dtor -Wnonnull -Wodr -Wold-style-cast -Wold-style-deklaration -Wold-style-definition -Wopenmp-simd -Woverflow -Woverlength-strings -Woverloaded-virtual -Woverride-init -Wpacked -Wpacked-bitfield-kompatybil -Wpadded -Wparentheses -Wpedantic -Wpmf-konwersje -Wpointer-arith -Wpointer-sign -Wpointer-to-int-cast -Wpragmas -Wproperty -assign-default -Wprotocol -Wreal-q-constant -Wrealloc-lhs -Wrealloc-lhs-all -Wredundant-decls -Wreorder -Wreturn-local-addr -Wreturn-type -Wselector -Wsequence-point -Wshadow -Wshadow-ivar -Wshift-count-minus -Wshift-count-overflow -Wsign-Compare -Wsign-promo -Wsized-deallocation -Wsizeof-array-argument -Wsizeof-wskaźnik-memaccess -Wstack-protector -Wstrict-null-sentinel -Wstrict-prototypes -Silne dopasowanie selektora-Wsuger-atrybut = const -Wsuger-atrybut = format -Wsuger-atrybut = niewiedza -Wsuger-atrybut = czysty -Wsuger-końcowe-metody -Wsugeruj-końcowe-typy -Wsugeruj-zastąpienie -Wzaskakujący -Wswitch -Wswitch-bool -Wswitch -default -Wswitch-enum -Wsync-nand -Wsynth -Wsystem-headers -Wtabs -Wtarget-lifetime -Wtraditional -Wtraditional -version -Wtrampolines -Wtrigraphs -Wtype-limit -Wundeclared-selector -Wundef -Wunderflow -Wuninitial -Wunsafe-loop-optimizations -Wunsuffixed-float-constants -Wunused -Wunused-but-set-parameter -Wunused-but-set-variable -Wunused-dummy-argument -Wunused-function -Wunused-label -Wunused-local-typedefs -Wunused-macros -Wunused-parameter -Wunused-result -Wunused-value -Wunused-variable -Wuse-without-only -Wuseless-cast -Wvarargs -Wvariadic-macros -Wvector-operation-performance -Wvirtual-move-przypis-Wvla -Wvolatile-register-var -Wwrite-string -Wzero-as-null-pointer-constant -Wzerotrip -frequire-return-statement

Można to teraz wykorzystać do wywołania GCC, tj

gcc $(gcc -Q --help=warning | sed -e 's/^\s*\(\-\S*\)\s*\[\w*\]/\1 /gp;d' | tr -d '\n')

Należy jednak pamiętać, że powoduje to ostrzeżenia, ponieważ niektóre opcje ostrzeżeń są dostępne tylko dla niektórych języków (np C++.). Można tego uniknąć, stosując więcej wyrażeń regularnych, aby uwzględnić tylko opcje dozwolone dla bieżącego języka lub dodając odpowiedni -Wno-whateverna końcu połączenia.

Haatschii
źródło
10
Obawiam się, że to nie jest praktyczne. Gcc pokazał mi ostrzeżenia ze standardowej biblioteki lib.
Valentin Heinitz,
13
@ValentinHeinitz Jak powiedziałem, nie sądzę, aby włączenie dosłownie wszystkich ostrzeżeń było korzystne, ale właśnie o to poprosił OP. Myślę jednak, że poprzez wyraźne usunięcie niektórych problematycznych ostrzeżeń wspomnianych już w innych odpowiedziach (np. Poprzez dodanie odpowiedniego -Nie-cokolwiek na końcu połączenia), może to być przydatne.
Haatschii
6
@ValentinHeinitz Możesz uniemożliwić gcc wysyłanie ostrzeżeń dla nagłówków systemowych / standardowych / zewnętrznych, używając -isystemzamiast -Iodpowiednich katalogów.
Kyle Strand
4
To powinna być zaakceptowana odpowiedź, ponieważ faktycznie i bezpośrednio odpowiada na pytanie.
TFuto,
16

Po prostu niemożliwe jest zaprogramowanie z włączonymi wszystkimi ostrzeżeniami (chyba że masz zamiar je zignorować, ale w takim razie po co to przeszkadzać?). Na przykład, załóżmy użyć poniższy zestaw flag: -Wstrict-prototypes -Wtraditional.

Nawet przy włączonych dwóch ostrzeżeniach następujący program będzie narzekał.

/tmp $ cat main.c 
int main(int argc, char **argv) {
    return 0;
}
/tmp $ gcc -Wstrict-prototypes -Wtraditional main.c 
main.c: In function main’:
main.c:1:5: warning: traditional C rejects ISO C style function definitions [-Wtraditional]
 int main(int argc, char **argv) {
     ^

Możesz pomyśleć „no cóż, wtedy użyję prototypów starego stylu”. Nie, to nie zadziała.

/tmp $ cat main.c 
int main(argc, argv)
    int argc;
    char **argv;
{
    return 0;
}
/tmp $ gcc -Wstrict-prototypes -Wtraditional main.c 
main.c:1:5: warning: function declaration isnt a prototype [-Wstrict-prototypes]
 int main(argc, argv)
     ^

I nie, nieokreślenie żadnego prototypu jest również błędne, ponieważ kompilator również narzeka.

/tmp $ cat main.c 
int main() {
    return 0;
}
/tmp $ gcc -Wstrict-prototypes -Wtraditional main.c 
main.c:1:5: warning: function declaration isnt a prototype [-Wstrict-prototypes]
 int main() {
     ^

Jeśli zdefiniujesz jakieś funkcje w swoim programie, nie będziesz mógł używać wszystkich flag, ponieważ kompilator będzie narzekał na każdą możliwą do wyobrażenia definicję funkcji.

W przypadku C ++ jest to możliwe ( -Wtraditionalflaga nie istnieje) i można skompilować bardzo proste programy. Aby włączyć wszystkie ostrzeżenia, skorzystaj z poniższej listy ostrzeżeń (prawdopodobnie niektóre ostrzeżenia są zduplikowane, ponieważ nie zawracałem sobie głowy filtrowaniem włączonych ostrzeżeń -Wall).

-Wabi -Wctor-dtor-privacy -Wnon-virtual-dtor -Wreorder -Weffc++ -Wstrict-null-sentinel -Wno-non-template-friend -Wold-style-cast -Woverloaded-virtual -Wno-pmf-conversions -Wsign-promo -Wextra -Wall -Waddress -Waggregate-return -Warray-bounds -Wno-attributes -Wno-builtin-macro-redefined -Wc++0x-compat -Wcast-align -Wcast-qual -Wchar-subscripts -Wclobbered -Wcomment -Wconversion -Wcoverage-mismatch -Wno-deprecated -Wno-deprecated-declarations -Wdisabled-optimization -Wno-div-by-zero -Wempty-body -Wenum-compare -Wno-endif-labels -Wfatal-errors -Wfloat-equal -Wformat -Wformat=2 -Wno-format-contains-nul -Wno-format-extra-args -Wformat-nonliteral -Wformat-security -Wformat-y2k -Wignored-qualifiers -Winit-self -Winline -Wno-int-to-pointer-cast -Wno-invalid-offsetof -Winvalid-pch -Wunsafe-loop-optimizations -Wlogical-op -Wlong-long -Wmain -Wmissing-braces -Wmissing-field-initializers -Wmissing-format-attribute -Wmissing-include-dirs -Wmissing-noreturn -Wno-mudflap -Wno-multichar -Wnonnull -Wno-overflow -Woverlength-strings -Wpacked -Wpacked-bitfield-compat -Wpadded -Wparentheses -Wpointer-arith -Wredundant-decls -Wreturn-type -Wsequence-point -Wshadow -Wsign-compare -Wsign-conversion -Wstack-protector -Wstrict-aliasing=1 -Wstrict-overflow=5 -Wswitch -Wswitch-default -Wswitch-enum -Wsync-nand -Wsystem-headers -Wtrigraphs -Wtype-limits -Wundef -Wuninitialized -Wunknown-pragmas -Wno-pragmas -Wunreachable-code -Wunused -Wunused-function -Wunused-label -Wunused-parameter -Wunused-value -Wunused-variable -Wvariadic-macros -Wvla -Wvolatile-register-var -Wwrite-strings
Konrad Borowski
źródło
13
Nigdy dotąd nie zadałem sobie trudu, aby to sprawdzić, ale w rzeczywistości nie jest to niemożliwe ... spróbujint main(int, char **); int main(argc, argv) int argc; char **argv; { (void)argc; (void)argv; return 0; }
user541686
2
Nawet z tym trywialnym programem wciąż mogę uzyskać „ostrzeżenie: użycie stosu to 16 bajtów [-Wstack-use =]” ;-)
Marc Glisse
7

Ktoś stworzył zestaw narzędzi do określania pełnego zestawu ostrzeżeń dla danej wersji GCC lub Clang.

W przypadku GCC kopiowanie z pełnej listy ostrzeżeń dostarczonych przez to narzędzie dla twojej wersji kompilatora wydaje się być jedynym sposobem na upewnienie się, że wszystkie ostrzeżenia są włączone, ponieważ (w przeciwieństwie do Clanga) GCC nie zapewnia -Weverything.

Narzędzie wydaje się analizować rzeczywisty c.optplik w kodzie źródłowym GCC, więc jego wyniki powinny być ostateczne.

Repozytorium zawiera również pliki tekstowe z listami ostrzegawczymi wygenerowanymi dla większości wersji GCC i Clang (obecnie Clang 3.2 do 3.7 i GCC 3.4 do 5.3).

https://github.com/barro/compiler-warnings

Kyle Strand
źródło
Oto odpowiedź. Użyj listy „najwyższego poziomu” i dodaj wszystkie argumenty znajdujące się na najwyższym poziomie (bez wcięć / zagnieżdżenia). github.com/Barro/compiler-warnings/blob/master/gcc/…
Jetski S-type
6

Gcc 4.3+ ma teraz -Q --help = ostrzeżenia, możesz nawet podać --help = ostrzeżenia, C, aby po prostu wydrukować ostrzeżenia związane z C.

Właśnie napisałem moduł m4, aby skorzystać z tego (obsługuje także clang -Weverything), patrz wget_manywarnings.m4

Sposób użycia jest dość prosty, w zasadzie moduł włącza każdą flagę ostrzegania. W razie potrzeby usuwasz ostrzeżenia - niektóre z nich są naprawdę bardzo szczegółowe. Przykład: configure.ac

Jeśli nie korzystasz z narzędzi automatycznych, znajdziesz kod, aby włączyć wszystkie wyłączone ostrzeżenia w module m4, co w zasadzie jest wywołaniem gcc przesyłanym przez awk:

flags="-Wall -Wextra -Wformat=2 "$(gcc -Wall -Wextra -Wformat=2 -Q --help=warning,C|awk '{ if (($2 == "[disabled]" || $2 == "") && $1!~/=/ && $1~/^-W/&& $1!="-Wall") print $1 }'

rockdaboot
źródło
3

Z tej strony :

Zauważ, że niektóre flagi ostrzegawcze nie są sugerowane przez -Wall. Niektóre z nich ostrzegają przed konstrukcjami, których użytkownicy na ogół nie uważają za wątpliwe, ale które czasami warto sprawdzić; inni ostrzegają o konstrukcjach, które w niektórych przypadkach są konieczne lub trudne do uniknięcia, i nie ma prostego sposobu modyfikacji kodu w celu wyłączenia ostrzeżenia. Niektóre z nich są włączone przez, -Wextraale wiele z nich musi być włączanych indywidualnie.

Myślę, że pytanie brzmi, które z nich ? Być może mógłbyś grepować tę stronę dla wszystkich linii zaczynających się na -W i uzyskać pełną listę flag ostrzegawczych. Następnie porównaj te z listami pod -Walli -Wextra. Jest też -Wpedantic, choć oczywiście chcesz być jeszcze bardziej pedantyczny =)

paddy
źródło
„I wciąż nie mam pojęcia, czy ta lista jest wyczerpująca” … tak, z pewnością mogę tę stronę przeoczyć, ale pytanie brzmi, czy jest wyczerpująca?
user541686,
1
Nie wiem ... Być może będziesz musiał przelać kod źródłowy GCC. Czy starasz się uczynić swoje życie programistą niezwykle trudnym, czy jest dobry powód, dla którego chcesz widzieć każde możliwe ostrzeżenie? =)
paddy
2
Chciałbym zobaczyć diagnozę mojego kodu przez GCC - uważam, że jest to bardzo pomocne. Ale oczywiście, gdybym już wiedział o wszystkich ostrzeżeniach i które z nich są przydatne (a które nie są), nie byłoby o co pytać. Nie mam prawdziwego sposobu, aby powiedzieć, chyba że spróbuję (i np. Uznałem, że cieniowanie jest pomocne, więc nie jest tak, że są bezużyteczne tylko dlatego, że są wyłączone).
user541686,
3

I nadal nie mam pojęcia, czy ta lista jest wyczerpująca.

Prawdopodobnie jest, ale jedyna lista, która jest w 100% wyczerpująca, jest faktycznym źródłem kompilatora. Jednak GCC jest duży ! I nie wiem, czy wszystkie parametry wiersza polecenia są zebrane w jednym miejscu, czy rozłożone na kilka plików źródłowych. Zauważ też, że niektóre ostrzeżenia dotyczą preprocesora, niektóre dla faktycznego kompilatora, a niektóre dla linkera (który jest całkowicie oddzielnym programem i znajduje się w pakiecie binutils), więc najprawdopodobniej są rozłożone.

Jakiś koleś programisty
źródło
3
I związane z podsumowanie Opcje strony w mojej odpowiedzi, która skupia wszystkie opcje w jedną stronę. Zasady przeglądania kodu GCC nie zezwalają na nowe opcje bez dokumentacji, dlatego dokumenty powinny być wyczerpujące.
Jonathan Wakely