Функция с отсутствующим возвратным значением, поведение во время выполнения

Как и ожидалось, компилятор (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.

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

Ответ 1

Это поведение Undefined, как указано в стандарте ISO С++, раздел 6.6.3:

Оттекание конца функции эквивалент возврату без значения; это приводит к поведению Undefined в функция возврата значения.

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

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