[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
possible bug: ConcurrentModificationException with spark and smalltest-program
On http://svn.sable.mcgill.ca/soot/soot/trunk -r1497, With the attached 
test-program: A.java.
When invoking "soot -w -p cg enabled -p wjtp enabled -app A -p cg 
verbose:on -p jb use-original-names:true -p cg.spark on", I get a 
"ConcurrentModificationException" for cIt.hasNext() in 
ContextInsensitiveBuilder.build() line 90:
        for( Iterator cIt = Scene.v().getClasses().iterator(); 
cIt.hasNext(); ) {
            final SootClass c = (SootClass) cIt.next();
	    handleClass( c );
	}
While performing SparkTransformer.interalTransform. This is probably 
caused by the handleClass method in SparkTransformer adding new classes 
to the Scene.
I have rewritten ReachableMethods.addMethod:
    private void addMethod( MethodOrMethodContext m ) {
            if( set.add( m ) ) {
            	if ( false )
                	reachables.add( m );
            }
    }
In an attempt to make the analysis finish within reasonable time. I've 
waited more than 5 minutes without the ReachableMethods hack on my 
P4M-1700 Mhz.
Is this a bug? Or am I inducing this problem by reducing the call-graph 
in addMethod?
StackTrace:
java.util.ConcurrentModificationException
	at soot.util.HashChain$LinkIterator.hasNext(HashChain.java:464)
	at 
soot.jimple.spark.builder.ContextInsensitiveBuilder.build(ContextInsensitiveBuilder.java:90)
	at 
soot.jimple.spark.SparkTransformer.internalTransform(SparkTransformer.java:53)
	at soot.SceneTransformer.transform(SceneTransformer.java:39)
	at soot.Transform.apply(Transform.java:83)
	at soot.RadioScenePack.internalApply(RadioScenePack.java:60)
	at 
soot.jimple.toolkits.callgraph.CallGraphPack.internalApply(CallGraphPack.java:36)
	at soot.Pack.apply(Pack.java:110)
	at soot.PackManager.runWholeProgramPacks(PackManager.java:319)
	at soot.PackManager.runPacks(PackManager.java:288)
	at soot.Main.run(Main.java:180)
	at soot.Main.main(Main.java:154)
--
Helge
public class A extends Object {
	Object o;
	public static void main(String[] args) {
		Object o1 = new Object();
		Object o2 = new Object();
		A a1 = new A();
		a1.o = o1;
		A a2 = new A();
		a2.o = o2;
		Object o = a1.o;
		if ( args.length > 0 )
			a2.o = a1.o;
	}
}