javac 7 is able to generate inner class that can't be verified (original) (raw)

Remi Forax forax at univ-mlv.fr
Thu Sep 20 04:44:41 PDT 2012


ping !

Rémi

On 07/05/2012 01:00 PM, Rémi Forax wrote:

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