On 12/01/2019 8:47 am, Mandy Chung wrote:
On 1/11/19 2:38 PM, David Holmes wrote:
There seem to be a number of spec issues around this. Shouldn't findStaticSetter say something about what happens when the field is final? Same for findSetter? This issue seems to be much bigger than just a simple bug fix.


I don't see any issue with the spec for findSetter and findStaticSetter.  findSetter returns a method handle equivalent to `putField` bytecode and it throws IAE when access checking is performed since it's final and not writeable.  Similiarly for findStaticSetter.

Well that is what it does, but it doesn't explicitly mention final fields and the @throws information for IAE:

IllegalAccessException - if access checking fails, or if the field is static

doesn't convey anything about getting IAE for a final field. Perhaps it is implicit in the "this behaves like bytecode" but it is very obscure.

A CSR request will need to be filed.


Of course, as this is a spec change.

I'm unclear what spec is actually to be changed here and in what way? If these methods produce MH that obey bytecode semantics then the fact the Field had setAccessible(true) called on it is not relevant - the JVMS knows nothing about setAccessible. The only issue I see is the implementation not throwing IAE when the Field represents a final field, because it examines the "accessibility" state. (And that should apply whether the field is static or not.)

David
-----

Mandy

David
-----

On 12/01/2019 5:07 am, Mandy Chung wrote:
This issue requires a spec change and it's a behavioral change. Field::set on a static final field throws IAE.  Although there are few cases in the world that hack around it, I think the compatibility risk is low in this change.

I added a suggested fix in the JBS issue.

Mandy

On 1/11/19 10:07 AM, Mandy Chung wrote:
Hi Adam,

This is indeed a bug.    I suggest to do the check in the checkAccess method closes to where it performs the instance final field check. Please also add a test case.

Mandy

On 1/11/19 6:38 AM, Adam Farley8 wrote:
Hi All,

First; thanks for responding so quickly. :)

Second, it sounds like changing the contents of a final field is
acceptable under the spec, but *not* changing the contents of a static
final field.

The test case uploaded to the bug uses a static final field for the test, so I think we can agree that the ability to create a setter for a static
final field is still a bug.

It sounds like the same fix could work if we check for "static" when we
check for "final", with a modified message.

As Field.set (post-setAccessible) fails to set the value of a static final field, I think we can agree that unreflectSetter should fail to create a
setter MethodHandle for this same field.

Best Regards

Adam Farley
IBM Runtimes



Reply via email to