компилятор не жалуется на то, что функция не возвращает значение

У меня есть следующая функция:

bool Server::ServerInit()
{
//  bool listenResult = socket.Listen( (const uint8 *)_LOCAL_HOST, m_iPort );
//  if( true == listenResult )
//      cout << "Server passive socket listening\n";
//  else
//      cout << "Server passive socket not listening\n";
//      
//  return listenResult;
} // ServerInit()

это прекрасно компилируется, но разве компилятор не должен жаловаться на отсутствие оператора return?

РЕДАКТИРОВАТЬ 0: компилятор GNU g++


person TheFuzz    schedule 27.11.2010    source источник
comment
Какой компилятор вы используете? Компилятор Visual C++, который у меня есть, довольно громко жалуется на ваш фрагмент кода с C4716.   -  person In silico    schedule 27.11.2010
comment
@TheFuzz: Мой тоже жалуется довольно громко, как и должно быть!   -  person Alok Save    schedule 27.11.2010
comment
Я сделал правку. Я использую компилятор gnu g++   -  person TheFuzz    schedule 27.11.2010
comment
@TheFuzz: Действительно, g++ по умолчанию не жалуется. Удивительно...   -  person casablanca    schedule 27.11.2010
comment
Почему это не установлено в качестве настройки по умолчанию для g++?   -  person TheFuzz    schedule 27.11.2010
comment
@TheFuzz: я ​​не знаю. Какую версию g++ вы используете?   -  person Prasoon Saurav    schedule 27.11.2010


Ответы (2)


Попробуйте скомпилировать с опцией -Wall (gcc) [точнее -Wreturn-type]. Вы получите предупреждение что-то вроде «Управление достигает конца непустой функции» или что-то вроде «нет оператора возврата в функции, возвращающей непустое значение»

Пример:

C:\Users\SUPER USER\Desktop>type no_return.cpp
#include <iostream>
int func(){}

int main()
{
   int z = func();
   std::cout<< z; //Undefined Behaviour
}
C:\Users\SUPER USER\Desktop>g++ -Wall no_return.cpp
no_return.cpp: In function 'int func()':
no_return.cpp:2:12: warning: no return statement in function returning non-void

C:\Users\SUPER USER\Desktop>

Использование возвращаемого значения непустой функции (без оператора возврата) является неопределённым поведением.

person Prasoon Saurav    schedule 27.11.2010
comment
-Wall указан как одна из опций, которые в настоящее время использует мой компилятор. До сих пор не жалуется. - person TheFuzz; 27.11.2010
comment
Вам нужна -Wall, а не -wall; параметры командной строки чувствительны к регистру. Обратите внимание, что -w запрещает все предупреждающие сообщения. - person janm; 27.11.2010
comment
@TheFuzz Я получаю следующее, когда использую -Wall: test.cpp: в функции-члене 'bool Server::ServerInit()': test.cpp:14: предупреждение: управление достигает конца непустой функции - person chrisaycock; 27.11.2010

Вот причина того, почему вы не получаете сообщение об ошибке/предупреждении, так как это известно как Undefined Behavior (UB).

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

К сожалению, чистая компиляция с предупреждением или без него, кроме любого другого вообразимого поведения, является частью UB.

Как упомянул @Prasoon, функция «main» является исключением из этого правила.

person Chubsdad    schedule 27.11.2010
comment
Также добавьте, что main() является исключением из этого правила. :) - person Prasoon Saurav; 27.11.2010