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
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
Antworten:
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).
-O3
etwas Ähnliches hinzuzufügen . Es gibt Warnungen, die nur generiert werden, wenn der Code optimiert ist.
-m32
und -m64
(natürlich in getrennten Läufen) bietet einen besseren Schutz vor verschiedenen Fehlern bei der Verwendung printf()
und den scaf()
Konvertierungsspezifikationen.
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
-Wfloat-equal
zu meinem Alias hinzugefügt. Vielen Dank, dass Sie Mark
-Wstrict-aliasing=2
die Warnstufe von -Wstrict-aliasing=3
impliziert -Wall
zumindest durch eine neuere Version von gcc tatsächlich gesenkt wird.
Ich mag -Werror. Hält die Code-Warnung frei.
#warning
einen guten Nebeneffekt der Verwendung loszuwerden -Werror
.
-Werror
in 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.
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
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.
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 ++.
Normalerweise kompiliere ich mit "-W -Wall -ansi -pedantic", um maximale Qualität und Portabilität des Codes zu gewährleisten.
-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.
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.
-Pedantische Fehler
clang
den C-Compiler des LLVM-Projekts zu und dann zu kompilieren, -Weverything
und Sie werden sehen, wie viel Spaß das Kompilieren wirklich machen kann (einige der Warnungen sind total verrückt, aber technisch korrekt).
-Wfloat-gleich, -Whadow, -Wmissing-Prototypen,
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.
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
-Wfatal-errors
-Wdeclaration-after-statement
Heutzutage 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.