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

Coleen Phillimore coleen.phillimore at oracle.com
Wed Nov 5 21:22:02 UTC 2014


Question below...  not to belabor the point.

On 11/5/14, 3:45 PM, Stefan Karlsson wrote:
> On 2014-11-05 21:26, Coleen Phillimore wrote:
>>
>>
>> On 11/5/14, 2:56 PM, Stefan Karlsson wrote:
>>> 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 don't think a "return 0;" line after ShouldNotReachHere(); which 
>> only knowing the contents of this call, ie that it doesn't return, is 
>> worse than some #pragma doesnt-return macro.   The latter is more 
>> noise and distraction to me.
>
> Actually, the noreturn experiment/patch hides it within 
> ShouldNotReachHere(); so you wouldn't get any line noise.
>
> This is done by doing something like this:
>
> // globalDefinitions.hpp
> WITH_NORETURN_ATTRIBUTE(void noreturn_function());
>
> // globalDefinitions.cpp
> void noreturn_function() {
>   // Make sure that this function never returns.
>   while (true) {
>     os::naked_short_sleep(10);
>   }
> }
>
> // globalDefinitions_gcc.hpp
> #define WITH_NORETURN_ATTRIBUTE(function) function 
> ___attribute((noreturn))
>
> // globalDefinitions_
> #define ShouldNotReachHere() \
> do { \
>   report_should_not_reach_here(__FILE__, __LINE__); \
>   BREAKPOINT; noreturn_function(); \
> } while (0)
>
Rather than have all this, why not have report_should_not_reach_here() 
have the NORETURN_ATTRIBUTE.

In any case, hidden in ShouldNotReachHere is good.

Coleen

> thanks,
> StefanK
>> I agree with Stefan.  I don't think this should stop this change. 
>> This change is an improvement.
>>
>> Coleen
>>
>>>
>>>>   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