2010-05-20 9 views
21

Flusen einige Warnung erzeugt bekommen Warnung wie:g ++ Wie auf ignoriert Funktion Rückgabewert

foo.c XXX Warning 534: Ignoring return value of function bar() 

Vom Flusen manual

534 Ignorieren Rückgabewert der Funktion

'Symbol' (mit der Position vergleichen) Eine Funktion, die einen Wert zurückgibt, ist genannt nur für Nebenwirkungen wie für Beispiel in einem st atment selbst oder die linke Seite eines Kommas Betreiber. Versuche: (void) function(); zu rufen Sie eine Funktion und ignorieren Sie die Rückgabe Wert. Siehe auch die fvr, fvo und fdr Flags in §5.5 "Flag Options".

Ich möchte diese Warnung, wenn es welche gibt, während der Kompilierung erhalten. Gibt es eine Option in gcc/g ++, um dies zu erreichen? Ich hatte -Wall eingeschaltet, aber das offenbar nicht erkannt.

Antwort

22

Danke an WhirlWind und paxdiablo für die Antwort und den Kommentar. Hier ist mein Versuch, die Teile zu einer vollständigen (?) Antwort zusammenzufügen.

-Wunused-resultist die relevante GCC-Option. Und es ist standardmäßig aktiviert. Zitiert aus gcc warning options page:

-Wno-unused-result

nicht warnen, wenn ein Anrufer einer Funktion mit dem Attribut gekennzeichnet warn_unused_result (siehe Variable Attributes) nicht den Rückgabewert verwenden. Der Standardwert ist -Wunused-result

Also, die Lösung ist, die warn_unused_result Attribut auf die Funktion anzuwenden.

Hier ist ein vollständiges Beispiel. Der Inhalt der Datei unused_result.c

int foo() { return 3; } 

int bar() __attribute__((warn_unused_result)); 
int bar() { return 5; } 

int main() 
{ 
    foo(); 
    bar(); /* line 9 */ 
    return 0; 
} 

und entsprechende Übersetzungsergebnis:

$gcc unused_result.c 
unused_result.c: In function ‘main’: 
unused_result.c:9: warning: ignoring return value of ‘bar’, declared with attribute warn_unused_result 

Hinweis erneut, dass es nicht notwendig ist, haben -Wunused-Ergebnis, da es Standard ist. Man könnte versucht sein, es ausdrücklich zu erwähnen, um die Absicht zu kommunizieren. Obwohl das eine edle Absicht ist, aber nach der Analyse der Situation, würde meine Entscheidung dagegen sein.Denn -Wunused-result in den Kompilieroptionen kann ein falsches Gefühl der Sicherheit/Zufriedenheit erzeugen, das nicht wahr ist, wenn die alle die Funktionen in der Codebasis nicht mit warn_unused_result qualifiziert sind.

5

-Wunused-result sollte dies für Sie tun. Dies ist nicht eine der Warnungen -Wall schaltet:

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

Die Funktion hat den warn_unused_result Attribut, um es (Danke paxdiablo) angelegt haben.

+8

+1, aber bedenken Sie, dass das Attribut warn_unused_result auf die Funktion angewendet werden muss. – paxdiablo

4

Die Antworten zur Verwendung von __attribute__((warn_unused_result)) sind korrekt. GCC ist jedoch nicht so gut in dieser Funktionalität! Beachten Sie: Es wird nicht für Nicht-POD-Typen gewarnt. Das heißt, wenn Sie beispielsweise eine Klasse mit einem Destruktor (oder einer Klasse mit Instanzvariablen mit Destruktoren) zurückgeben, werden Sie nie eine Warnung zum Ignorieren des Ergebnisses erhalten.

Relevante Fehler: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66177

Beispiel, wo es fehlschlägt:

struct Error { 
~Error(); 
}; 

__attribute__((warn_unused_result)) Error test(); 

int main() 
{ 
    test(); 
    return 0; 
} 

also nicht darauf verlassen für Rückgabetypen, die nicht ganz einfach sind.

+0

einige zusätzliche relevante Bugzillas: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=38172 und https://gcc.gnu.org/bugzilla/show_bug.cgi?id=46643 – pestophagous

0

löste ich das Problem wie folgt aus:

#define ignore_result(x) if (x) {} 

dann statt (void)foo() Verwendung ignore_result(foo())

Dann wird der Code mit -Wall kompiliert just fine.

Verwandte Themen