2010-04-08 11 views
12

Come previsto, il compilatore (VisualStudio 2008) darà un avvertimentoFunzione con valore di ritorno mancante, il comportamento in fase di esecuzione

C4715 avvertimento: 'doSomethingWith': non tutti i percorsi di controllo restituiscono un valore

quando si compila il seguente codice:

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; 
} 

Ma il programma funziona bene. Il valore restituito della funzione doSomethingWith() è 0.

È solo un comportamento non definito oppure esiste una determinata regola su come il valore del risultato viene creato/calcolato in fase di esecuzione. Cosa succede con i tipi di dati non POD come valore di ritorno?

+1

Dai un'occhiata a questa risposta: http://stackoverflow.com/questions/1610030/why-can-you-return-from-a-non-void-function-without-returning-a-value- senza-pro/1610454 # 1610454 –

+0

@fnieto: Ah, capisco, questa è un'ottima risposta. Non l'ho trovato io stesso, prima di chiedere ... – nabulke

risposta

17

È un comportamento indefinito, come specificato nella sezione standard ISO C++ 6.6.3:

scorre l'estremità di una funzione è equivalente a un rendimento senza valore; questo comporta un comportamento non definito in una funzione di ritorno valore.

+2

Diciture specifiche: - Scorrere alla fine di una funzione equivale a un 'return' senza valore; ciò comporta un comportamento non definito in una funzione di ritorno del valore. – kennytm

+1

La funzione 'main' è un'eccezione a tale regola. Nel codice nabulke, l'ultima riga della funzione 'principale' è ridondante. –

+0

Come aggiunta importante a questa risposta, 3.6.1/5 afferma: "Se il controllo raggiunge la fine di' main' senza incontrare un'istruzione 'return', l'effetto è quello di eseguire' return 0; '". –

2

Non restituire un valore da una funzione di ritorno valore porta a un comportamento non definito.

7

Per i processori x86, la convenzione di chiamata standard inserisce il valore di ritorno nel registro EAX. In pratica significa che per la maggior parte dei compilatori se raggiungiamo la fine della funzione senza restituire, verrà restituito il risultato dell'ultima operazione matematica. Tuttavia, non puoi fare affidamento su di esso e non è portatile.

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

+0

È interessante sapere! A dire il vero, in realtà avevamo una funzione che mancava un ritorno che stava superando un test. –

3

Aggiornamento @piotr risposta.

Dal C++17 Standard sezione 9.6.3

scorre l'estremità di un costruttore, un distruttore, o una funzione con un cv tipo di ritorno void equivale a un rendimento senza operando. In caso contrario, il flusso fuori dalla fine di una funzione diversa da main (6.6.1) produce un comportamento non definito.

Problemi correlati