RFR: JDK-8065773: JDI: UOE is not thrown, when redefineClasses changes a class modifier
David Holmes
david.holmes at oracle.com
Sat Feb 9 02:24:41 UTC 2019
Gary,
I have filed
https://bugs.openjdk.java.net/browse/JDK-8218703
against JVM TI. But in doing so I realized these current test changes
are actually still incorrect. The problem is that these tests are
changing the modifiers on nested types and in that case it is the
inner_class_access_flags that JVM TI should be examining (which can
encode all four access levels), not the top-level access flag (which
only handles public or not-public).
This is all rather a mess.
David
-----
On 9/02/2019 7:48 am, David Holmes wrote:
> On 8/02/2019 11:38 pm, Gary Adams wrote:
>> On 2/5/19, 4:59 PM, David Holmes wrote:
>>> On 5/02/2019 10:17 pm, Gary Adams wrote:
>>>> On 2/4/19, 8:04 PM, David Holmes wrote:
>>>>> Hi Gary,
>>>>>
>>>>> On 5/02/2019 12:01 am, Gary Adams wrote:
>>>>>> Two of the redefine classes tests (021, 023) have been on the
>>>>>> ProblemList since they
>>>>>> were first brought into the open repos. Both tests made an
>>>>>> incorrect assumption
>>>>>> about the access modifiers in class files. There is a single bit
>>>>>> in the binary class file that
>>>>>> defines if an interface is public or not public (See JVMS Table
>>>>>> 4.1-B ACC_PUBLIC).
>>>>>> When the test classes are compiled for use in the redefine
>>>>>> operation, if a source
>>>>>> used public or protected the ACC_PUBLIC bit was set.
>>>>>>
>>>>>> Several modifiers are used in these tests to confirm
>>>>>> UnsupportedOperationException
>>>>>> is thrown or not thrown. This proposed change simply corrects the
>>>>>> expected results
>>>>>> according to the JVM Specification.
>>>>>>
>>>>>> Webrev:
>>>>>> http://cr.openjdk.java.net/~gadams/8065773/webrev.00/index.html
>>>>>
>>>>> test/hotspot/jtreg/vmTestbase/nsk/jdi/VirtualMachine/redefineClasses/redefineclasses021.java
>>>>>
>>>>>
>>>>> 62 * Test cases 3 (private) and 4 (static) map to not public, so will
>>>>>
>>>>> "static" is not related to access modifiers so the ACC_PUBLIC bit
>>>>> is not relevant. "static" can only be applied to (nested) member
>>>>> types and is represented by the ACC_STATIC bit as per JVMS "Table
>>>>> 4.7.6-A. Nested class access and property flags".
>>>>>
>>>>> What this testcase does is add "static" to a nested interface and
>>>>> expects JVM TI to check if the class modifier has changed. But the
>>>>> "static" is not encoded in the class "access flags", but in the
>>>>> inner class attribute (inner_class_access_flags). To me this
>>>>> testcase should throw UOE, but JVM TI is not checking the right flags.
>>>>>
>>>>> David
>>>> I think the test is demonstrating that static does not change the
>>>> ACC_PUBLIC bit.
>>>
>>> And what is that a demonstration of? static has nothing to do with
>>> access control so if it did change the ACC_PUBLIC bit we'd have a
>>> serious issue.
>>>
>>>>
>>>> This changeset does not change the handling of that testcase.
>>>
>>> The test is adding a new class modifier "static" which it originally
>>> expected to trigger a UOE but it doesn't because JVM TI is not
>>> checking for that kind of change correctly.
>>>
>>> You modified the test to no longer expect UOE so that it passes but:
>>> a) that's wrong as it shouldn't pass; and
>>> b) it's now documented as passing because it doesn't change the
>>> public-ness of the class but that's completely irrelevant.
>>>
>>> So your change to the static testcase is not correct and should not
>>> be applied.
>>>
>>> David
>>> -----
>> I think you misread the webrev.
>> The 4th test case was already being allowed to not throw UOE.
>>
>> The change I proposed allows the 3rd testcase to not throw UOE.
>> e.g. redefining package to private accessibility is still not ACC_PUBLIC.
>
> Okay in regards to your changeset this comment is misleading for the
> static case (public/not-public is not the issue as we aren't changing an
> access modified - changing the static modifier simply leaves the class
> modifiers unchanged):
>
> 62 * Test cases 3 (private) and 4 (static) map to not public, so will
> 63 * not throw <code>UnsupportedOperationException</code> during the
> redefine
> 64 * class operation.
>
> but the whole test is wrong for the "static" case and JVM TI is broken
> for the static case so I'll file a new bug to get JVM TI and the test
> fixed.
>
> David
More information about the serviceability-dev
mailing list