If a function has a return type other than void
, and the function does not return anything, then I guess the compiler returns a garbage value (possibly seen as an uninitialized value). It happens at compile time, so why shouldn't it show an error?
For example,
int func1() {
return; // error
}
int func2() {
// does not return anything
}
The second func2
should throw an error, but it does not. Is there a reason for it? My thinking was such that, it can be seen as an uninitialized value, so if we need to throw an error in the second case, then we need to throw error, if an value is uninitialized, say
int i; // error
int i = 6; // okay
Any thoughts, or is this a duplicate question? I appreciate your help.
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.
Any method declared void doesn't return a value. It does not need to contain a return statement, but it may do so.
return statement syntaxA value-returning function should include a return statement, containing an expression. If an expression is not given on a return statement in a function declared with a non- void return type, the compiler issues a warning message.
In C++, such code has undefined behaviour:
[stmt.return]/2 ... 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. ...
Most compilers will produce a warning for code similar to that in the question.
The C++ standard does not require this to be a compile time error because in the general case it would be very difficult to correctly determine whether the code actually runs off the end of the function, or if the function exits through an exception (or a longjmp or similar mechanism).
Consider
int func3() {
func4();
}
If func4()
throws, then this code is totally fine. The compiler might not be able to see the definition of func4()
(because of separate compilation), and so cannot know whether it will throw or not.
Furthermore, even if the compiler can prove that func4()
does not throw, it would still have to prove that func3()
actually gets called before it could legitimately reject the program. Such analysis requires inspection of the entire program, which is incompatible with separate compilation, and which is not even possible in the general case.
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