RFR(M): 8073315: Enable gcc -Wtype-limits and fix upcoming issues.

Jesper Wilhelmsson jesper.wilhelmsson at oracle.com
Wed Feb 18 16:28:45 UTC 2015


Hi Goetz,

Lindenmaier, Goetz skrev den 18/2/15 11:53:
> Hi Kim,
>
> thanks for looking at this!
>
>> As Jesper noted, there are cases where, yes, the
>> warning is correct today, but future maintenance might change that.
> You mean, somebody could change the type to signed, and then again
> the assertion makes sense?
> I thought about that.  One could add some function
>     is_unsigned(uint64_t x) { return true; }
>     is_unsigned(int64_t x) { return false; }
> in the assertions.  It might even be possible to get a warning if the
> second is left out, so that it's a compile time error (-Werror).
> But it seemed a bit overengineered to me, as there's sure lots of
> cases where changing signedness would causes similar problems
> with current code, but there is no assertion to catch it.

This approach seems, as you say, over engineered. If someone wants to change the 
type of a variable all usages of that variable should be examined anyway. There 
are several things that can go wrong with a change like that. Things the 
developers never even thought about since they had a reason to choose the type 
they used in the first place.

Anyway, I think the latest webrev looks good. I can sponsor the change if Kim 
agrees that this is an OK change to do. Please note that you need a Reviewer as 
well. Both me and Kim are committers only.
/Jesper

>
>> This warning can also lead to serious ugliness with generic code
>> (e.g. templates), where only some values of a type parameter trigger
>> warnings.
> There is currently no such code in the VM.  We could again remove
> the flag if such a case comes up.  Until then, the warning will avoid
> future errors. And maybe, until then, openJDK uses a compiler with
> that issue fixed.
> Should I add a respective comment in the makefile?
>
> I fixed last_active_index() as you proposed.  Yes, that's better.
> http://cr.openjdk.java.net/~goetz/webrevs/8073315-wUnsign/webrev.02/
>
> Best regards,
>    Goetz.
>
>
> -----Original Message-----
> From: Kim Barrett [mailto:kim.barrett at oracle.com]
> Sent: Mittwoch, 18. Februar 2015 00:28
> To: Lindenmaier, Goetz
> Cc: hotspot-dev Source Developers
> Subject: Re: RFR(M): 8073315: Enable gcc -Wtype-limits and fix upcoming issues.
>
> On Feb 17, 2015, at 6:42 AM, Lindenmaier, Goetz <goetz.lindenmaier at sap.com> wrote:
>>
>> We fixed all the warnings showing with -Wtype-limits and gcc in our VM.
>> I would like to contribute these small changes.
>>
>> This warning detects unnecessary compares for >= 0 of unsigned values.
>>
>> At least one warning unveils a real bug. In memory/blockOffsetTable.cpp,
>> BlockOffsetArrayContigSpace::last_active_index(), the compare to >=0
>> tries to prevent an underflow, but the value is unsigned.
>>
>> Further useless compares in real code are in os_linux.cpp,
>> opto/graphKit.cpp, prims/jvmtiRedefineClasses.cpp
>>
>> In some places debug code with constant debug flags caused
>> warnings in the opt build (g1/concurrentMark.cpp, classfile/systemDictionary.cpp)
>>
>> The remaining warnings occur in asserts, which is also the biggest part.
>>
>> The change also removes an empty #ifdef ASSERT .
>>
>> Please review this change.  I please need a sponsor.
>> https://bugs.openjdk.java.net/browse/JDK-8073315
>> http://cr.openjdk.java.net/~goetz/webrevs/8073315-wUnsign/webrev.01/
>>
>> I tested this on linuxx86_64 with gcc 4.1.2, 4.3 and 4.8.  Further I ran the patch
>> with our nightly builds and tests of jdk9,see
>> http://cr.openjdk.java.net/~simonis/ppc-aix-port/index.html
>
> -Wtype-limits is one of those somewhat questionable warnings that are
> enabled by -Wextra.  As Jesper noted, there are cases where, yes, the
> warning is correct today, but future maintenance might change that.
> And the information that one needs in order to make that determination
> might be far away from the expression generating the warning.
>
> This warning can also lead to serious ugliness with generic code
> (e.g. templates), where only some values of a type parameter trigger
> warnings. I've seen real code that used template metapogramming to
> select different expressions in order to dodge this specific warning.
>
> In other words, while this warning does sometimes find real bugs, it
> also tends to generate a lot of false positives.  Because of that, I'm
> not sure it's actually a good idea to enable it.
>
> For the specific bug mentioned, I would like to just see that fixed,
> but not in the way that was done in the webrev, e.g.
>
> incorrect old:
>   794 size_t BlockOffsetArrayContigSpace::last_active_index() const {
>   795   size_t result = _next_offset_index - 1;
>   796   return result >= 0 ? result : 0;
>   797 }mem
>
> webrev:
>   794 size_t BlockOffsetArrayContigSpace::last_active_index() const {
>   795   size_t result = _next_offset_index - 1;
>   796   return ((intptr_t)result) >= 0 ? result : 0;
>   797 }
>
> better:
> size_t BlockOffsetArrayContigSpace::last_active_index() const {
>    size_t next = _next_offset_index;
>    return next == 0 ? 0 : next - 1;
> }
>
> Eschew unnecessary casts!
>


More information about the hotspot-dev mailing list