Was sind die nützlichen GCC-Flags für C?

Lesezeit: 6 Minuten

Benutzeravatar von Matt Joiner
Matt Tischler

Jenseits der Einstellung -Wallund Einstellung -std=XXXwelche anderen wirklich nützlichen, aber weniger bekannten Compiler-Flags gibt es für die Verwendung in C?

Ich bin besonders an zusätzlichen Warnungen und/oder der Umwandlung von Warnungen in Fehler in einigen Fällen interessiert, um versehentliche Typenabweichungen absolut zu minimieren.

  • Brunnen -save-temps, -Wshadow und -fmudflap waren die größten Funde, von denen ich nichts wusste, danke an alle.

    – Matt Tischler

    10. August 2010 um 5:53 Uhr

  • Kontext, soweit ich das beurteilen kann: Laufen gcc -c [flags-go-here] -o myprog.o myprog.c um ein C-Programm zu kompilieren (nicht zu linken).

    – Rory O’Kane

    14. März 2013 um 2:02 Uhr

Hier sind meine:

  • -Wextra, -Wall: wesentlich.
  • -Wfloat-equal: nützlich, da das Testen von Fließkommazahlen auf Gleichheit normalerweise schlecht ist.
  • -Wundef: warnen, wenn ein nicht initialisierter Bezeichner in einem ausgewertet wird #if Richtlinie.
  • -Wshadow: warnen, wenn eine lokale Variable eine andere lokale Variable, einen Parameter oder eine globale Variable überschattet oder wenn eine eingebaute Funktion überschattet wird.
  • -Wpointer-arith: warnen, wenn irgendetwas von der Größe einer Funktion oder von abhängt void.
  • -Wcast-align: warnen, wenn ein Zeiger so geworfen wird, dass die erforderliche Ausrichtung des Ziels erhöht wird. Warnen Sie beispielsweise, wenn a char * wird zu einem gegossen int * auf Maschinen, auf denen auf Ganzzahlen nur an Zwei- oder Vier-Byte-Grenzen zugegriffen werden kann.
  • -Wstrict-prototypes: warnen, wenn eine Funktion deklariert oder definiert wird, ohne die Argumenttypen anzugeben.
  • -Wstrict-overflow=5: warnt vor Fällen, in denen der Compiler basierend auf der Annahme optimiert, dass kein signierter Überlauf auftritt. (Der Wert 5 ist möglicherweise zu streng, siehe Handbuchseite.)
  • -Wwrite-strings: String-Konstanten den Typ geben const char[length] damit das Kopieren der Adresse von einem in ein Nicht-const char * Zeiger erhält eine Warnung.
  • -Waggregate-return: Warnt, wenn Funktionen definiert oder aufgerufen werden, die Strukturen oder Vereinigungen zurückgeben.
  • -Wcast-qual: warnt, wenn ein Zeiger gecastet wird, um einen Typqualifizierer aus dem Zieltyp zu entfernen*.
  • -Wswitch-default: warnen, wann immer a switch Aussage hat kein default Fall*.
  • -Wswitch-enum: warnen, wann immer a switch -Anweisung hat einen Index vom Typ Aufzählung und es fehlt a case für einen oder mehrere der genannten Codes dieser Aufzählung*.
  • -Wconversion: Warnung vor impliziten Konvertierungen, die einen Wert ändern können*.
  • -Wunreachable-code: warnen, wenn der Compiler erkennt, dass Code niemals ausgeführt wird*.

Die markierten * geben manchmal zu viele falsche Warnungen aus, also verwende ich sie nach Bedarf.

  • Ziemlich vollständige Liste, ich möchte nur noch eine hinzufügen; -Wformat=2: Zusätzliche Formatprüfungen bei printf/scanf-Funktionen.

    – schott

    3. August 2010 um 8:37 Uhr

  • arent all dies impliziert durch -Wall?

    – chacham15

    10. September 2012 um 2:12 Uhr

  • @chacham15, nein, ich glaube nicht. gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

    – Alok Singhal

    10. September 2012 um 4:25 Uhr

  • @Alok hmm, vielleicht ist es nicht Standard unter den Distributionen? Ich weiß, dass ich bei meinem mbp explizit abschalten muss -Wwrite-strings weil ich es so hasse.

    – chacham15

    10. September 2012 um 7:36 Uhr


  • -Wunreachable-codeDie Funktionalität von wurde entfernt (jedoch warnt gcc nicht, wenn die Option noch verwendet wird…) gcc.gnu.org/ml/gcc-help/2011-05/msg00360.html

    – René Nyffenegger

    7. Juli 2017 um 7:47 Uhr

Benutzeravatar von caf
Café

Mehrere der -f Codegenerierungsoptionen sind interessant:

  • -fverbose-asm ist nützlich, wenn Sie mit kompilieren -S um die Assembly-Ausgabe zu untersuchen – es fügt einige informative Kommentare hinzu.

  • -finstrument-functions fügt Code hinzu, um vom Benutzer bereitgestellte Profiling-Funktionen an jedem Einstiegs- und Ausstiegspunkt der Funktion aufzurufen.

  • --coverage instrumentiert die Branches und Calls im Programm und erstellt eine Coverage-Notes-Datei, so dass beim Ausführen des Programms Coverage-Daten erzeugt werden, die formatiert werden können gcov Programm zur Analyse der Testabdeckung.

  • -fsanitize={address,thread,undefined} aktiviert die Codebereinigungen AddressSanitizer, ThreadSanitizer und UndefinedBehaviorSanitizer. Diese instrumentieren das Programm, um zur Laufzeit nach verschiedenen Arten von Fehlern zu suchen.

Zuvor wurde diese Antwort auch erwähnt -ftrapvdiese Funktionalität wurde jedoch durch ersetzt -fsanitize=signed-integer-overflow Dies ist einer der von aktivierten Desinfektionsmittel -fsanitize=undefined.

  • Zum -ftrapvschau mal hier stackoverflow.com/questions/20851061/… .. scheint, als gäbe es einen Fehler, der lange darauf wartet, behoben zu werden.

    – Arjun Sreedharan

    3. Februar 2015 um 3:39 Uhr


  • Können Sie den obigen Kommentar überprüfen?

    – Suraj Jain

    13. Februar 2017 um 7:55 Uhr

  • -ftrapv wurde im Wesentlichen durch -fsanitize=signed-integer-overflow ersetzt.

    – Marc Glisse

    7. Februar 2018 um 17:01 Uhr

Verwenden Sie immer -O oder höher (-O1, -O2, -Os, etc.). Auf der Standard-Optimierungsebene setzt gcc auf Kompilierungsgeschwindigkeit und führt nicht genügend Analysen durch, um vor Dingen wie unitialisierten Variablen zu warnen.

Betrachten Sie die Herstellung -Werror Richtlinie, da Warnungen, die die Kompilierung nicht stoppen, tendenziell ignoriert werden.

-Wall schaltet ziemlich genau die Warnungen ein, die sehr wahrscheinlich Fehler sind.

Warnungen enthalten in -Wextra neigen dazu, gemeinsamen, legitimen Code zu kennzeichnen. Sie können für Codeüberprüfungen nützlich sein (obwohl Programme im Lint-Stil viel mehr Fallstricke flexibler finden), aber ich würde sie nicht für die normale Entwicklung aktivieren.

-Wfloat-equal ist eine gute Idee, wenn die Entwickler des Projekts nicht mit Fließkomma vertraut sind, und eine schlechte Idee, wenn sie es sind.

-Winit-self ist nützlich; Ich frage mich, warum es nicht enthalten ist -Wuninitialized.

-Wpointer-arith ist nützlich, wenn Sie meist portierbaren Code haben, der nicht funktioniert -pedantic.

Benutzeravatar von catphive
Katzensprung

-save-temps

Zurück bleiben die Ergebnisse des Präprozessors und der Assemblierung.

Die vorverarbeitete Quelle ist nützlich zum Debuggen von Makros.

Die Assembly ist nützlich, um festzustellen, welche Optimierungen wirksam wurden. Beispielsweise möchten Sie möglicherweise überprüfen, ob GCC bei einigen rekursiven Funktionen eine Tail-Call-Optimierung durchführt, da Sie ohne diese Funktion möglicherweise den Stack überlaufen lassen.

Ich bin überrascht, dass das noch niemand gesagt hat – das nützlichste Flag meiner Meinung nach ist -g Dadurch werden Debugging-Informationen in die ausführbare Datei eingefügt, sodass Sie sie debuggen und die Quelle schrittweise durchlaufen können (es sei denn, Sie sind kompetent und lesen Assembly und mögen die stepi Befehl) eines Programms, während es ausgeführt wird.

-Schmutzfänger — fügt Laufzeitprüfungen zu allen riskanten Zeigeroperationen hinzu, um UB abzufangen. Dies immunisiert Ihr Programm effektiv gegen Pufferüberläufe und hilft, alle Arten von hängenden Zeigern abzufangen.

Hier ist eine Demo:

$ cat mf.c 
int main()
{
 int a[10];
 a[10]=1; // <-- o noes, line 4
}

$ gcc -fmudflap mf.c -lmudflap
$ ./a.out 
*******
mudflap violation 1 (check/write): time=1280862302.170759 ptr=0x7fff96eb3d00 size=44
pc=0x7f3a575503c1 location=`mf.c:4:2 (main)'
      /usr/lib/libmudflap.so.0(__mf_check+0x41) [0x7f3a575503c1]
      ./a.out(main+0x90) [0x400a54]
      /lib/libc.so.6(__libc_start_main+0xfd) [0x7f3a571e2c4d]
Nearby object 1: checked region begins 0B into and ends 4B after
mudflap object 0xf9c560: name=`mf.c:3:6 (main) a'
bounds=[0x7fff96eb3d00,0x7fff96eb3d27] size=40 area=stack check=0r/3w liveness=3
alloc time=1280862302.170749 pc=0x7f3a57550cb1
number of nearby objects: 1

Benutzeravatar der Community
Gemeinschaft

Nicht wirklich mit C/C++ verwandt, aber trotzdem nützlich:

@file

Legen Sie alle oben genannten guten Flags (die Sie alle angegeben haben) in eine ‘Datei’ und verwenden Sie dieses obige Flag, um alle Flags in dieser Datei zusammen zu verwenden.

z.B:

Datei: CompilerFlags

-Wand

-std=c99

-Wextra

Dann kompilieren:

gcc yourSourceFile @compilerFlags

1425120cookie-checkWas sind die nützlichen GCC-Flags für C?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy