The JDWP implementation (debug agent) allows the writing of static final fields 
and instance final fields. This has always been the case since no checks are 
made to prevent it, and JNI doesn't prevent it. The JDI spec forbids the 
setting of final fields, and it has a check that will throw an exception if 
attempted. However, it is important that we continue to allow JDWP to write 
final fields because some debuggers allow for it at the JDI level (protected by 
a click through warning). Although these debuggers are not fully JDI compliant, 
there is no requirement that they be compliant, so JDWP should continue to 
support this behavior. Much of this was discussed in the PR for 
[JDK-8281652](https://bugs.openjdk.org/browse/JDK-8281652), which clarified in 
the JDI spec that writing static fields was not allowed. This was just a spec 
clarification. JDI already forbid the setting of final fields.

Having said all that, the JDWP spec for ClassType.SetValues says "Final fields 
cannot be set." This is clearly wrong as it has always been allowed. 
ObjectReference.SetValues says nothing about final fields, and also allows them 
to be set.

This PR has two spec updates:
- Get rid of the "Final fields cannot be set." text for ClassType.SetValues.
- ObjectReference.SetValues and ReferenceType.SetValues should warn against 
setting final fields by using language similar to JNI.

I've also updated two tests to test for setting both static final fields and 
instance final fields. The tests (before my changes) verified the setting of 
fields (not final) on the debuggee side. I tried the same with final fields and 
ran into problems. The compiler inlines final primitives values, so setting the 
final fields is not seen when the fields are referenced from java (or at least 
this was the case with static final fields. I'm not positive about instance 
final fields). So I added support for using GetValues to verify the results 
rather than relying on the debuggee's view of the fields.

Testing in progress.

---------
- [x] I confirm that I make this contribution in accordance with the [OpenJDK 
Interim AI Policy](https://openjdk.org/legal/ai).

-------------

Commit messages:
 - fix jcheck whitespace errors
 - get rid of unneeded <p>
 - jdwp spec updates regarding SetValues of final fields

Changes: https://git.openjdk.org/jdk/pull/32029/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=32029&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8388833
  Stats: 219 lines in 5 files changed: 191 ins; 2 del; 26 mod
  Patch: https://git.openjdk.org/jdk/pull/32029.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/32029/head:pull/32029

PR: https://git.openjdk.org/jdk/pull/32029

Reply via email to