Função com valor de retorno ausente, comportamento em tempo de execução

Como esperado, o compilador (VisualStudio 2008) dará um aviso

aviso C4715: ‘doSomethingWith’: nem todos os caminhos de controle retornam um valor

ao compilar o seguinte código:

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

Mas o programa funciona muito bem. O valor de retorno da function doSomethingWith () é 0.

É apenas o comportamento indefinido, ou existe uma certa regra como o valor do resultado é criado / computado em tempo de execução. O que acontece com os tipos de dados não-POD como valor de retorno?

É um comportamento indefinido, conforme especificado na seção 6.6.3 do padrão ISO C ++:

Fluir do final de uma function é equivalente a um retorno sem valor; isso resulta em comportamento indefinido em uma function de retorno de valor.

Para processadores x86, a convenção de chamada padrão coloca o valor de retorno no registrador EAX. Praticamente isso significa que para a maioria dos compiladores se chegarmos ao final da function sem retornar, o resultado da última operação matemática será retornado. No entanto, você não pode confiar nele e não é portátil.

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

Não retornar um valor de uma function de retorno de valor leva a um comportamento indefinido.

Atualizando resposta @piotr.

Da seção padrão do C ++ 17 9.6.3

Fluir do final de um construtor, um destruidor ou uma function com um tipo de retorno void cv é equivalente a um retorno sem operando. Caso contrário, o stream do final de uma function diferente de main (6.6.1) resulta em um comportamento indefinido.