Bug 24273 - ReferenceType.getFirstCommonSuperclass: Does not recognize UninitializedObjectType
Summary: ReferenceType.getFirstCommonSuperclass: Does not recognize UninitializedObjec...
Status: NEEDINFO
Alias: None
Product: BCEL - Now in Jira
Classification: Unclassified
Component: Main (show other bugs)
Version: 5.1
Hardware: All All
: P4 normal
Target Milestone: ---
Assignee: issues@commons.apache.org
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2003-10-31 00:49 UTC by David Foster
Modified: 2006-03-01 19:54 UTC (History)
0 users



Attachments

Note You need to log in before you can comment on or make changes to this bug.
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?!