Here's a little gem that causes BCEL's verifier to crash: (Compile the following with the bytecode assembler Jasmin) .class public Test47 .super java/lang/Object .method public foo(B)V .limit stack 10 .limit locals 10 iload_1 ifne ELSE_0 new java/io/BufferedInputStream goto ENDIF_0 ELSE_0: new java/io/FilterInputStream ENDIF_0: pop return .end method The error generated is as follows: Exception in thread "main" org.apache.bcel.verifier.exc.AssertionViolatedException: INTERNAL ERROR: Some RuntimeException occured while verify()ing class 'Test47', method 'public void foo(byte arg1)'. Original RuntimeException's stack trace: --- java.lang.ClassCastException at org.apache.bcel.generic.ReferenceType.getFirstCommonSuperclass(ReferenceType.java:256) at org.apache.bcel.verifier.structurals.OperandStack.merge(OperandStack.java:254) at org.apache.bcel.verifier.structurals.ControlFlowGraph$InstructionContextImpl.mergeInFrames(Cont rolFlowGraph.java:246) at org.apache.bcel.verifier.structurals.ControlFlowGraph$InstructionContextImpl.execute(ControlFlow Graph.java:189) at org.apache.bcel.verifier.structurals.Pass3bVerifier.circulationPump(Pass3bVerifier.java:228) at org.apache.bcel.verifier.structurals.Pass3bVerifier.do_verify(Pass3bVerifier.java:342) at org.apache.bcel.verifier.PassVerifier.verify(PassVerifier.java:108) at org.apache.bcel.verifier.Verifier.doPass3b(Verifier.java:133) at ClassVerifier.verify(ClassVerifier.java:33) at ClassInfo.verify(ClassInfo.java:51) at Main.main(Main.java:7) --- at org.apache.bcel.verifier.structurals.Pass3bVerifier.do_verify(Pass3bVerifier.java:356) at org.apache.bcel.verifier.PassVerifier.verify(PassVerifier.java:108) at org.apache.bcel.verifier.Verifier.doPass3b(Verifier.java:133) at ClassVerifier.verify(ClassVerifier.java:33) at ClassInfo.verify(ClassInfo.java:51) at Main.main(Main.java:7) It appears that ReferenceType.getFirstCommonSuperclass() is not designed to handle the org.apache.bcel.verifier.structurals.UninitializedObjectType ReferenceType that is used by BCEL's verifier.
Right. The UninitializedObjectType was invented to be used internally in JustIce. The idea was not to go out with it and ask BCEL about its superclass. Oh lord.
So why is it exposed is the question then?!