2010-04-08 12 views
12

Como era de esperar, el compilador (VisualStudio 2008) dará una advertenciaFunción con valor de retorno que falta, el comportamiento en tiempo de ejecución

C4715 advertencia: 'doSomethingWith': no ​​ todas las rutas de control devuelven un valor

al compilar el código siguiente:

int doSomethingWith(int value) 
{ 
    int returnValue = 3; 
    bool condition = false; 

    if(condition) 
     // returnValue += value; // DOH 

    return returnValue; 
} 

int main(int argc, char* argv[]) 
{ 
    int foo = 10; 
    int result = doSomethingWith(foo); 
    return 0; 
} 

Pero el programa se ejecuta bien. El valor de retorno de la función doSomethingWith() es 0.

Es solo un comportamiento indefinido, o hay una cierta regla sobre cómo se crea/calcula el valor del resultado en el tiempo de ejecución. ¿Qué sucede con los tipos de datos que no son POD como valor de retorno?

+1

Eche un vistazo a esta respuesta: http://stackoverflow.com/questions/1610030/why-can-you-return-from-a-non-void-function-without-returning-a-value- sin-pro/1610454 # 1610454 –

+0

@fnieto: Ah, ya veo, esta es una muy buena respuesta. No lo encontré, sin embargo, antes de preguntar ... – nabulke

Respuesta

17

Es un comportamiento indefinido como se especifica en la ISO C++ sección estándar 6.6.3:

que fluye fuera del extremo de una función es equivalente a un retorno sin valor; esto da como resultado un comportamiento indefinido en una función de devolución de valor.

+2

Redacciones específicas: - Fluir fuera del final de una función es equivalente a un 'retorno' sin valor; esto da como resultado un comportamiento indefinido en una función de devolución de valor. – kennytm

+1

la función 'principal' es una excepción a esa regla. En el código de Nabulke, la última línea de función 'principal' es redundante. –

+0

Como _importante_ además de esta respuesta, 3.6.1/5 dice: "Si el control llega al final de 'main' sin encontrar una instrucción 'return', el efecto es el de 'return 0;''. –

2

No devolver un valor de una función de devolución de valor conduce a un comportamiento indefinido.

7

Para los procesadores x86, la convención de llamadas estándar coloca el valor de retorno en el registro EAX. Prácticamente significa que para la mayoría de los compiladores si llegamos al final de la función sin regresar, se devolverá el resultado de la última operación matemática. Sin embargo, no puede confiar en él y no es portátil.

http://en.wikipedia.org/wiki/X86_calling_conventions#cdecl

+0

¡Interesante! De hecho, teníamos una función que faltaba una devolución que pasaba una prueba debido a eso. –

3

Actualización @piotr respuesta.

Desde el C++17 Standard Sección 9.6.3

que fluye fuera de la final de un constructor, un destructor, o una función con un cv sin efecto tipo de retorno es equivalente a un retorno sin operandos. De lo contrario, el final de una función distinta de la principal (6.6.1) da como resultado un comportamiento indefinido.

Cuestiones relacionadas