I just had some weird behavior from a version of g++ for Windows that I got with Strawberry Perl. It allowed me to omit a return statement.
I have a member function that returns a structure consisting of two pointers, called a boundTag
:
struct boundTag Box::getBound(int side) {
struct boundTag retBoundTag;
retBoundTag.box = this;
switch (side)
{
// set retBoundTag.bound based on value of "side"
}
}
This function gave me some bad output, and I discovered that it had no return statement. I had meant to return retBoundTag
but forgot to actually write the return statement. Once I added return retBoundTag;
everything was fine.
But I had tested this function and gotten correct boundTag
output from it. Even now, when I remove the return statement, g++ compiles it without warning. WTF? Does it guess to return retBoundTag
?
Omitting the
return
statement in anon-void
function [Exceptmain()
] and using the returned value in your code invokes Undefined Behaviour.ISO C++-98[Section 6.6.3/2]
For example
Generally g++ gives a
warning: control reaches end of non-void function
. Try compiling with-Wall
option.C and C++ don't require you to have a
return
statement. It might not be necessary to have one, because the function enters an infinite loop, or because it throws an exception.Prasoon already quoted the relevant part of the standard:
[Section 6.6.3/2]
What it means is that not having a return statement is ok. But reaching the end of the function without returning is undefined behavior.
The compiler can't always detect these cases, so it's not required to be a compile error (it'd have to solve the halting problem to determine whether execution ever actually reaches the end of the function). It is simply undefined what should happen if this occurs. It might appear to work (because the calling function will just look at whatever garbage value is in the location where the return value is supposed to be), it might crash, or make demons fly out of your nose.
Even though aC++ compiler can't always detect when a function can't execute a return statement, it usually can.
On the bright side, at least g++ makes this easy to detect with the command-line compiler option "-Wreturn-type". You just need to remember to enable it. (It also gets enabled if you use "-Wall".)