Wie kann ich (buchstäblich) ALLE Warnungen von GCC aktivieren?

194

Ich möchte buchstäblich ALLE Warnungen aktivieren , die GCC hat. (Sie würden denken, es wäre einfach ...)

  • Sie würden denken, -Wallkönnte den Trick tun, aber nein! Noch brauchen -Wextra.

  • Sie würden denken, -Wextrakönnte den Trick tun, aber nein! Nicht alle hier aufgeführten Warnungen (z. B. -Wshadow) werden dadurch aktiviert. Und ich habe immer noch keine Ahnung, ob diese Liste vollständig ist.

Wie kann ich GCC anweisen, alle Warnungen zu aktivieren (ohne Wenn und Aber oder Aber!) ?

user541686
quelle
27
@Arafangion: Ich verstehe nicht, was an der Frage "unklar" ist - ja, ich möchte alle Warnungen aktivieren , die für meinen Code gelten, egal wie pedantisch. Der Grund ist sehr einfach: Ich habe festgestellt, dass einige der Warnungen, die von -Wall oder -Wextra nicht aktiviert werden, hilfreich sind. Daher möchte ich den Rest ausprobieren, um zu sehen, ob ich meinen Code verbessern kann. So einfach ist das.
user541686
12
@JoachimPileborg: "Worüber soll der Compiler warnen?" Mögliche Fehler und / oder schlechter Stil? Ich meine, wenn ich alle genauen Warnungen gewusst hätte, hätte ich sie einfach manuell aktiviert, ohne die Frage stellen zu müssen. Wenn die Antwort tatsächlich lautet "Sie müssen sich den Quellcode ansehen, um alle zu finden", dann posten Sie ihn bitte als Antwort!
user541686
56
Clang 3.1 Angebote -Weverything.
Alexandre Hamez
5
@Arafangion Nun, die Frage ist mit C ++ markiert, also ... :)
Ein Programmierer-Typ,
5
@ JoachimPileborg Und jetzt gibt es (endlich) eine automatisierte Möglichkeit, die Warnungen aus der Quelle zu extrahieren: github.com/barro/compiler-warnings
Kyle Strand

Antworten:

129

Das kannst du nicht.

Das Handbuch für GCC 4.4.0 ist nur für diese Version umfassend, enthält jedoch alle möglichen Warnungen für 4.4.0. Sie befinden sich jedoch nicht alle auf der Seite, auf die Sie verlinken. Einige sprachspezifische Optionen befinden sich beispielsweise auf den Seiten für C ++ - oder Obj-C-Optionen. Um sie alle zu finden, schauen Sie sich besser die Optionsübersicht an

Das Einschalten von allem würde Folgendes umfassen, -Wdouble-promotionwas nur für CPUs mit einer 32-Bit-Gleitkommaeinheit mit einfacher Genauigkeit relevant ist, die floatin Hardware implementiert , aber doublein Software emuliert wird . Berechnungen wie doublebei der Software-Emulation durchführen und langsamer sein. Dies ist für einige eingebettete CPUs relevant, für moderne Desktop-CPUs mit Hardwareunterstützung für 64-Bit-Gleitkomma jedoch völlig irrelevant.

Eine andere Warnung, die normalerweise nicht nützlich ist -Wtraditional, warnt vor perfekt geformtem Code, der in herkömmlichen C-, z. B. "string " "concatenation"oder ISO C-Funktionsdefinitionen eine andere Bedeutung hat (oder nicht funktioniert) ! Interessiert Sie die Kompatibilität mit 30 Jahre alten Compilern wirklich? Möchten Sie wirklich eine Warnung zum Schreiben int inc(int i) { return i+1; }?

Ich denke, es -Weffc++ist zu laut, um nützlich zu sein. Es basiert auf der veralteten ersten Ausgabe von Effective C ++ und warnt vor Konstrukten, die perfekt in C ++ gültig sind (und für die sich die Richtlinien in späteren Ausgaben des Buches geändert haben). Ich möchte es nicht sein warnte, dass ich kein std::stringMitglied in meinem Konstruktor initialisiert habe; Es hat einen Standardkonstruktor, der genau das tut, was ich will. Warum sollte ich schreiben m_str(), um es aufzurufen? Die -Weffc++Warnungen, die hilfreich wären, sind für den Compiler zu schwierig, um sie genau zu erkennen (falsche Negative), und diejenigen, die nicht nützlich sind, wie das explizite Initialisieren aller Mitglieder, erzeugen einfach zu viel Rauschen und geben falsche Positive.

Luc Danton lieferte ein großartiges Beispiel für nutzlose Warnungen -Waggregate-return, die für C ++ - Code mit ziemlicher Sicherheit nie Sinn machen.

dh du willst nicht wirklich alle Warnungen, du denkst nur, dass du es tust.

Lesen Sie das Handbuch durch, lesen Sie mehr darüber, entscheiden Sie, welche Sie aktivieren möchten, und probieren Sie sie aus. Lesen Handbuch des Compilers ist eine gute Sache TM wie auch immer, eine Abkürzung zu nehmen und damit Warnungen Sie nicht verstehen , ist nicht eine sehr gute Idee, vor allem , wenn es um RTFM zu vermeiden ist.

Jeder, der einfach alles anmacht, tut dies wahrscheinlich entweder, weil er keine Ahnung hat, oder weil ein spitzer Chef "keine Warnungen" sagte.

Einige Warnungen sind wichtig, andere nicht. Sie müssen diskriminieren oder Sie bringen Ihr Programm durcheinander. Betrachten Sie zum Beispiel , -Wdouble-promotion. Wenn Sie an einem eingebetteten System arbeiten, möchten Sie dies möglicherweise. Wenn Sie an einem Desktop-System arbeiten, tun Sie dies wahrscheinlich nicht. Und wollen Sie -Wtraditional? Ich bezweifle das.

Bearbeiten: Siehe auch -Wall-all, um alle Warnungen zu aktivieren, die als WONTFIX geschlossen sind.

Bearbeiten 2: Als Reaktion auf die Beschwerde von DevSolar, dass Makefiles je nach Compilerversion unterschiedliche Warnungen verwenden müssen, -Wall -Wextraist es nicht schwierig, compilerspezifische und versionenspezifische CFLAGS zu verwenden , wenn dies nicht geeignet ist:

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
quelle
38
"Gehen Sie das Handbuch durch, lesen Sie darüber, entscheiden Sie, welche Sie aktivieren möchten, und probieren Sie sie aus." Das Problem hierbei sind die Schritte, die Sie ausgelassen haben: "Besuchen Sie das Handbuch für jede Compilerversion erneut und passen Sie Ihre Liste der Warnungen an, da sie sich ändern. Lassen Sie Ihre Makefiles die genaue Compilerversion überprüfen und verwenden Sie eine andere Liste der Warnungen für jeden von ihnen. " Wir haben von den Betreuern beibehaltene Optimierungsniveaus. Warum konnten sie sich nicht die Mühe machen, den gleichen Service für Warnungen bereitzustellen?
DevSolar
17
@ JonathanWakely: Ich habe meine Projekte und GCC gehört nicht dazu. Ich weise auf eine Schwäche in ihrem Produkt hin. Entweder sie reparieren es oder sie akzeptieren die Schuld dafür, dass sie es nicht tun, aber es liegt nicht an mir, es für sie zu reparieren, OSS, verdammt.
DevSolar
14
@ JonathanWakely: "Wenn du etwas willst, frag danach, meckere nicht darüber." - Ich bin nicht verpflichtet, am GCC-Projekt teilzunehmen, um es zu kritisieren, insbesondere nicht, wenn # 31573 bereits als WONTFIX gekennzeichnet wurde. Das bringt dieses Thema von der "Frage danach" in die "Hündin darüber" -Ballpark.
DevSolar
61
-Weverythingist meiner Meinung nach die bessere Lösung als die gcc-Strategie, eine solche Option nicht zu geben. Ich benutze dieses Flag mit clang, weil meine Philosophie ist, dass ich standardmäßig alle Warnungen aktivieren möchte (weil jemand dachte, es sei hilfreich genug, um es dem Compiler hinzuzufügen), und wenn es mir nicht gefällt, deaktiviere ich diese Warnung speziell. Der Punkt ist, dass Sie nicht über Warnungen Bescheid wissen, die nicht ausgelöst werden, aber Sie wissen über Warnungen Bescheid, die nicht ausgelöst werden sollen, und sie können leicht deaktiviert werden.
David Stone
17
@ JonathanWakely Ja, aber sie sind armselig. Der einfachste Weg, um festzustellen, welche Warnungen für Ihren Code relevant sein könnten , besteht darin, festzustellen, welche Warnungen von Ihrem Code ausgelöst werden . An diesem Punkt können Sie ein relevantes, reales Beispiel für den potenziell gefährlichen Code sehen, bevor Sie entscheiden, ob die Warnung deaktiviert werden soll oder nicht. Dies kann leicht mit Clangs -WeverythingOption durchgeführt werden, ist jedoch mit GCC unmöglich.
Kyle Strand
71

Ich würde den vorherigen Antworten zustimmen, dass es wahrscheinlich nicht vorteilhaft ist, buchstäblich alle Warnungen zu aktivieren, jedoch bietet GCC einen einigermaßen bequemen Weg, um dies zu erreichen. Der Befehl

gcc -Q --help=warning

Bietet eine Liste aller unterstützten Warnoptionen mit Informationen darüber, ob sie aktiv sind. Dies kann übrigens verwendet werden, um herauszufinden, welche Optionen durch zB -Wallund (nicht) aktiviert sind-Wextra

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

Um alle Warnungen zu aktivieren, können Sie einen regulären Ausdruck verwenden, um die Befehlszeilenparameter zu extrahieren

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

Für meinen aktuellen GCC bedeutet dies:

-Wabi -Wabi-Tag -Waddress -Waggregate-Return -Waggressive-Loop-Optimierungen -Waliasing -Walign-Commons -Wampersand -Warray-Grenzen -Warray-Temporaries -Wassign-Intercept -Wattributes -Wbad-Funktion-Cast -WBool-Vergleich -Wbuiltin-Makro-neu definiert -Wc ++ - kompatibel -Wc ++ 0x-kompatibel -Wc ++ 14-kompatibel -Wc-Bindungstyp -Wc90-c99-kompatibel -Wc99-c11-kompatibel -Wcast-align -Wcast-qual -Wchar-Indizes -Wcharacter-Kürzung -Wchkp -Wclobbered -Wcomment -Wcompare-Reals -Wbedingte Unterstützung -Wconversion -Wconversion-Extra -Wconversion-Null -Wcoverage-Mismatch -Wcpp -Wctor-dtor-Privacy -Wdate-Time -Wdeclaration -nach-Anweisung-Löschen-unvollständig-Löschen-nicht-virtuell-dtor-Veraltet-Veraltet-Deklarationen-Design-Init-Deaktiviert-Optimierung-Verworfen-Array-Qualifizierer-Verworfen-Qualifizierer-Wdiv-by-Zero-Doppel-Promotion -Weffc ++ -Wempty-Body-Wendif-Labels -Wenum-Vergleich -Wextra -Wfloat-Equal -Wformat-enthält-nul -Wformat-extra-Argumente -Wformat-nicht-wörtlich -Wformat-Sicherheit -Wformat-Signiertheit -Wformat-y2k -Wformat-Null-Länge -Wfree -nonheap-object -Wfunction-Elimination -Wignored-Qualifiers -Wimplicit -Wimplicit-Funktionsdeklaration -Wimplicit-int -Wimplicit-Schnittstelle -Wimplicit-Prozedur -Wincompatible-Zeigertypen -Winherited-Variadic-Ctor -Winit-Self-Winline -Wint-Konvertierung -Wint-zu-Zeiger-Cast -Wintrinsic-Shadow -Wintrinsics-std -Winvalid-Memory-Modell -Winvalid-Offset von -Winvalid-pch -Wjump-Misses-init -Wline-Truncation -Wliteral-Suffix -Wlogical -nicht-Klammern -Wlogical-op -Wlong-long -Wmain -Wmaybe-uninitialized -Wmemset-transponierte-Argumente -Wmissing-Klammern -Wmissing-Deklarationen -Wmissing-Feld-Initialisierer -Wmissing-include-dirs -Wmissing-Parameter-Typ -Wmissing-Prototypen-Wmultichar -Warrowing -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-kompatibel -Wpadded -Wparentheses -Wpedantic -Wpmf-Conversions -Wpointer-Arith -Wpointer-Sign -Wpointer-to-Int-Cast -Wpragmas -Wproperty -zuweisen-Standard -Wprotokoll -Wreal-q-Konstante -Wrealloc-lhs -Wrealloc-lhs-all -Wredundant-Deklarationen -Wreorder -Wreturn-local-addr -Wreturn-Typ -Wselector -Wequenzpunkt -Wschatten -Wadschatten-ivar -Wshift-count-negative -Wshift-count-overflow -Wsign-compare -Wsign-Promo -Wsized-Deallocation -Wsizeof-Array-Argument -Wsizeof-Zeiger-Memaccess -Wstack-Protector -Wstrict-Null-Sentinel -Wstrict-Prototypen -Strenge-Auswahl-Übereinstimmung-Wsuggest-attribute = const -Wsuggest-attribute = format -Wsuggest-attribute = noreturn -Wsuggest-attribute = pure -Wsuggest-final-Methoden -Wsuggest-final-types -Wsuggest-override -Wsurprising -Wswitch -Wswitch-bool -Wswitch -default -Wswitch-enum -Wsync-nand -Wsynth -Wsystem-Header -Wtabs -Wtarget-Lifetime -Wtraditional -Wtraditional-Conversion -Wtrampoline -Wtrigraphs -Wtype-Limits -Wundeclared-Selector -Wundef -Wunderflow -Wuninitialized -Wunkn -Wunsafe-Loop-Optimierungen -Wunsuffixed-Float-Konstanten -Wunused -Wunused-But-Set-Parameter -Wunused-But-Set-Variable -Wunused-Dummy-Argument -Wunused-Funktion -Wunused-Label -Wunused-Local-Typedefs -Wunused-Makros -Wunused-Parameter -Wunused-Ergebnis -Wunused-Wert -Wunused-Variable -Wuse-ohne-nur -Wuseless-Cast -Wvarargs -Wvariadic-Makros -Wvector-Operation-Performance -Wvirtual-Move-Assign-Wvla -Wvolatile-register-var -Wwrite-strings -Wzero-as-null-Zeiger-Konstante -Wzerotrip -frequire-return-Anweisung

Dies kann nun verwendet werden, um den GCC aufzurufen, d. H.

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

Beachten Sie jedoch, dass dies zu Warnungen führt, da einige Warnoptionen nur für bestimmte Sprachen verfügbar sind (z C++. B. ). Diese könnten vermieden werden, indem Sie mehr Regex verwenden, um nur die für die aktuelle Sprache zulässigen Optionen einzuschließen, oder indem Sie -Wno-whateveram Ende des Anrufs einen geeigneten hinzufügen .

Haatschii
quelle
10
Ich fürchte, es ist nicht praktisch. Gcc hat mir Warnungen von std lib gezeigt.
Valentin Heinitz
13
@ValentinHeinitz Wie gesagt, ich halte es nicht für vorteilhaft, buchstäblich alle Warnungen zu aktivieren, aber darum hat OP gebeten. Ich denke jedoch, dass durch das explizite Entfernen einiger problematischer Warnungen, die bereits in anderen Antworten erwähnt wurden (z. B. durch Hinzufügen von entsprechenden -Wno-was auch immer am Ende des Anrufs), dies von praktischem Nutzen sein kann.
Haatschii
6
@ValentinHeinitz Sie können verhindern, dass gcc Warnungen für System- / Standard- / Drittanbieter-Header ausgibt, indem Sie -isystemanstelle -Ider entsprechenden Verzeichnisse verwenden.
Kyle Strand
4
Dies sollte die akzeptierte Antwort sein, da dies tatsächlich und direkt die Frage beantwortet.
TFuto
16

Es ist einfach unmöglich, mit allen aktivierten Warnungen zu programmieren (es sei denn, Sie werden sie ignorieren, aber warum dann?). Angenommen, Sie verwenden die folgenden Flags : -Wstrict-prototypes -Wtraditional.

Selbst wenn zwei Warnungen aktiviert sind, würde sich das folgende Programm beschweren.

/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) {
     ^

Sie denken vielleicht "Nun, dann werde ich Prototypen alten Stils verwenden". Nein, das wird nicht funktionieren.

/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)
     ^

Und nein, es ist auch falsch, keinen Prototyp anzugeben, da sich der Compiler ebenfalls beschweren wird.

/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() {
     ^

Wenn Sie Funktionen in Ihrem Programm definieren, können Sie nicht alle Flags verwenden, da sich der Compiler über jede denkbare Funktionsdefinition beschwert.

Für C ++ ist dies möglich (das -WtraditionalFlag existiert nicht) und sehr einfache Programme können kompiliert werden. Verwenden Sie die folgende Liste von Warnungen, um alle Warnungen zu aktivieren (wahrscheinlich sind einige Warnungen doppelt vorhanden, da ich mich nicht darum gekümmert habe, die von aktivierten Warnungen zu filtern -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
quelle
13
Ich habe mich bis jetzt nie darum int main(int, char **); int main(argc, argv) int argc; char **argv; { (void)argc; (void)argv; return 0; }
gekümmert
2
Selbst mit diesem trivialen Programm kann ich immer noch "Warnung: Stapelverwendung ist 16 Bytes [-Wstack-Nutzung =]" ;-)
Marc Glisse
7

Jemand hat eine Reihe von Tools erstellt, um den vollständigen Satz von Warnungen für eine bestimmte GCC- oder Clang-Version zu ermitteln.

Für GCC scheint das Kopieren aus der vollständigen Liste der von diesem Tool bereitgestellten Warnungen für Ihre Compilerversion die einzige Möglichkeit zu sein, um sicherzustellen, dass alle Warnungen aktiviert sind, da GCC (im Gegensatz zu Clang) keine bereitstellt -Weverything.

Das Tool scheint die eigentliche c.optDatei im GCC-Quellcode zu analysieren , daher sollten die Ergebnisse endgültig sein.

Das Repository enthält auch Textdateien mit den Warnlisten, die für die meisten GCC- und Clang-Versionen generiert wurden (derzeit Clang 3.2 bis 3.7 und GCC 3.4 bis 5.3).

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

Kyle Strand
quelle
Das ist die Antwort. Verwenden Sie die Liste "oberste Ebene" und fügen Sie alle Argumente hinzu, die sich auf der obersten Ebene befinden (nicht eingerückt / verschachtelt). github.com/Barro/compiler-warnings/blob/master/gcc/…
Jetski S-Typ
6

Gcc 4.3+ hat jetzt -Q --help = Warnungen, Sie können sogar --help = Warnungen, C angeben, um nur die C-bezogenen Warnungen auszudrucken.

Ich habe gerade ein m4-Modul geschrieben, um dies zu nutzen (unterstützt auch Clangs -Weverything), siehe wget_manywarnings.m4

Die Verwendung ist ziemlich einfach. Grundsätzlich schaltet das Modul jedes Warnflag ein. Und Sie entfernen Warnungen nach Bedarf - einige sind wirklich sehr ausführlich. Beispiel: configure.ac

Wenn Sie keine Autotools verwenden, finden Sie den Code zum Aktivieren aller deaktivierten Warnungen im m4-Modul. Dies ist im Grunde der durch awk weitergeleitete gcc-Aufruf:

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
quelle
3

Von dieser Seite :

Beachten Sie, dass einige Warnflags nicht von impliziert werden -Wall. Einige von ihnen warnen vor Konstruktionen, die Benutzer im Allgemeinen nicht als fragwürdig betrachten, die Sie jedoch gelegentlich überprüfen möchten. andere warnen vor Konstruktionen, die in einigen Fällen notwendig oder schwer zu vermeiden sind, und es gibt keine einfache Möglichkeit, den Code zu ändern, um die Warnung zu unterdrücken. Einige von ihnen werden von aktiviert, -Wextraaber viele von ihnen müssen einzeln aktiviert werden.

Ich denke die Frage ist welche ? Vielleicht könnten Sie grep die Seite für alle Linien mit -W beginnen, und eine vollständige Liste der Warnflaggen bekommen. Vergleichen Sie diese dann mit den Listen unter -Wallund -Wextra. Es gibt auch -Wpedantic, obwohl Sie offensichtlich noch pedantischer sein wollen =)

Paddy
quelle
"Und ich habe immer noch keine Ahnung, ob diese Liste umfassend ist" ... ja, ich kann diese Seite sicherlich durchsuchen, aber die Frage ist, ist sie umfassend?
user541686
1
Ich weiß nicht ... Möglicherweise müssen Sie den GCC-Quellcode durchgehen. Versuchen Sie, Ihr Leben als Programmierer außerordentlich schwierig zu machen, oder gibt es einen guten Grund, warum Sie jede denkbare Warnung sehen möchten? =)
Paddy
2
Ich würde gerne die Diagnose meines Codes durch GCC sehen - ich finde es sehr hilfreich. Aber wenn ich bereits über alle Warnungen Bescheid gewusst hätte und welche nützlich sind (und welche nicht), hätte ich natürlich nichts zu fragen gehabt. Es gibt keine wirkliche Möglichkeit für mich zu sagen, es sei denn, ich probiere sie aus (und z. B. fand ich das Abschatten hilfreich, so dass es nicht so ist, als wären sie nutzlos, nur weil sie ausgeschaltet sind).
user541686
3

Und ich habe immer noch keine Ahnung, ob diese Liste vollständig ist.

Dies ist wahrscheinlich der Fall, aber die einzige Liste, die zu 100% umfassend ist, ist die eigentliche Quelle für den Compiler. GCC ist jedoch groß ! Und ich weiß nicht, ob alle Befehlszeilenparameter an einem Ort gesammelt oder auf mehrere Quelldateien verteilt sind. Beachten Sie auch, dass einige Warnungen für den Vorprozessor, einige für den eigentlichen Compiler und einige für den Linker (ein völlig separates Programm, das im binutils-Paket enthalten ist) gelten, sodass sie höchstwahrscheinlich verteilt sind.

Ein Programmierer
quelle
3
Ich habe in meiner Antwort auf die Seite Optionsübersicht verlinkt, auf der alle Optionen auf einer Seite zusammengefasst sind. GCC-Codeüberprüfungsrichtlinien erlauben keine neuen Optionen ohne Dokumentation, daher sollten die Dokumente umfassend sein.
Jonathan Wakely