Why having the wrong InnerClasses attribute is an issue for the VM ?

David Holmes david.holmes at oracle.com
Mon Nov 30 07:57:37 UTC 2020


On 30/11/2020 5:08 pm, Remi Forax wrote:
> I've forgotten a cast in an invokedynamic, hence a call to wrongTargetType,
> but in order to create the error message, MethodType.toString(), getSimpleName() is called and it fails because getDeclaringClass() verifies the InnerClasses attribute.
> 
> For me InnerClasses was just an attribute for javac not something the VM should take care of,
> it seems that the VM strongly verifies this attribute and i wonder what is the reason behind that ?

 From the VM code - InstanceKlass::compute_enclosing_class:

   // Throws an exception if outer klass has not declared k as an inner 
klass
   // We need evidence that each klass knows about the other, or else
   // the system could allow a spoof of an inner class to gain access 
rights.
   Reflection::check_for_inner_class(outer_klass, this, 
*inner_is_member, CHECK_NULL);

David

> regards,
> Rémi
> 
> Exception in thread "main" java.lang.IncompatibleClassChangeError: fr.umlv.transmogrif.ImplMap and fr.umlv.transmogrif.ImplMap$Row/0x0000000801007400 disagree on InnerClasses attribute
>          at java.base/java.lang.Class.getDeclaringClass0(Native Method)
>          at java.base/java.lang.Class.isTopLevelClass(Class.java:1970)
>          at java.base/java.lang.Class.getSimpleBinaryName(Class.java:1955)
>          at java.base/java.lang.Class.getSimpleName0(Class.java:1835)
>          at java.base/java.lang.Class.getSimpleName(Class.java:1826)
>          at java.base/java.lang.Class.getSimpleName0(Class.java:1833)
>          at java.base/java.lang.Class.getSimpleName(Class.java:1826)
>          at java.base/java.lang.invoke.MethodType.toString(MethodType.java:895)
>          at java.base/java.lang.String.valueOf(String.java:3365)
>          at java.base/java.lang.StringBuilder.append(StringBuilder.java:169)
>          at java.base/java.lang.invoke.MethodHandle.standardString(MethodHandle.java:1611)
>          at java.base/java.lang.invoke.MethodHandle.toString(MethodHandle.java:1608)
>          at java.base/java.lang.String.valueOf(String.java:3365)
>          at java.base/java.lang.invoke.CallSite.wrongTargetType(CallSite.java:203)
>          at java.base/java.lang.invoke.CallSite.makeSite(CallSite.java:333)
>          at java.base/java.lang.invoke.MethodHandleNatives.linkCallSiteImpl(MethodHandleNatives.java:280)
>          at java.base/java.lang.invoke.MethodHandleNatives.linkCallSite(MethodHandleNatives.java:270)
>          at fr.umlv.transmogrif.ImplMap/0x0000000801003c00.<init>(ImplMap.java:21)
>          at fr.umlv.transmogrif.Main.main(Main.java:7)
> 


More information about the core-libs-dev mailing list