RFR (S) JDK-8202758: SIGSEGV calling Class.forName(String,Boolean,ClassLoader) with mocked loader
David Holmes
david.holmes at oracle.com
Fri May 25 00:27:31 UTC 2018
On 25/05/2018 9:17 AM, coleen.phillimore at oracle.com wrote:
> On 5/24/18 6:45 PM, David Holmes wrote:
>> Hi Coleen,
>>
>> My 2c
>>
>> On 25/05/2018 6:10 AM, coleen.phillimore at oracle.com wrote:
>>>
>>> http://cr.openjdk.java.net/~lfoltan/bug_jdk8202758/webrev/test/hotspot/jtreg/runtime/modules/ClassLoaderNoUnnamedModuleTest.java.html
>>>
>>>
>>> This doesn't seem to use InMemoryJavaCompiler but imports it.
>>>
>>> http://cr.openjdk.java.net/~lfoltan/bug_jdk8202758/webrev/src/hotspot/share/classfile/moduleEntry.cpp.udiff.html
>>>
>>>
>>> Are you sure we want to do a guarantee()? That will look like a VM
>>> crash to the user who will report it as a bug, so they and others
>>> will still think it's our bug. Generally when we produce an
>>> hs_err_pid.log file, people think it's a bug in the vm (except the
>>> OOM variants but sometimes that's debatable too).
>>>
>>> I took out all the TRAPS to the call stack for where this is called,
>>> but you could put them back in and throw an exception instead (NPE)
>>> which would give the user his file and line where the error
>>> occurred. Or else create a variant of vm_exit_during_initialization
>>> that doesn't say it's during initialization in order to exit the vm
>>> quickly with a message.
>>
>> An exception would legitimise this too much. This isn't a simple
>> programming error, but a subversion of the language semantics by
>> skipping the superclass constructor.
>
> We have constructs that subvert the language and get VerifyError or
> ClassFormatError. I don't see the difference.
The difference is that there is a clear specification for correctly
formed classfiles that we can check against and throw the appropriate
exception.
That is not what is happening here. Unfortunately there's nothing in the
VM spec that requires the call chain of superclass constructors that the
Java language requires - so we can't detect this kind of problem that
way. As Alan wrote in the bug report there are numerous system classes
that are intimately tied to the VM and which rely on implicit protocols
between the VM and the library code. Here the framework has replaced a
class and caused it to not invoke its superclass constructor - as the
Java language requires - and as a result initialization that the VM
depends upon is not performed. There are numerous ways that similar
crashes could be provoked.
>>
>> A vm_exit other than at initialization is not something I'd want to
>> encourage use of. We only have the at-initialization variant to handle
>> the inability to throw exceptions at that time and to avoid ugly crashes.
>>
>
> My second choice would be to add an vm_exit variant that doesn't call
> VMError::report_and_die and doesn't say that the error happened during
> initialization. I'd rather have the user not see an ugly crash as you
> call it.
I totally oppose any notion that there can be, after initialization, any
abnormal termination of the VM other than a crash! If you've subverted
bytecode rules or API semantics then you get exceptions. If you load
native code, or an agent that stomps on memory, you get a crash. If you
inject any other foreign "code" into the VM and it triggers an internal
error then you get an internal error - which is abrupt termination with
a hs_err log (aka a crash).
We've had similar cases where attempts have been made to replace
java.lang.Object for example.
>> In this case, I think a guarantee failure is warranted - though I
>> wonder whether we can be more specific about the potential cause? I
>> agree this will come back as a bug report against the JVM rather than
>> against Mockito/Objgenesis/whomever. Not sure what we can do there.
>>
>
> I would prefer not getting the crashes. It tooks us several minutes to
> realize that one of the bugs reported was an instance of this. The
> guarantee message is a bit useful for finding duplicates but I'd much
> rather not get the reports.
You think people won't report a sudden termination of the JVM any way??
The end user won't understand this error regardless of how we report it.
Thanks,
David
> thanks,
> Coleen
>> Cheers,
>> David
>>
>>> Thanks,
>>> Coleen
>>>
>>>
>>> On 5/24/18 1:35 PM, Lois Foltan wrote:
>>>> Please review this change to ensure that a given ClassLoader's
>>>> unnamed Module is a valid instance of java.lang.Module with the JVM.
>>>>
>>>> open webrev at
>>>> http://cr.openjdk.java.net/~lfoltan/bug_jdk8202758/webrev/
>>>> bug link at https://bugs.openjdk.java.net/browse/JDK-8202758
>>>>
>>>> Testing: hs-tier1-3, jdk-tier1-3 in progress
>>>>
>>>> Thanks,
>>>> Lois
>>>
>
More information about the hotspot-runtime-dev
mailing list