RFR: 8212117 : Class.forName may return a reference to a loaded but not linked Class
Daniel D. Daugherty
daniel.daugherty at oracle.com
Wed Sep 4 22:06:37 UTC 2019
You currently have '-XX:+ClassForNameDeferLinking' as a 'product'
product options are harder to remove down the road. Would it be better as a
diagnostic option? A diagnostic option requires
to be specified before it can be used, e.g.:
java -XX:+UnlockDiagnosticVMOptions -XX:+ClassForNameDeferLinking Foo
so it is a bit harder to use, but maybe that's a Good Thing (TM).
On 9/4/19 5:12 PM, Brent Christian wrote:
> Please review my fix for JDK-8212117. The webrev is here:
> There is also a CSR in need of review.
> The spec for the 2-arg and 3-arg Class.forName() methods states they
> will "locate, load, and link" the class, however the linking part is
> not ensured to happen.
> Although the VM spec allows flexibility WRT when classes are linked,
> this is a corner where the Class.forName() spec is not being upheld.
> While this is not an issue for most usages, 8181144  demonstrates
> how this can be a problem (with the debugging interface, in this case).
> This fix ensures that linking happens during the course of
> Class.forName(). Class.forName() already @throws LinkageError, so no
> spec change is needed there. MethodHandles.Lookup.findClass() needs a
> small spec update, due to calling Class.forName with init=false,
> Of course Errors are not required to be caught. It is therefore
> possible that the new behavior could introduce previously unseen,
> possibly unhandled LinkageErrors. A new VM flag
> (-XX:+ClassForNameDeferLinking) is introduced to restore the previous
> behavior (to keep such code running until it can be updated).
> This change surfaced a couple new "A JNI error has occurred"
> situations (see 8181033) in the Launcher, by way of
> (using the 3-arg Class::forName, detailed in the bug report),
> (using the 2-arg Class::forName).
> The Launcher is updated to maintain non-confusing error messages :).
> The new test included with this fix ensures that 8181144 is
> addressed. Thanks go to Serguei Spitsyn for writing the test.
> Automated corelibs and hotspot tests pass cleanly.
> 1. https://bugs.openjdk.java.net/browse/JDK-8212117
> 2. https://bugs.openjdk.java.net/browse/JDK-8222071
> 3. https://bugs.openjdk.java.net/browse/JDK-8181144
> 5. https://bugs.openjdk.java.net/browse/JDK-8181033
More information about the hotspot-dev