Функция с отсутствующим возвращаемым значением, поведение во время выполнения - PullRequest
12 голосов
/ 08 апреля 2010

Как и ожидалось, компилятор (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 в качестве возвращаемого значения?

Ответы [ 4 ]

17 голосов
/ 08 апреля 2010

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

Выход из конца функции эквивалентен возвращению без значения;это приводит к неопределенному поведению в функции, возвращающей значение.

7 голосов
/ 08 апреля 2010

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

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

2 голосов
/ 12 декабря 2017

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

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

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

2 голосов
/ 08 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...