[9] RFR (S): 8160527: Check for final instance field updates can be omitted

Zoltán Majó zoltan.majo at oracle.com
Mon Jul 4 08:56:19 UTC 2016


Hi Coleen,


On 07/01/2016 03:33 PM, Zoltán Majó wrote:
> [...]
>
>>
>>
>>>
>>> JPRT testing passes.
>>
>> There's a test for delaying resolution for non-final fields 
>> somewhere.  Did you find that?  I think it's in the compiler jtreg 
>> directories.
>
> I have not found that test, unfortunately. If you point me to the 
> test, I'd be glad to run it.
>
> Alternatively, I can run all hotspot tests on all supported platforms 
> with -Xmixed and -Xcomp. That testbase has a good potential for 
> triggering problems.

I've run all hotspot tests on all supported platforms with -Xmixed and 
-Xcomp. The change does not trigger any failures.

I plan to push the latest webrev (webrev.02) to hs on Wednesday, July 6 
(unless, of course, there are objections).

Thank you!

Best regards,


Zoltan

>
> Thank you!
>
> Best regards,
>
>
> Zoltan
>
>
>>
>> Thanks,
>> Coleen
>>>
>>> Thank you!
>>>
>>> Best regards,
>>>
>>>
>>> Zoltan
>>>
>>>
>>>
>>>>
>>>> Coleen
>>>>
>>>> On 6/30/16 3:31 PM, Coleen Phillimore wrote:
>>>>>
>>>>> Zoltan,
>>>>>
>>>>> On 6/30/16 6:03 AM, Zoltán Majó wrote:
>>>>>> Hi Coleen,
>>>>>>
>>>>>>
>>>>>> thank you for the feedback and for the review! Please see below.
>>>>>>
>>>>>> On 06/29/2016 11:01 PM, Coleen Phillimore wrote:
>>>>>>>
>>>>>>> Zoltan,
>>>>>>>
>>>>>>> http://cr.openjdk.java.net/~zmajo/8160527/webrev.00/src/share/vm/interpreter/interpreterRuntime.cpp.udiff.html 
>>>>>>>
>>>>>>>
>>>>>>> Yes, this matches the general strategy.   You don't have to have 
>>>>>>> this line
>>>>>>>
>>>>>>> *+ (bytecode == Bytecodes::_putfield || bytecode == 
>>>>>>> Bytecodes::_nofast_putfield);*
>>>>>>>
>>>>>>>
>>>>>>> Because the test below is:
>>>>>>>
>>>>>>> *!if (_(_is_put_&& !final_instance_update)_|| 
>>>>>>> !info.access_flags().is_final()) {*
>>>>>>
>>>>>> I think we need the condition
>>>>>>
>>>>>>     (bytecode == Bytecodes::_putfield || bytecode == 
>>>>>> Bytecodes::_nofast_putfield);
>>>>>>
>>>>>> for 'final_instance_update'. The reason is that we need to detect 
>>>>>> invalid updates only to *instance* fields but not to *static* 
>>>>>> fields; the condition 'is_put' includes Bytecodes::_putstatic as 
>>>>>> well.
>>>>>>
>>>>>>     bool is_put = (bytecode == Bytecodes::_putfield || bytecode 
>>>>>> == Bytecodes::_nofast_putfield ||
>>>>>> -->                bytecode == Bytecodes::_putstatic);
>>>>>>
>>>>>> The reason do not need to include putstatic is that the current 
>>>>>> delaying mechanism [1] [2] works fine for static final fields 
>>>>>> (but it is insufficient for instance final fields).
>>>>>
>>>>> ok.
>>>>>
>>>>>>
>>>>>> To check that invalid updates to static fields are properly 
>>>>>> detected, I've added a new test, TestPutStatic.jasm. The test is 
>>>>>> analogous to the TestPutField.jasm test that you've seen in the 
>>>>>> previous webrev (webrev.00); the VM passes the test already in 
>>>>>> its current state (without the change).
>>>>>>
>>>>>> Here is the updated webrev:
>>>>>> http://cr.openjdk.java.net/~zmajo/8160527/webrev.01/
>>>>>
>>>>> This looks good.
>>>>>>
>>>>>> I re-tested with JPRT, all tests (incl. the newly added ones) pass.
>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> Otherwise, looks fine.  I'm sorry I didn't realize this in the 
>>>>>>> initial code review.
>>>>>>
>>>>>> I did not realize either that this problem existed -- good that 
>>>>>> John has pointed it out.
>>>>>>
>>>>>
>>>>> Thanks,
>>>>> Coleen
>>>>>
>>>>>> Thank you!
>>>>>>
>>>>>> Best regards,
>>>>>>
>>>>>>
>>>>>> Zoltan
>>>>>>
>>>>>> [1] 
>>>>>> http://hg.openjdk.java.net/jdk9/hs/hotspot/file/2af3fb9f244f/src/share/vm/interpreter/interpreterRuntime.cpp#l579
>>>>>> [2] 
>>>>>> http://hg.openjdk.java.net/jdk9/hs/hotspot/file/2af3fb9f244f/src/share/vm/interpreter/interpreterRuntime.cpp#l586
>>>>>>
>>>>>>>
>>>>>>> Coleen
>>>>>>>
>>>>>>>
>>>>>>> On 6/29/16 11:00 AM, Zoltán Majó wrote:
>>>>>>>> Hi,
>>>>>>>>
>>>>>>>>
>>>>>>>> please review the patch for 8160527.
>>>>>>>>
>>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8160527
>>>>>>>>
>>>>>>>> Problem: 8157181 added a check that verifies that final 
>>>>>>>> instance fields can be updated only by object initializer 
>>>>>>>> methods (as required by JVMS >=7) [1].
>>>>>>>>
>>>>>>>> Unfortunately, the newly added check can be circumvented due to 
>>>>>>>> constant pool caching: If the instance field update is executed 
>>>>>>>> in an <init> method first, the instruction updating the field 
>>>>>>>> is cached in the constant pool cache. Subsequent updates use 
>>>>>>>> the constant pool cache (and do not call into the VM where the 
>>>>>>>> check is executed). As a result, any method can update a final 
>>>>>>>> instance field if that field was first updated in an instance 
>>>>>>>> initializer (the method must be declared in the same class as 
>>>>>>>> the field, though).
>>>>>>>>
>>>>>>>> John's comment in the bug description provides more detailed 
>>>>>>>> information on how the above can happen.
>>>>>>>>
>>>>>>>>
>>>>>>>> Solution: Do not cache putfield instructions to final instance 
>>>>>>>> fields if the verifier has detected that the field is updated 
>>>>>>>> in other methods than <init> (i.e., 
>>>>>>>> has_initialized_field_update() returns true for the field). 
>>>>>>>> Avoiding caching results in the field access being re-resolved 
>>>>>>>> until the offending access is attempted; then an exception is 
>>>>>>>> thrown. Avoiding caching must be done very infrequently, as 
>>>>>>>> offending code is rare (e.g., such code cannot be produced by 
>>>>>>>> javac).
>>>>>>>>
>>>>>>>> I've also corrected a small mistake in the fix for 8157181 (the 
>>>>>>>> class name is printed in the error message instead of the 
>>>>>>>> method's name).
>>>>>>>>
>>>>>>>> Webrev:
>>>>>>>> http://cr.openjdk.java.net/~zmajo/8160527/webrev.00/
>>>>>>>>
>>>>>>>> Testing:
>>>>>>>> - JPRT (testset hotspot, incl. newly added test);
>>>>>>>> - verified that the newly added test triggers the problem with 
>>>>>>>> an unmodified VM.
>>>>>>>>
>>>>>>>> Thank you!
>>>>>>>>
>>>>>>>> Best regards,
>>>>>>>>
>>>>>>>>
>>>>>>>> Zoltan
>>>>>>>>
>>>>>>>> [1] 
>>>>>>>> http://hg.openjdk.java.net/jdk9/hs-comp/hotspot/rev/c558d46c1af2#l11.76 
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>



More information about the hotspot-runtime-dev mailing list