[nestmates] validation of ClassFile for hidden classes

David Holmes david.holmes at oracle.com
Wed Nov 13 14:01:58 UTC 2019


Hi Mandy,

 > Does VM warning on by default?

Yes.

Thanks,
David

On 13/11/2019 4:53 pm, Mandy Chung wrote:
> 
> 
> On 11/12/19 9:45 PM, David Holmes wrote:
>> Hi Mandy,
>>
>> On 13/11/2019 10:45 am, Mandy Chung wrote:
>>> A recent review with Alex and John on [1][2] specifically on:
>>> - Hidden classes cannot participate in static nest membership as
>>>    they do not have names. NestHost/NestMembers attributes on hidden
>>>    classes are ignored.
>>>
>>> Instead of making validation of ClassFile for hidden classes and 
>>> ordinary
>>> classes somewhat different, the alternative is to have the validation
>>> for hidden classes and ordinary classes identical.  When another class
>>> (whether ordinary or hidden) names a hidden class as its declaring class
>>> or class member (via |InnerClasses| attribute), or as its nest host
>>> (via |NestHost| attribute), or as a member of its nest
>>> (via |NestMembers| attribute), the class may successfully be created
>>> while it may fail at run time where there is any attempt to resolve
>>> a hidden class by name via any of these attributes per existing
>>> specification.  No special rule for validation of hidden classes.
>>
>> The problem is not dealing with these attributes naming hidden classes 
>> as you can't name a hidden class in the first place; the problem is 
>> having these attributes in hidden classes themselves.
> 
> That's true.  I attempt to generalize (probably unsuccessfully) the 
> problem that can occur in a class named in these attributes that cannot 
> be found (where this class can be a hidden class or an ordinary class 
> that cannot be found).   There is no good benefit to place certain 
> restrictions on hidden classes.
> 
>>
>> You can certainly allow the hidden class to have all these attributes 
>> and reject their use at runtime (as and when that may happen). I don't 
>> really see the benefit in doing so however as in some cases at least 
>> the specification is going to have to account for this anyway e.g 
>> ignoring static nest attributes when dynamically injecting into a nest.
>>
>>> David,
>>>
>>> This is the revised webrev:
>>> http://cr.openjdk.java.net/~mchung/valhalla/webrevs/8171335/webrev-hidden-class-validation/ 
>>>
>>>
>>> If a hidden nestmate class has a `NestHost` or `NestMembers` attribute,
>>> and it's created to add to a member of a dynamic nest host (H), then
>>> the runtime nest host is set to `H` and these attributes will not
>>> be validated subsequently.
>>
>> Okay.
>>
>>>
>>> If a hidden class has a `NestHost` or `NestMembers` attribute and
>>> created with Lookup::defineHiddenClass without NESTMATE option,
>>> then the behavior is the same as an ordinary class with a bad
>>> `NestHost` or `NestMembers` attribute (e.g. HC's nest host is
>>> not yet validated.  When it attempts to access NH's private member,
>>> it would fail to resolve NH.)
>>
>> Okay.
>>
>>> I'm not sure if this is the best way to implement
>>> InstanceKlass::set_nest_host.  When there is a proposed JVMS draft,
>>> we may make more adjustment to the implementation.  So I hope
>>> this patch is good to push in the time being.
>>
>> I have a number of minor comments, but nothing to stop pushing of the 
>> patch.
>>
>>  364 // So we know that current class is "pristine" and its _nest_host 
>> must be NULL.
>>
>> It's no longer really "pristine" if it has a NestHost or NestMember 
>> attribute. I'd probably just add an additional comment:
>>
>> // If it has an explicit _nest_host_index or _nest_members, these will 
>> be ignored.
>>
> 
> Updated.
> 
>> This change:
>>
>> -  assert((host->_nest_host == NULL && host->_nest_host_index == 0) ||
>> -         (host->_nest_host == host), "proposed host is not a valid 
>> nest-host");
>> +  assert(host->_nest_host == NULL || host->_nest_host == host, 
>> "proposed host is not a valid nest-host");
>>
>> is not correct. This is asserting something about the klass we're 
>> going to be use as the hidden class's nest-host, not something about 
>> the hidden class. The proposed nest-host must be a valid nest-host.
>>
> 
> Thanks for catching it.  This is reverted.   I mistakenly read it the 
> other way.
> 
>> + log_trace(class, nestmates)("Type %s is a dynamic nest member of %s: 
>> the current class has a NestHost attribute",
>>
>> I'd be more inclined to make these warnings rather than just logging 
>> them. Either way it should state the static values are ignored.
>>
> 
> I leave it as logging for now.  We can do this in a future clean up. 
> Does VM warning on by default?
> 
>>> This patch also includes a small javadoc change.
>>
>> +     * then the name is given by the JVM of the following format:
>>
>> suggest:
>>
>> +     * then the name is defined by the JVM with the following format:
>>
>> similarly in the MethodHandle docs.
>>
>> -- 
>>
>> +     * NESTMATE} option, then the hidden class was added as a member to
>> +     * the nest of a {@linkplain MethodHandles.Lookup#lookupClass() 
>> lookup class}
>>
>> suggest:
>>
>> +     * NESTMATE} option, then the hidden class is added to
>> +     * the nest of the {@linkplain MethodHandles.Lookup#lookupClass() 
>> lookup class}
>>
>> -- 
>>
>> -     * Lookup::defineHiddenClass}.
>> +     * Lookup::defineHiddenClass} dynamically.
>>
>> Adding "dynamically" is not necessary here - the use of 
>> defineHiddenClass is implicitly "dynamic".
>>
> 
> OK.  Fixed.
> 
> thanks
> Mandy


More information about the valhalla-dev mailing list