[13] RFR: 8202414: Unsafe write after primitive array creation may result in array length change

Vladimir Ivanov vladimir.x.ivanov at oracle.com
Wed Apr 3 00:02:11 UTC 2019


> I agree that we need better regression tests if we go this route. Do we 
> have enough regression tests for the is_unaligned_access() case to 
> enable that optimization first?

I haven't done any extensive research, but I believe existing tests 
provide poor coverage for initializing stores. The tests I encountered 
under test/hotspot/jtreg/compiler/unsafe/ don't look applicable here.

Best regards,
Vladimir Ivanov

>> Forbidding mismatched accesses in InitializeNode::can_capture_store 
>> (both marked as such and based on actual offset) looks like a safer 
>> fix to me: it keeps InitializeNode::complete_stores() exposed only to 
>> well-behaved accessed.
>>
>> How much do we lose by not capturing mismatched/unaligned initialized 
>> stores? Does it worth optimizing for it?
>>
> 
> It does seem like it would be rare that optimizing it would make a 
> difference, unless we had a microbenchmark that focuses on it.
> 
> dl
> 
>> Best regards,
>> Vladimir Ivanov
>>
>>> On 3/27/19 10:12 AM, Vladimir Ivanov wrote:
>>>> First, I'd like to note that it's a good practice to include problem 
>>>> & root cause descriptions in the request. Otherwise, reviewers have 
>>>> to find that information themselves which complicates review process.
>>>>
>>>> (In this particular case, I found some analysis from the submitter 
>>>> [1] in the bug only after carefully reading through it.)
>>>>
>>>> On 27/03/2019 06:44, Rahul Raghavan wrote:
>>>>> Hi,
>>>>>
>>>>> Thank you Vladimir.
>>>>>
>>>>> Yes, tried following fix.
>>>>> (needed to add checks to avoid SIGFPE crash).
>>>>>
>>>>> +  int size_in_bytes = st->memory_size();
>>>>> +  if ((size_in_bytes != 0) && (get_store_offset(st, phase) % 
>>>>> size_in_bytes) != 0) {
>>>>> +    return FAIL;
>>>>> +  }
>>>>>
>>>>>
>>>>> <webrev.02> - http://cr.openjdk.java.net/~rraghavan/8202414/webrev.02/
>>>>
>>>> It seems the problem is due to mismatched unsafe store being 
>>>> captured as a initializing one. Why not check for it explicitly?
>>>>
>>>>    if (st->is_unaligned_access() || st->is_mismatched_access()) {
>>>>      return FAIL;
>>>>    }
>>>>
>>>> Best regards,
>>>> Vladimir Ivanov
>>>>
>>>>
>>>> [1]
>>>>
>>>> For your convenience, our analysis shows the problem may relate to 
>>>> array InitializeNode logic.
>>>> It `capture_store` the the memory write of Unsafe.putInt.
>>>> Since the putInt occupied offset range [17, 21] from the array pointer,
>>>> then it decided to `clear_memory` of offset range [16, 17] of the 
>>>> array pointer.
>>>> This range actually cannot pass the assert "assert((end_offset % 
>>>> BytesPerInt) == 0, "odd end offset")".
>>>> While in jvm product mode, without the assert, the compiler falsely 
>>>> calculated to clear range [13, 17],
>>>> which will clear the three most significant bytes of the `length` of 
>>>> this array.
>>>>
>>>>
>>>>>
>>>>> Confirmed no issues with testing for this revised fix.
>>>>>
>>>>> Thanks,
>>>>> Rahul
>>>>>
>>>>> On 26/03/19 1:03 AM, Vladimir Kozlov wrote:
>>>>>>
>>>>>> Suggestion:
>>>>>>
>>>>>> if ((get_store_offset(st, phase) % st->memory_size()) != 0) {
>>>>>>
>>>>>> Vladimir
>>>>>>
>>>>>>
>>>
> 


More information about the hotspot-compiler-dev mailing list