2010-11-03 3 views
6

ist eine gültige Funktion in C++:Eine Funktion, die deklariert wird, um int zurückzugeben, gibt nichts zurück. Ist das undefiniertes Verhalten? Diese

int f() 
{ 
    if(false) 
    { 
     return 42; 
    } 
} 

Die folgende Definition verursacht UB:

int x = f(); //return value used 

Die Frage: Hat der folgende Ausdruck Anweisung Ursache UB?

f(); 

Zitat aus dem Standard wäre sehr willkommen. Dank

Warnung: Bemerkungen zum stylistics irrelevant sind :)

+0

Ich bin 99,9999% sicher, es ist ein UB. Und selbst wenn nicht, ist dies kein Programmierstil, den man empfehlen würde :) –

+0

Der Versuch, Code in einem Kommentar auszuführen, ist nicht UB. –

+2

ich mag, wie C# -Compiler es handhabt: in diesem Fall wird ein Kompilierungsfehler: "Nicht alle Codepfade geben einen Wert zurück" – Andrey

Antwort

8

C++ 03 §6.6.3/2:

das Ende einer Funktion ist äquivalent zu einer Rückkehr abfließende mit kein Wert; Dies führt zu undefiniertem Verhalten in einer Wert zurückgebenden Funktion.

Also das ist ein UB in einer Funktion selbst.

BTW gcc gibt Ihnen eine schöne Warnung zeigt auf diese UB:

In function 'int f()': 
Line 7: warning: control reaches end of non-void function 
+0

Danke! Antwort wird in 7 Minuten akzeptiert werden :) –

+3

die einzige Antwort (von 4), die wirklich sagt, was gefragt wurde. – Andrey

+0

@Armen Tsirunyan: So genau Timing =) – vitaut

3

C++ 03, §6.6.3/2: „das Ende einer Funktion äquivalent ist mit nicht zu einer Rückkehr abfließende Wert; dies führt zu undefiniertem Verhalten in einer Wert zurückgebenden Funktion. "

Beachten Sie, dass das gleiche gilt nicht in C.

+0

Hmm .. interessant. Danke für die Antwort. SO in C ist nur der erste Fall UB? –

+0

Was passiert in C? – Lazer

+0

@Lazer: Sie müssen den Wert verwenden. 'f();' allein ist in Ordnung. – GManNickG