[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Bug#119440: g++: Compiler does not give any errors when a function fails to return required value



-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On Wednesday 14 November 2001 02:32, Martin v. Loewis wrote:
> > > A similar algorithm does not exist for reliably determining that a
> > > function falls off its end.
> >
> > What if there is no return statement in a function with a non-void return
> > type?
>
> Like this?
>
> int foo(){
>   exit(3);
> }
>
> Has no return statement, but still doesn't invoke undefined behavior.

Not exactly. Here is what I'm talking about:

#include <iostream>

int f(int x)
{
   int f;
   f = 2;
   for (int i=1; i<=4; i++) {
      f = f + i * x;
   }
}


int main()
{
   cout << "f(3)=" << f(3) << endl;
}

Are you a g++ author?

This illustrates what I'm exactly talking about. IIRC some other compilers 
will complain about the f function not returning any value here. (Have to 
check, though)

The problem with the above code is that g++ will compile the code as if it is 
normal, and when you run it, it will just spew out a random result.

g++ compiles this code without giving any warnings by default. However, as 
you can see the f(..) function lacks a return statement. It's also evident 
that there cannot be any exit or throw out of the function. If there isn't a 
single control path that contains a return statement, you can't expect the 
function to ever return anything, it is a programming error. exit or throw 
would be employed in a function only in the case of exceptions, so if a 
function has a non void return type but only serves to exit or throw 
exception (like your example) that is also precisely a programming error. It 
might be valid in C++ specification (is it?), but the compiler should warn 
about it.

I would think that the compiler should give a warning by default in this 
case, otherwise it is misleading to the programmer who is accustomed to the 
"typesafety" of the language.

In other words, "-Wreturn-type" does not seem to solve this problem. The 
compiler would have to detect whether there is no path that returns a value 
rather than detecting whether there is a path that does not return a value to 
give a useful warning message.

I'm reopening this bug. Set the severity to wishlist if you find appropriate.

Thanks,

- -- 
Eray Ozkural (exa) <erayo@cs.bilkent.edu.tr>
Comp. Sci. Dept., Bilkent University, Ankara
www: http://www.cs.bilkent.edu.tr/~erayo
GPG public key fingerprint: 360C 852F 88B0 A745 F31B  EA0F 7C07 AE16 874D 539C
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.6 (GNU/Linux)
Comment: For info see http://www.gnupg.org

iD8DBQE78mJwfAeuFodNU5wRAlUmAJwPXjZMt+7aZpBrGJHSG5tbQCSnAwCbBiux
Z0TlgSFNDuiU+XdGXJ5mKe8=
=U9bh
-----END PGP SIGNATURE-----



Reply to: