2010-11-03 18 views
6

Cette fonction est valable en C++:Une fonction déclarée à return int ne renvoie rien. Est-ce un comportement indéfini?

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

La définition suivante provoque UB:

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

La question: L'énoncé d'expression suivante causes UB?

f(); 

Citation de la norme serait très bienvenue. Merci

Attention: Remarques concernant stylistics ne sont pas pertinents :)

+0

Je suis 99,9999% sûr que c'est un UB. Et même si ce n'est pas le cas, ce n'est pas un style de programmation que l'on recommanderait :) –

+0

Essayer de faire exécuter du code dans un commentaire n'est pas UB. –

+2

J'aime comment le compilateur C# le gère: dans ce cas il y aura une erreur de compilation: "Tous les chemins de code ne renvoient pas une valeur" – Andrey

Répondre

8

C++ 03 §6.6.3/2:

vive de l'extrémité d'une fonction est équivalente à un rendement de aucune valeur; cela entraîne un comportement indéfini dans une fonction de renvoi de valeur.

Donc, ceci est un UB dans une fonction elle-même.

BTW gcc vous donne un pointage d'avertissement agréable de cette UB:

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

Merci! Réponse sera acceptée dans 7 minutes :) –

+3

la seule réponse (sur 4) qui dit vraiment ce qui a été demandé. – Andrey

+0

@Armen Tsirunyan: Timing si précis =) – vitaut

3

C++ 03, §6.6.3/2: « Flowing l'extrémité d'une fonction est équivalente à un retour sans value, ce qui entraîne un comportement indéfini dans une fonction de renvoi de valeur. "

Notez que ce n'est pas vrai dans C.

+0

Hmm .. intéressant. Merci d'avoir répondu. SO en C seulement le premier cas est UB? –

+0

Que se passe-t-il dans C? – Lazer

+0

@Lazer: Vous devez utiliser la valeur. 'f();' seul est bon. – GManNickG