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
?
If no return statement appears in a function definition, control automatically returns to the calling function after the last statement of the called function is executed. In this case, the return value of the called function is undefined.
No; that is not needed. You only need to write return; if you want to return early and skip the rest of the function.
The return statement returns the flow of the execution to the function from where it is called. This statement does not mandatorily need any conditional statements. As soon as the statement is executed, the flow of the program stops immediately and returns the control from where it was called.
Forgetting to include a return statement in some control path of a value-returning function does not make your code ill-formed. I.e. you should normally expect the code to compile (maybe with a warning). In that sense it is not "mandatory".
Omitting the return
statement in a non-void
function [Except main()
] and using the returned value in your code invokes Undefined Behaviour.
ISO C++-98[Section 6.6.3/2]
A return statement with an expression can be used only in functions returning a value; the value of the expression is returned to the caller of the function. If required, the expression is implicitly converted to the return type of the function in which it appears. A return statement can involve the construction and copy of a temporary object (class.temporary). Flowing off the end of a function is equivalent to a return with no value; this results in undefined behavior in a value-returning function.
For example
int func()
{
int a=10;
//do something with 'a'
//oops no return statement
}
int main()
{
int p=func();
//using p is dangerous now
//return statement is optional here
}
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]
A return statement with an expression can be used only in functions returning a value; the value of the expression is returned to the caller of the function. If required, the expression is implicitly converted to the return type of the function in which it appears. A return statement can involve the construction and copy of a temporary object (class.temporary). Flowing off the end of a function is equivalent to a return with no value; this results in undefined behavior in a value-returning function.
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".)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With