-
Bug
-
Resolution: Won't Fix
-
P4
-
None
-
7, 8
-
x86
-
os_x
FULL PRODUCT VERSION :
Java(TM) SE Runtime Environment (build 1.8.0_102-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)
FULL OS VERSION :
Darwin mac-esxi-38 12.5.0 Darwin Kernel Version 12.5.0: Sun Sep 29 13:33:47 PDT 2013; root:xnu-2050.48.12~1/RELEASE_X86_64 x86_64
A DESCRIPTION OF THE PROBLEM :
According the JVM specification (4.5): "...each field of a class may have at most one of its ACC_PUBLIC, ACC_PRIVATE, and ACC_PROTECTED flags set (JLS §8.3.1)..."
However, JVM loads classes declaring protected+private method without any errors.
It can be observed on the example below.
This example provides runtime with the class testInitFlags_2C.j with protected+private ctor and the class Test.java which tries to instantiate testInitFlags_2C. The class testInitFlags_2C was written in Jasmin (see http://jasmin.sourceforge.net)
THE PROBLEM WAS REPRODUCIBLE WITH -Xint FLAG: Yes
THE PROBLEM WAS REPRODUCIBLE WITH -server FLAG: Yes
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
$ java -jar jasmin.jar testInitFlags_2C.j
$ javac Test.java
$ java Test
EXPECTED VERSUS ACTUAL BEHAVIOR :
Expected: testInitFlags_2C won't be instantiated and ClassFormatError (or VerifyError) will be thrown
Actual: testInitFlags_2C is loaded without any errors; IllegalAccessException is thrown when protected&private ctor is called
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
testInitFlags_2C.j
.class public testInitFlags_2C
.super java/lang/Object
;
; standard initializer
.method protected private <init>()V
aload_0
invokenonvirtual java/lang/Object/<init>()V
return
.end method
--------------------8<--------------------
Test.java
public class Test {
public static void main(String[] args) {
try {
Class cl = Class.forName("testInitFlags_2C");
cl.newInstance();
System.out.println("FAILED: class loaded and instantiated");
} catch (ClassFormatError e) {
System.out.println("caught ClassFormatError (expected)");
} catch (Throwable e) {
System.out.println("caught " + e);
}
}
}
---------- END SOURCE ----------
Java(TM) SE Runtime Environment (build 1.8.0_102-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)
FULL OS VERSION :
Darwin mac-esxi-38 12.5.0 Darwin Kernel Version 12.5.0: Sun Sep 29 13:33:47 PDT 2013; root:xnu-2050.48.12~1/RELEASE_X86_64 x86_64
A DESCRIPTION OF THE PROBLEM :
According the JVM specification (4.5): "...each field of a class may have at most one of its ACC_PUBLIC, ACC_PRIVATE, and ACC_PROTECTED flags set (JLS §8.3.1)..."
However, JVM loads classes declaring protected+private method without any errors.
It can be observed on the example below.
This example provides runtime with the class testInitFlags_2C.j with protected+private ctor and the class Test.java which tries to instantiate testInitFlags_2C. The class testInitFlags_2C was written in Jasmin (see http://jasmin.sourceforge.net)
THE PROBLEM WAS REPRODUCIBLE WITH -Xint FLAG: Yes
THE PROBLEM WAS REPRODUCIBLE WITH -server FLAG: Yes
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
$ java -jar jasmin.jar testInitFlags_2C.j
$ javac Test.java
$ java Test
EXPECTED VERSUS ACTUAL BEHAVIOR :
Expected: testInitFlags_2C won't be instantiated and ClassFormatError (or VerifyError) will be thrown
Actual: testInitFlags_2C is loaded without any errors; IllegalAccessException is thrown when protected&private ctor is called
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
testInitFlags_2C.j
.class public testInitFlags_2C
.super java/lang/Object
;
; standard initializer
.method protected private <init>()V
aload_0
invokenonvirtual java/lang/Object/<init>()V
return
.end method
--------------------8<--------------------
Test.java
public class Test {
public static void main(String[] args) {
try {
Class cl = Class.forName("testInitFlags_2C");
cl.newInstance();
System.out.println("FAILED: class loaded and instantiated");
} catch (ClassFormatError e) {
System.out.println("caught ClassFormatError (expected)");
} catch (Throwable e) {
System.out.println("caught " + e);
}
}
}
---------- END SOURCE ----------