2013-04-12 3 views
7

Wenn ich das C-Programm kompilieren, bekomme ich diese Warnung: ‘noreturn’ function does return. Dies ist die Funktion:'noreturn' Funktion gibt

void hello(void){ 
    int i; 
    i=1; 
} 

Warum konnte es passieren? Alle Aufruf dieser Funktion ist hello();

EDIT: Der vollständige Fehlerausgang:

home.c: In function ‘hello’: 
hhme.c:838:7: error: variable ‘i’ set but not used [-Werror=unused-but-set-variable] 
home.c:840:1: error: ‘noreturn’ function does return [-Werror] 
cc1: all warnings being treated as errors 
make: *** [home.o] Error 1 
+0

können Sie die genaue Compiler-Warnung posten? –

+9

Könnten Sie bitte ein [SSCCE] (http://sscce.org/) erstellen und uns ein vollständiges Beispiel zeigen? Bitte fügen Sie auch _all_ und _complete_ error/warning messages ein. –

+2

Welchen Compiler benutzen Sie? Welche Compileroptionen haben Sie verwendet? – Bechir

Antwort

24

Es ist möglich, gcc zu sagen, dass eine bestimmte Funktion nie zurückgibt. Dies ermöglicht bestimmte Optimierungen und vermeidet falsche Warnungen vor nicht initialisierten Variablen.

Dies geschieht mit Hilfe der noreturn attribute getan:

void func() __attribute__ ((noreturn)); 

Wenn die Funktion trotz der noreturn Attribut zurückgibt, gibt der Compiler die Warnung Sie sehen (die in Ihrem Fall in einen Fehler umgewandelt wird).

Da Sie unwahrscheinlich sind in Ihrem Code zu verwenden noreturn, die wahrscheinlichere Erklärung ist, dass Sie eine Funktion, deren Name kollidiert mit einem Standard-noreturn Funktion haben, wie im folgenden Beispiel:

#include <stdlib.h> 

void exit(int) { 
}    // warning: 'noreturn' function does return [enabled by default] 

Hier mein exit kollidiert mit exit(3).

Ein weiterer offensichtlicher Kandidat für einen solchen Konflikt ist abort(3).

Natürlich, wenn Ihre Funktion tatsächlich hello() heißt, ist der Täter fast sicher irgendwo in Ihrer Code-Basis.

4

Höchstwahrscheinlich ist die Funktion mit __attribute__((noreturn)) gekennzeichnet. Tatsächlich kehrt es jedoch zurück (wenn die Steuerung das Ende von irs body erreicht, da es keine Endlosschleife eingibt, ruft es keine anderen "noreturn" -Funktionen usw. auf)

sehe ich nicht was ist dein Punkt in 1. Markieren der Funktion als nicht wiederkehrend, 2. Schreiben einer Funktion, die nichts tut - wahrscheinlich könnten Sie beide einfach beseitigen?

+3

Klärung dieser Antwort: Für eine Funktion mit __attribute __ ((noreturn)), wenn der Funktionskörper nicht mit einer Endlosschleife oder einem Aufruf einer anderen noreturn-Funktion endet, erhalten Sie diese Warnung. Mit anderen Worten, der Compiler führt eine "Flow-Analyse" durch und kann feststellen, ob die Funktion tatsächlich zurückkehren kann. Denken Sie daran, dass es im letzten Augenblick eine implizite Rückkehr gibt. – bootchk

+3

@bootchk, +1 für "Endlosschleife". 'f() {}' generiert Warnung/Fehler. 'f() {while (1); } ist in Ordnung. Vielen Dank – user3124812