RFR: 8062808: Turn on the -Wreturn-type warning

Stefan Karlsson stefan.karlsson at oracle.com
Wed Nov 5 19:56:40 UTC 2014


On 2014-11-05 19:34, Kim Barrett wrote:
> On Nov 5, 2014, at 7:22 AM, Stefan Karlsson <stefan.karlsson at oracle.com> wrote:
>> Hi all,
>>
>> I propose that we turn on the -Wreturn-type warning when compiling HotSpot with GCC.
>>
>> This will help us catch missing return statements earlier in the development cycle.
>>
>> http://cr.openjdk.java.net/~stefank/8062808/webrev.01/
>> https://bugs.openjdk.java.net/browse/JDK-8062808
> I’ve only skimmed this and not really reviewed, but I really dislike insertion of purportedly unreachable “return” statements to silence compiler warnings.  I have a similar dislike for “if (check for bad case) { non-returning error processing } /* no else */ …” to disable such warnings by avoid an apparent terminating control flow w/o return at the end of the error processing.  There’s got to be a better way…

I understand, but that's what you'll find if you look at the shared 
code. I only added a few more places, where our other compilers didn't 
complain about this or the code wasn't compiled with those compilers. 
With that said, I'm all for cleaning this up, but it's a pretty large 
undertaking that I don't think should prevent the usage of -Wreturn-type.

>
> I know that gcc/clang/MS all have annotation mechanism to mark code unreachable or functions as no-return.

My first implementation of thisused notreturn annotations on 
gcc/clang/MS, but since we need to support other compilers that don't 
have this annotation we can't really take advantage of the annotation to 
fix this problem throughout our code base. We would still have all these 
constructs that you've pointed out, except for the two I added.

>   I’d rather see something like that added and used before we turn on -Wreturn-type, rather than littering / contorting code to avoid that warning.

I don't agree. The code is already littered with these kind of 
constructs, so that I add a couple of similar returns shouldn't be a 
show-stopper for this warning, IMHO.

>   And compilers may generate better code sometimes when such are used.

A benefit of using the noreturn annotation would be to be able to turn 
on -Wuninitialized and get away with constructs like this:
int a;
switch (v) {
case 1: a = x; break;
case 2: a = y; break;
default: ShouldNotReachHere();
}
use(a);

I have a patch were I started testing this, but there are a number of 
places were the compiler doesn't manage to infer that all paths taken 
will initialize the variable and we have to change the code to make it 
easier for the compiler to understand it. This will probably help with 
the readability of the code, so that is probably not something negative.

>
> And I say that having just last week wasted half a day debugging what turned out to be a small refactoring that left a code path without a return.

I've asked around and I've heard of a hand-full of HotSpot developers 
that has been bitten by this. :)

thanks for looking at this,
StefanK

>
>



More information about the hotspot-dev mailing list