Avoid some GCC 10.X warnings in HotSpot
David Holmes
david.holmes at oracle.com
Thu Jun 18 01:56:10 UTC 2020
Hi Koichi,
This is in relation to the hotspot part as these issues need to be
handled separately. I have filed:
https://bugs.openjdk.java.net/browse/JDK-8247818
On 18/06/2020 8:46 am, Koichi Sakata wrote:
> Hi all,
>
> I tried to build OpenJDK fastdebug with GCC 10.1 on Ubuntu 18.04, but I
> saw some compiler warnings as follows:
>
> In file included from
> /home/jyukutyo/code/jdk/src/hotspot/share/classfile/systemDictionary.hpp:31,
>
> from
> /home/jyukutyo/code/jdk/src/hotspot/share/classfile/javaClasses.hpp:28,
> from
> /home/jyukutyo/code/jdk/src/hotspot/share/precompiled/precompiled.hpp:35:
> In member function 'void Symbol::byte_at_put(int, u1)',
> inlined from 'Symbol::Symbol(const u1*, int, int)' at
> /home/jyukutyo/code/jdk/src/hotspot/share/oops/symbol.cpp:55:16:
> /home/jyukutyo/code/jdk/src/hotspot/share/oops/symbol.hpp:130:18: error:
> writing 1 byte into a region of size 0 [-Werror=stringop-overflow=]
> 130 | _body[index] = value;
> | ~~~~~~~~~~~~~^~~~~~~
I'm not really clear on the warning here but this is an area where we
trick the compiler somewhat. The _body[] is declared with a size of 2,
but when we allocate Symbols we allocate sufficient memory for _body to
contain the entire symbol.
That said I'm struggling to see how we allocate the additional space
needed for the _hash_and_refcount and _length fields ???
> I can resolve them with the following patch. I believe it fixes those
> potential bugs, so I'd like to contribute it.
> (Our company has signed OCA.)
>
> Thanks,
> Koichi
>
> ===== PATCH =====
> diff -r 20d92fe3ac52 src/hotspot/share/oops/symbol.cpp
> --- a/src/hotspot/share/oops/symbol.cpp Tue Jun 16 03:16:41 2020 +0000
> +++ b/src/hotspot/share/oops/symbol.cpp Thu Jun 18 07:08:50 2020 +0900
> @@ -50,9 +50,10 @@
> Symbol::Symbol(const u1* name, int length, int refcount) {
> _hash_and_refcount = pack_hash_and_refcount((short)os::random(),
> refcount);
> _length = length;
> - _body[0] = 0; // in case length == 0
> - for (int i = 0; i < length; i++) {
> - byte_at_put(i, name[i]);
> + if (length == 0) {
> + _body[0] = 0;
The check for length==0 introduces more overhead than just always
setting _body[0]=0, so there is no need to add it.
> + } else {
> + memcpy(_body, name, length);
> }
> }
So you are replacing byte_at_put with a memcpy call. On the surface that
seems reasonable, but I have to wonder why we were using the loop in the
first place. It may just be historical or it may relate to an alignment
issue, or something else. Hopefully someone else (e.g. Coleen :) ) can
shed more light here.
Thanks,
David
-----
> diff -r 20d92fe3ac52 src/hotspot/share/oops/symbol.hpp
> --- a/src/hotspot/share/oops/symbol.hpp Tue Jun 16 03:16:41 2020 +0000
> +++ b/src/hotspot/share/oops/symbol.hpp Thu Jun 18 07:08:50 2020 +0900
> @@ -125,11 +125,6 @@
> return (int)heap_word_size(byte_size(length));
> }
>
> - void byte_at_put(int index, u1 value) {
> - assert(index >=0 && index < length(), "symbol index overflow");
> - _body[index] = value;
> - }
> -
> Symbol(const u1* name, int length, int refcount);
> void* operator new(size_t size, int len) throw();
> void* operator new(size_t size, int len, Arena* arena) throw();
More information about the hotspot-runtime-dev
mailing list