2010-04-08 3 views
12

Как и следовало ожидать, компилятор (VisualStudio 2008) выдаст предупреждениеФункция с отсутствующим возвращаемым значением, поведением во время выполнения

предупреждение C4715: «doSomethingWith»: не все пути управлений возвращает значение

при компиляции следующего кода:

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

Но программа работает просто отлично. Возвращаемое значение функции doSomethingWith() равно 0.

Это просто неопределенное поведение, или существует определенное правило, как создается или вычисляется значение результата во время выполнения. Что происходит с не-POD-типами данных как возвращаемое значение?

+1

Посмотрите на этот ответ: http://stackoverflow.com/questions/1610030/why-can-you-return-from-a-non-void-function-without-returning-a-value- без-pro/1610454 # 1610454 –

+0

@fnieto: Ах, я вижу, это очень хороший ответ. Не нашел его сам, прежде чем спрашивать ... – nabulke

ответ

17

Это Неопределенное поведение, как указано в стандартной секции ISO C++ 6.6.3:

стекания конец функции эквивалентно возвращению без значения; Это приводит к неопределенному поведению в функции возврата значения.

+2

Конкретные формулировки: - Стекание конца функции эквивалентно 'return' без значения; это приводит к неопределенному поведению в функции возврата значения. – kennytm

+1

Функция «main» является исключением из этого правила. В коде nabulke последняя «основная» функциональная строка является избыточной. –

+0

Как дополнение к этому ответу, 3.6.1/5 гласит: «Если управление достигает конца' main', не встречая оператора 'return', эффект заключается в выполнении' return 0; '. –

2

Не возвращающее значение из функции возврата значения приводит к неопределенному поведению.

7

Для процессоров x86 стандартное соглашение о вызове помещает возвращаемое значение в регистр EAX. Практически это означает, что для большинства компиляторов, если мы дойдем до конца функции без возврата, результат последней математической операции будет возвращен. Однако вы не можете полагаться на него, и он не переносится.

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

+0

Интересно знать! Из-за этого у нас фактически была функция, пропускающая возврат, который проходил тест. –

3

Обновление @piotr ответ.

Из C++17 Standard Раздела 9.6.3

стекания конца конструктора, деструктора или функции с в сорте ничтожного типа возврата эквивалентен возврат, без операнда. В противном случае, выходя из конца функции, отличной от основной (6.6.1) , возникает неопределенное поведение.

Смежные вопросы