javac 7 is able to generate inner class that can't be verified

Rémi Forax forax at univ-mlv.fr
Thu Jul 5 04:00:13 PDT 2012


Hi Maurizio, hi all,
there is a dubious code in javac that try to reuse existing inner class 
(or create one)
when a constructor accessor need to be generated (see 
Lower.accessConstructorTag).

Used in conjunction with the fact that the inner class exists but
is created in a block guarded by 'if(false)' leads to a half baked 
generated class
(no code for method run()) so the inner-class doesn't pass the verifier 
check.

Code to reproduce:
public class EmptyClassWithFakeConstructor {
   private static class Foo {
     // need to generate an accessor method
   }

   public static void main(String[] args) {
     new Foo();  // call the accessor

     if(false) {
       new Runnable() {
         @Override
         public void run() {   // the code of this method is not generated
           System.out.println();
         }
       }.run();
     }
   }
}

javap -c EmptyClassWithFakeConstructor\$1.class
Compiled from "EmptyClassWithFakeConstructor.java"
final class EmptyClassWithFakeConstructor$1 implements java.lang.Runnable {
   EmptyClassWithFakeConstructor$1();

   public void run();
}

as you see, the method run is empty (but not abstract).

cheers,
Rémi






More information about the compiler-dev mailing list