RFR(XXS) 8249087 Symbol constructor unnecessarily initializes _body[0]

Ioi Lam ioi.lam at oracle.com
Tue Jul 21 06:24:58 UTC 2020



On 7/20/20 11:12 PM, Florian Weimer wrote:
> * Ioi Lam:
>
>> Hi please review this very simple fix:
>>
>> diff -r 19f26d72a8d0 src/hotspot/share/oops/symbol.cpp
>> --- a/src/hotspot/share/oops/symbol.cpp    Mon Jul 20 14:24:19 2020 -0700
>> +++ b/src/hotspot/share/oops/symbol.cpp    Mon Jul 20 17:11:57 2020 -0700
>> @@ -51,8 +51,11 @@
>>   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
>>     memcpy(_body, name, length);
>> +  // For symbols of length 0 and 1: _body[0] (and _body[1]) are
>> uninitialized and may
>> +  // contain random values, which will only be read by
>> Symbol::identity_hash(),
>> +  // which would tolerate such randomness. These values never change
>> during the lifetime
>> +  // of the Symbol.
>>   }
> Won't this still trip memory debuggers?  Symbol::identity_hash() implies
> that the result is eventually used in a conditional operation (a hash
> comparison perhaps).  If it's possible one day to run Hotspot under
> valgrind, this would result in false positives.

Are you saying that valgrind will modify uninitialized memory 
periodically after the constructor has returned, and thus will cause 
Symbol::identity_hash() to return a different value?

Without my patch, _body[1] is uninitialized for Symbols whose length is 
0 or 1. We have not heard of any issues related to valgrind and 
Symbol::identity_hash().

In fact, looking at the code history, the setting of "_body[0] = 0" in 
Symbol::Symbol was introduced only recently (Feb 2020):

http://hg.openjdk.java.net/jdk/jdk/annotate/4a4d185098e2/src/hotspot/share/oops/symbol.cpp#l55

I'll check with Lois who added the code to see the reason for doing it.


Thanks
- Ioi

> Thanks,
> Florian
>



More information about the hotspot-runtime-dev mailing list