Warnung "control reaches end of non-void function"
-
#include <iostream> struct A { int a; A() : a(0) { } }; A f() { } int main() { std::cout << f().a << std::endl; }
Dieses Programm compiliert mit gcc 3.3.5 und 4.0.2 mit der Warnung "control reaches end of non-void function", auch mit "-Wall -pedantic". Kann mir jemand erklären, warum das kein Fehler ist?
Tommi
-
Du solltest die Warnung trotzdem beachten - und f() eine return-Anweisung spendieren.
(warum der Compiler das nicht als Fehler ankreidet, müsstest du ihn schon selber fragen)
-
Ich verstehe aber seine Antwort nicht:
tommi@nurmi:~/tmp> g++ -o ttt -Wall -pedantic ttt.cpp ttt.cpp: In function ‘A f()’: ttt.cpp:10: warning: control reaches end of non-void function tommi@nurmi:~/tmp> echo "Warum war das kein Fehler?"|g++ g++: no input files tommi@nurmi:~/tmp>
-
Vermutung:
Heisst pedantic vielleicht nur, daß er ALLES anmeckert, aber nicht alles als Fehler ankreidet?
Ich kenn den GCC nicht so im Detail
-
tntnet schrieb:
Kann mir jemand erklären, warum das kein Fehler ist?
IIRC verbietet der Standard sowas nicht, sondern weist das als undefiniertes Verhalten aus.
-
Der Grund wieso der Compiler sowas generel nicht als Fehler anmeckert ist weil er in manchen Situationen nicht zweifelsfrei feststellen kann ob es ein Fehler ist. Beispiel:
int foo(){ switch(bar()){ case 0:return 1; case 2:return 3; case 3:return 4; } }
Fals der Rückgabewert von bar immer 0,2 oder 3 ist der Code korrekt ansonsten falsch. Dann gibt es auch noch Fälle wie diesen:
int void foo(int c){ assert(c != 4); if(c < 4) return 5; else if(c > 4) return 8; }
Wo es zwar möglich ist herzuleiten, dass es keinen Fehler ist, aber für einen Compiler nicht ganz trivial.
Aus diesem Grund weißt der GCC immer nur auf potenzielle Fehler hin.
-
tntnet schrieb:
Ich verstehe aber seine Antwort nicht:
tommi@nurmi:~/tmp> g++ -o ttt -Wall -pedantic ttt.cpp ttt.cpp: In function ‘A f()’: ttt.cpp:10: warning: control reaches end of non-void function tommi@nurmi:~/tmp> echo "Warum war das kein Fehler?"|g++ g++: no input files tommi@nurmi:~/tmp>
Also sowas habe ich auch noch nie probiert(ernsthaft: Sagt dir der Begriff "Manuals" oder "Hilfedatei" etwas?