2009-05-20 16 views
2

In gcc erfordern bestimmte Warnungen, dass die Optimierung aktiviert wird. Beispiel:gcc schaltet um, um die Analyse für Warnungen zu aktivieren

int foo() { 
    int x; 
    return x; 
} 

Um die nicht initialisierte Variable zu erkennen, muss -O übergeben werden.

$ gcc -W -Wall -c test.c 
$ gcc -W -Wall -c test.c -O 
test.c: In function ‘foo’: 
test.c:3: warning: ‘x’ is used uninitialized in this function 

Dies kann jedoch das Debugging beeinträchtigen. Gibt es eine Möglichkeit, nur die Analysephasen zu aktivieren, die für Warnungen benötigt werden (und nicht nur diese bestimmte Warnung, sondern so viele wie möglich), ohne den generierten Code zu sehr zu beeinflussen?

Ich benutze gcc Version 4.3.3 (Ubuntu 4.3.3-5ubuntu4) auf x86-64.

+3

Die dumme Antwort wäre, es mit -O für die Warnungen zu kompilieren, und dann ohne es für das Debuggen. Ich hoffe wirklich, dass es einen besseren Weg gibt. – Zifre

+0

Der Grund, warum gcc diese Warnung nicht ohne -O ausgibt, ist, dass es keine Datenflussanalyse ohne -O durchführt. Sie bitten es also, das DFA auszuführen, aber die Ergebnisse zu verwerfen, außer sie zu verwenden, um Warnungen auszugeben. Dies würde ungefähr so ​​lange dauern, wie es mit -O kompiliert wird, obwohl hoffentlich nicht so lange wie Zifres Vorschlag. Aber ich kenne keine Möglichkeit, gcc dazu zu bringen, und die Manpage impliziert, dass es unmöglich ist. –

+0

-O ist schnell genug, ich hoffe nur, es wird nicht Debugging mist. Vorschläge zur Aktivierung bestimmter Optimierungsphasen, die gdb nicht unterbrechen, aber eine Warnanalyse durchführen, sind ebenfalls willkommen. – bdonlan

Antwort

2

Verwenden Sie -Wall statt -W. -W ist veraltet IIRC. (Wie Jonathan Leffler weist darauf hin, in einem Kommentar, ist -W ‚s Ersatz -Wextra, nicht -Wall.)

[Bearbeiten]

-Wunused-variable
warnen, wenn eine lokale Variable oder nicht konstantes statisches Variable nicht verwendet wird abgesehen von seiner Erklärung. Diese Warnung wird von -Wall aktiviert.

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

[Bearbeiten]

Dieses Verhalten hat changed in GCC 4.4:

Uninitialized Warnungen erfordern keine Optimierung mehr ermöglichen, das heißt, kann -Wuninitialized zusammen mit -O0 verwendet werden. Nichtsdestoweniger werden die Warnungen von -Wuninitialized wahrscheinlich genauer sein, wenn die Optimierung aktiviert ist.

+0

Wie in meinem obigen Beispiel gezeigt, reicht die Übergabe von -W-Wall nicht aus, um eine Datenflussanalyse mit deaktivierter Optimierung durchzuführen. – bdonlan

+0

Ich habe dieses Problem nicht. Immer wenn ich -Wall benutze, bekomme ich die Warnung (aber nicht mit -W). Welche GCC-Version verwenden Sie? –

+0

Meine gcc-Version zu der Frage hinzugefügt. – bdonlan

0

DDD und gdb können meist mit dem Code mit gcc -O -g zusammengestellt bewältigen. Manchmal sind Variablen nicht im Umfang, wenn man sie erwartet, aber DDD ist clever genug, um "optimized away" zu sagen, anstatt auszubrechen. Aber es ist keine Frage, es ist einfacher zu debuggen mit -O ausgeschaltet — Ich habe dies viel mit meinem Studenten Code gesehen.

0

Dies ist, was Sie für Ihre automatisierte Build haben. Lassen Sie Ihre automatisierte Build-Engine mit -Werror -Wall -O2 erstellen, und Sie werden alle Warnungen, die durch höhere Optimierungsstufen ausgelöst werden, abfangen.

+0

Für kleine Hobby-Projekte muss ich nicht unbedingt einen automatisierten Build-Engine haben ... – bdonlan

+0

Warum nicht? Du magst Schmerzen? –

+0

Ein System wie Hudson ist * wirklich * einfach einzurichten und zu konfigurieren, man kann es problemlos auch für kleine Hobbyprojekte verwenden. – JesperE

Verwandte Themen