An undefined behavior w.r.t. <clinit>
Yuting Chen
chenyt at cs.sjtu.edu.cn
Sun Jul 12 19:41:12 UTC 2015
Should the text in jvms 2.9 be changed? The statement "Other methods
named <clinit> in a class file are of no consequence" is not very
clear. I guess the correct representation should be "Methods named
<clinit> are of no consequence if they are not class or interface
initialization methods."
Suggestions:
"
The initialization method of a class or interface has the special name
<clinit>, takes no arguments, and is void (§4.3.3).
Other methods named <clinit> in a class file are of no consequence.
They are not class or interface initialization methods. They cannot be
invoked by any Java Virtual Machine instruction and are never invoked
by the Java Virtual Machine itself.
"
=>
"
The initialization method of a class or interface has the special name
<clinit>, takes no arguments, and is void (§4.3.3).
Other methods named <clinit> are not class or interface initialization
methods. They cannot be invoked by any Java Virtual Machine
instruction and are never invoked by the Java Virtual Machine itself.
Methods named <clinit> are of no consequence if they are not class or
interface initialization methods.
"
On Wed, Jul 8, 2015 at 5:21 PM, Yuting Chen <chenyt at cs.sjtu.edu.cn> wrote:
> Hello, I recently feel puzzling about the JVM behaviors when an illegal
> <clinit> is met. The specification may not be complete in this part.
>
> In the specification (jvms-2.9, se8), we have the words: "In a class file
> whose version number is 51.0 or above, the method must additionally have its
> ACC_STATIC flag (§4.6) set in order to be the class or interface
> initialization method."
>
> However, the behavior is undefined if the ACC_STATIC flag is not set. Thus
> when a class without an ACC_STATIC flag may either be accepted or be
> rejected, depending on the JVM developers. The results can be unpredictable.
>
> I checked this by running a class on OpenJDK8-HotSpot and IBM J9, and found
> different results. The class can be run on HotSpot without triggering any
> exceptions (i.e., <clinit> is of no consequence). However, IBM J9 can throw
> out a FormatError (Exception in thread "main" java.lang.ClassFormatError:
> JVMCFRE074 no Code attribute specified; class=M1436188543,
> method=<clinit>()V, pc=0). I checked the specification and still could not
> decide which JVM behaves correctly.
>
> The class is attached, and the decompiled code is given next:
>
> class M1436188543
> minor version: 0
> major version: 51
> flags: ACC_SUPER
> Constant pool:
> #1 = Utf8 java/lang/Object
> #2 = Utf8 <clinit>
> #3 = Utf8 SourceFile
> #4 = Utf8 M1436188543
> #5 = Utf8 main
> #6 = Class #4 // M1436188543
> #7 = Utf8 Code
> #8 = Utf8 ([Ljava/lang/String;)V
> #9 = Utf8 ()V
> #10 = Utf8 Jasmin
> #11 = Class #1 // java/lang/Object
> {
> public abstract {};
> descriptor: ()V
> flags: ACC_PUBLIC, ACC_ABSTRACT
>
> public static void main(java.lang.String[]);
> descriptor: ([Ljava/lang/String;)V
> flags: ACC_PUBLIC, ACC_STATIC
> Code:
> stack=0, locals=1, args_size=1
> 0: return
> }
>
More information about the jls-jvms-spec-comments
mailing list