Ich möchte buchstäblich ALLE Warnungen aktivieren , die GCC hat. (Sie würden denken, es wäre einfach ...)
Sie würden denken,
-Wall
könnte den Trick tun, aber nein! Noch brauchen-Wextra
.Sie würden denken,
-Wextra
kö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!) ?
c++
gcc
warnings
compiler-warnings
gcc-warning
user541686
quelle
quelle
-Weverything
.Antworten:
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-promotion
was nur für CPUs mit einer 32-Bit-Gleitkommaeinheit mit einfacher Genauigkeit relevant ist, diefloat
in Hardware implementiert , aberdouble
in Software emuliert wird . Berechnungen wiedouble
bei 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 Schreibenint 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 keinstd::string
Mitglied in meinem Konstruktor initialisiert habe; Es hat einen Standardkonstruktor, der genau das tut, was ich will. Warum sollte ich schreibenm_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 -Wextra
ist es nicht schwierig, compilerspezifische und versionenspezifische CFLAGS zu verwenden , wenn dies nicht geeignet ist:quelle
-Weverything
ist 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.-Weverything
Option durchgeführt werden, ist jedoch mit GCC unmöglich.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
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
-Wall
und (nicht) aktiviert sind-Wextra
Um alle Warnungen zu aktivieren, können Sie einen regulären Ausdruck verwenden, um die Befehlszeilenparameter zu extrahieren
Für meinen aktuellen GCC bedeutet dies:
Dies kann nun verwendet werden, um den GCC aufzurufen, d. H.
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-whatever
am Ende des Anrufs einen geeigneten hinzufügen .quelle
-isystem
anstelle-I
der entsprechenden Verzeichnisse verwenden.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.
Sie denken vielleicht "Nun, dann werde ich Prototypen alten Stils verwenden". Nein, das wird nicht funktionieren.
Und nein, es ist auch falsch, keinen Prototyp anzugeben, da sich der Compiler ebenfalls beschweren wird.
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
-Wtraditional
Flag 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
).quelle
int main(int, char **); int main(argc, argv) int argc; char **argv; { (void)argc; (void)argv; return 0; }
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.opt
Datei 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
quelle
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 }'
quelle
Von dieser Seite :
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
-Wall
und-Wextra
. Es gibt auch-Wpedantic
, obwohl Sie offensichtlich noch pedantischer sein wollen =)quelle
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.
quelle