Empfohlene gcc-Warnoptionen für C [geschlossen]

83

Abgesehen von -Wall, welche anderen Warnungen haben die Leute nützlich gefunden?

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

Sard
quelle

Antworten:

47

Ich benutze routinemäßig:

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

Dieses Set fängt eine Menge für Leute ein, die es nicht gewohnt sind (Leute, deren Code ich zum ersten Mal mit diesen Flags kompilieren kann); es gibt mir selten ein Problem (obwohl -Wcast-qual gelegentlich ein Ärgernis ist).

Jonathan Leffler
quelle
1
-Wdeclaration-after-statementHeutzutage muss ich ' ' hinzufügen, um Code zu erkennen, den MSVC (der im Grunde immer noch ein C89-Compiler ist) nicht verarbeiten kann. Es ist ein Ärgernis. Das Hinzufügen von ' -Wextra' kann auch einige andere Probleme erkennen.
Jonathan Leffler
2
Es ist auch eine gute Idee, -O3etwas Ähnliches hinzuzufügen . Es gibt Warnungen, die nur generiert werden, wenn der Code optimiert ist.
Jonathan Leffler
3
Laut gcc doc ist -O2 am besten geeignet, um Warnungen zu erkennen. Ich bin nicht sicher, ob -O3 -O2 impliziert oder ob weitere Warnungen generiert werden können.
Offirmo
3
Überspringen Sie -m64, wenn Sie sich nicht in einer 64-Bit-Umgebung befinden.
Tor Klingberg
1
Die Verwendung von beiden -m32 und -m64 (natürlich in getrennten Läufen) bietet einen besseren Schutz vor verschiedenen Fehlern bei der Verwendung printf()und den scaf()Konvertierungsspezifikationen.
Jonathan Leffler
40

Stand 01.09.2011, mit gcc Version 4.6.1

Mein aktueller Alias ​​"Entwicklung"

gcc -std = c89 -pedantic -Wall \
    -Wno-fehlende-Klammern -Wextra -Wno-fehlende-Feld-Initialisierer -Wformat = 2 \
    -Wswitch-default -Wswitch-enum -Wcast-align -Wpointer-arith \
    -Wbad-Funktions-Cast -Wrict-Overflow = 5 -Wstrict-Prototypen -Winline \
    -Wundef -Wnested-externs -Wcast-qual -Wshadow -Wunreachable-Code \
    -Wlogical-op -Wfloat-gleich -Wstrict-Aliasing = 2 -Wredundant-Decls \
    -Wold-Style-Definition -Werror \
    -ggdb3 \
    -O0 \
    -fno-omit-frame-pointer -ffloat-store -fno-common -fstrict-aliasing \
    -lm

Der Alias ​​"Release"

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

Stand 03.11.2009

Alias ​​"Entwicklung"

gcc -Wall -Wextra -Wformat = 2 -Wswitch-default -Wcast-align -Wpointer-arith \
    -Wbad-Funktion-Besetzung -Strenge-Prototypen -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 ​​"freigeben"

gcc -lm -std = c89 -pedantic -O3 -DNDEBUG --combine -fwhole-program -funroll-loops
pmg
quelle
1
-Wfloat-equalzu meinem Alias ​​hinzugefügt. Vielen Dank, dass Sie Mark
pmg
4
Beachten Sie, dass -Wstrict-aliasing=2die Warnstufe von -Wstrict-aliasing=3impliziert -Wallzumindest durch eine neuere Version von gcc tatsächlich gesenkt wird.
Nwellnhof
15

Ich mag -Werror. Hält die Code-Warnung frei.

JesperE
quelle
21
Ohne -Werror sind alle anderen Warnoptionen sinnlos. Das Behandeln von Warnungen als Fehler ist so ziemlich die einzige Möglichkeit, um sicherzustellen, dass Warnungen behoben werden. Wenn es sich nur um Warnungen handelt, kann ein Entwickler entscheiden, eine zu belassen, da er sicher ist, dass sie ungültig ist. Es mag sogar wahr sein, aber der nächste Entwickler wird die von ihm eingeführten Warnungen nicht korrigieren, weil er sie nicht zwischen allen anderen gesehen hat oder weil es nur eine weitere Warnung ist.
Kristof Provost
6
Ich bin mit Kristof nicht einverstanden, weil ich oft lieber zuerst eine Arbeitskopie zusammenstellen und dann die Fehler beheben möchte .
Yktula
9
Ich verstehe, warum das verlockend ist, aber wenn Sie eine Arbeitskopie haben, werden Sie diese mit größerer Wahrscheinlichkeit so lassen, wie sie ist, weil "sie funktioniert". Dieses Risiko ist in einem Unternehmensumfeld noch höher, in dem Sie Ihren Chef davon überzeugen müssen, Ihnen etwas Zeit zu lassen, um die Warnungen zu beheben.
JesperE
2
Ich denke darüber nach, #warningeinen guten Nebeneffekt der Verwendung loszuwerden -Werror.
JesperE
3
Wenn Sie an Open Source-Inhalten arbeiten, die -Werrorin Ihren Builds nicht standardmäßig verwendet werden, ärgert dies Packager, die andere Compilerversionen als Sie verwenden, da sich die Warnungen mit der Compilerversion ändern. Manchmal hat Code, der für Sie warnungsfrei ist, eine Warnung für eine andere Person und dann müssen sie in Ihr Build-System graben, um es auszuschalten.
Spudd86
15

Ich habe mit C ++ angefangen. Als ich zum Lernen von CI überging, stellte ich sicher, dass ich extra-anal bin:

-fmessage-length = 0
-ansi -pedantic -std = c99
-Fehler
-Mauer
-Wextra
-Schreiben Sie Strings
-Winit-Selbst
-Wcast-Align
-Wcast-qual
-Wointer-Arith
-Strenges Aliasing
-Wformat = 2
-Wmissing-Erklärungen
-Wmissing-include-dirs
-Wno-unused-parameter
-Wuninitialisiert
-Wold-Style-Definition
-Strenge Prototypen
-Wmissing-Prototypen
Tom
quelle
5
Können Sie -ansi -pedantic -std = c99 gleichzeitig verwenden? Ist -ansi nicht ungefähr dasselbe wie c89? und wenn ja, wie funktioniert das mit der c99-Flagge?
Johan
2
@Johan - du kannst, und es ist eigentlich nicht notwendig, wie ich kürzlich herausgefunden habe. -ansi impliziert -std = <Standard>, also könnte man wirklich einfach -std = c99 -pedantic sagen und genau den gleichen Effekt erzielen. Ich benutze es sowieso eher, nur für den Dokumentationseffekt. Ich habe das Gefühl, dass es lautet: "Dieser Code ist ANSI-Standard (pedantisch!) Und verwendet Standard C99." Unmittelbar danach kommt normalerweise -Wno-long-long oder ähnliches ... Ausnahmen vom ANSI-Standard.
Tom
9

Holen Sie sich das Handbuch für die von Ihnen verwendete GCC-Version, finden Sie alle verfügbaren Warnoptionen und deaktivieren Sie nur diejenigen, für die Sie einen zwingenden Grund haben. (Zum Beispiel nicht modifizierbare Header von Drittanbietern, die Ihnen sonst viele Warnungen geben würden.) Dokumentieren Sie diese Gründe. (Im Makefile oder wo immer Sie diese Optionen festlegen.) Überprüfen Sie die Einstellungen in regelmäßigen Abständen und bei jedem Upgrade Ihres Compilers.

Der Compiler ist dein Freund. Warnungen sind dein Freund. Geben Sie dem Compiler so viel Gelegenheit, Sie über mögliche Probleme zu informieren.

DevSolar
quelle
1
Zu Ihrer Information, das Handbuch enthält keine einzige umfassende Liste von Warnungen. Sie finden solche Listen jedoch hier zusammen mit den Tools, mit denen sie generiert wurden.
Kyle Strand
5

Ich benutze auch:

-Strenger Überlauf = 5

Um diese bösen Fehler abzufangen, die auftreten können , wenn ich Code schreibe, der auf dem Überlaufverhalten von Ganzzahlen beruht.

Und:

-Wextra

Dies ermöglicht einige Optionen, die auch schön sind. Die meisten sind jedoch für C ++.

Nils Pipenbrinck
quelle
4
-Wextra scheint der neue Name für -W zu sein (was auch noch unterstützt wird)
Sard
2

Normalerweise kompiliere ich mit "-W -Wall -ansi -pedantic", um maximale Qualität und Portabilität des Codes zu gewährleisten.

Evan Teran
quelle
3
nur eine Notiz -ansi überschreibt -std = c99
Sard
2
Entspricht -ansi nicht der Verwendung von -std = c89?
Hilfsmethode
2

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

Für den Modus "Verletze mich reichlich" lasse ich die -Wno ...

Ich möchte meine Code-Warnung frei haben, besonders mit C ++. Während C-Compiler-Warnungen häufig ignoriert werden können, weisen viele C ++ - Warnungen grundlegende Fehler im Quellcode auf.

Thorsten79
quelle
3
Weil es der Toolchain freisteht, String-Literale in den Nur-Lese-Speicher zu stellen.
DevSolar
3
Warum -Wno-unused-parameter? Sehr selten weist es auf echte Probleme hin (und das "sehr selten" auf die genaue Gefahr beim Deaktivieren: Unwahrscheinliche Fehler sind am schlimmsten zu erkennen). ZB wenn auslösen kann Foo(int dndu, int dndv) : dndu_(dndu), dndv_(dndu) {}-> relativ schwer zu erkennen. Wenn Sie sich über diese Warnung ärgern, sollten Sie den Parameter einfach übertreffen foo (int /*q*/). Dies erhöht auch die Lesbarkeit Ihres Codes.
Sebastian Mach
Während des Refactorings habe ich den Parameter manchmal versehentlich mit einem lokalen beschattet, es hilft auch, diesen zu fangen
Paulm
1

-Pedantische Fehler

Tom Ritter
quelle
2
@unexist Versuchen Sie die Installation clang den C-Compiler des LLVM-Projekts zu und dann zu kompilieren, -Weverythingund Sie werden sehen, wie viel Spaß das Kompilieren wirklich machen kann (einige der Warnungen sind total verrückt, aber technisch korrekt).
Mecki
1

-Wfloat-gleich, -Whadow, -Wmissing-Prototypen,

Mark Bessey
quelle
1

-Wredundant-Deklarationen -Wnested-externs -Wrict-Prototypen -Wextra -Werror-implizite-Funktionsdeklaration -Wunused -Wno-unused-Wert -Wreturn-Typ

Gulden
quelle
1

Im Moment benutze ich:

-Wall -W -Wextra -Wconversion -Wshadow -Wcast-Qual -Wwrite-Strings -Werror

Ich habe diese Liste hauptsächlich aus dem Buch "Eine Einführung in gcc" und dann aus Ulrich Dreppers Empfehlung zur defensiven Programmierung ( http://people.redhat.com/drepper/Defensive-slides.pdf ) entnommen .

Aber ich habe keine Wissenschaft hinter meiner Liste, es fühlte sich einfach wie eine gute Liste an.

/ Johan


Hinweis: Ich mag diese pedantischen Flaggen allerdings nicht ...

Hinweis: Ich denke, dass -W und -Wextra mehr oder weniger dasselbe sind.

Johan
quelle
2
Nachdem ich -Wconversion verwendet und ein paar Stunden damit verbracht habe, verschiedene Datentypen in meinem Code zu testen und neu zu erstellen, habe ich -Wconversion untersucht und würde die Verwendung im Allgemeinen nicht empfehlen. Das Problem besteht darin, dass Warnungen zu Code generiert werden, z. B.: Char a = 5; char b = a - 1; Dies verwendet gcc 4.3.2 (Debian 4.3.2.-1.1)
James Morris
1
-Konvertierungswarnungen können beseitigt werden durch (zum Beispiel im obigen Kommentar): char a = 5; char b = (char) (a - 1); Klammern beachten.
James Morris
1

Ich benutze im Allgemeinen nur

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
amaterasu
quelle
1

Die Warnung zu nicht initialisierten Variablen funktioniert nur, wenn Sie dies angeben. Daher nehme -Oich Folgendes in meine Liste auf:

-g -O -Wall -Werror -Wextra -pedantic -std=c99
Josh Lee
quelle
0

-Wfatal-errors

Adrian Panasiuk
quelle