Bug 24273

Summary: ReferenceType.getFirstCommonSuperclass: Does not recognize UninitializedObjectType
Product: BCEL - Now in Jira Reporter: David Foster <potentiallyspam>
Component: MainAssignee: issues <issues>
Status: NEEDINFO ---    
Severity: normal    
Priority: P4    
Version: 5.1   
Target Milestone: ---   
Hardware: All   
OS: All   

Description David Foster 2003-10-31 00:49:28 UTC
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.
Comment 1 Enver Haase 2003-11-02 19:36:43 UTC
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.
Comment 2 Torsten Curdt 2006-03-02 04:54:01 UTC
So why is it exposed is the question then?!