[Soot-list] CuncurrentModificationException

Bashar Al Rawi brawi at umich.edu
Wed Aug 20 01:16:04 EDT 2008


public class Instrumenter extends BodyTransformer {

    private boolean isObjectInstrumented = false;
    private Set<SootClass> selfRefObjSet = new HashSet<SootClass>();
    private static Instrumenter instance = new Instrumenter();

    private Instrumenter() {
    }

    public static Instrumenter v() {
        return instance;
    }

private SootClass getTopNonLibClass(SootClass s){
        if(!selfRefObjSet.contains(s))
            selfRefObjSet.add(s);
        System.out.println("CURRENT CLASS: " + s);
        if(s.getSuperclass().isLibraryClass())
            return s;
        return getTopNonLibClass(s.getSuperclass());
    }

    private void instrumentSelfRef(SootClass sc) {
        if (implementsSelfRef(sc))
            return;
        SootClass c = getTopNonLibClass(sc);
        System.out.println("Top Non-Lib Class = " + c);
        SootField objVar = new SootField("thisRef", RefType
                .v("tracer.util.ObjVar"), Modifier.PUBLIC);
        c.addField(objVar);
        SootClass selfRefInterface = null;
        if (!Scene.v().containsClass("tracer.util.SelfRef")) {
            selfRefInterface = new SootClass("tracer.util.SelfRef",
                    Modifier.PUBLIC | Modifier.INTERFACE);
        } else {
            selfRefInterface =
Scene.v().getSootClass("tracer.util.SelfRef");
        }
        assert selfRefInterface.isInterface();
        c.addInterface(selfRefInterface);
        SootMethod m = new SootMethod("getSelfRef",
                Arrays.asList(VoidType.v()),
RefType.v("tracer.util.ObjVar"),
                Modifier.PUBLIC);
        c.addMethod(m);   //
-------------------------------------------------------> If I remove this
statement, everything works fine

    }
    private void instrumentClasses(){
        Iterator it = Scene.v().getApplicationClasses().snapshotIterator();
        while(it.hasNext()){

            SootClass c = (SootClass) it.next();
            instrumentSelfRef(c);
            System.out.println(c.getMethods());
        }
    }
    protected void internalTransform(Body body, String pn, Map map) {
        System.out.println(Scene.v().getApplicationClasses());
        if(!isObjectInstrumented){
            isObjectInstrumented = true;
            instrumentClasses();
        }


        instrumentStmt(body);

    }
}


Here is the output I got:

Transforming tracer.benchmarks.Toy1...
[tracer.benchmarks.Toy1, tracer.benchmarks.MyThread]
CURRENT CLASS: tracer.benchmarks.Toy1
Top Non-Lib Class = tracer.benchmarks.Toy1
[<tracer.benchmarks.Toy1: void <init>()>, <tracer.benchmarks.Toy1: void
main(java.lang.String[])>, <tracer.benchmarks.Toy1: tracer.util.ObjVar
getSelfRef(void)>]
CURRENT CLASS: tracer.benchmarks.MyThread
Top Non-Lib Class = tracer.benchmarks.MyThread
[<tracer.benchmarks.MyThread: void <init>()>, <tracer.benchmarks.MyThread:
void run()>, <tracer.benchmarks.MyThread: int getX()>,
<tracer.benchmarks.MyThread: tracer.util.ObjVar getSelfRef(void)>]
method: <init>
r0 := @this: tracer.benchmarks.Toy1
Identity: r0 := @this: tracer.benchmarks.Toy1
specialinvoke r0.<java.lang.Object: void <init>()>()
return
Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.AbstractList$Itr.checkForComodification(Unknown Source)
    at java.util.AbstractList$Itr.next(Unknown Source)
    at soot.PackManager.runBodyPacks(PackManager.java:735)
    at soot.PackManager.runBodyPacks(PackManager.java:451)
    at soot.PackManager.runBodyPacks(PackManager.java:370)
    at soot.PackManager.runPacks(PackManager.java:347)
    at soot.Main.run(Main.java:203)
    at soot.Main.main(Main.java:146)
    at tracer.instrument.Instrumenter.main(Instrumenter.java:675)


Thanks a lot in advance.



On Tue, Aug 19, 2008 at 11:21 PM, Richard L. Halpert <
richardlhalpert at gmail.com> wrote:

> Your explanation of the problem is rather vague.  Please send code.
>
> -Richard
>
> On Tue, Aug 19, 2008 at 5:31 PM, Bashar Al Rawi <brawi at umich.edu> wrote:
>
>> Hi,
>>
>> I am trying to add modify a class file by overwriting the
>> internalTransform method. However, whenever I add a new method to the class,
>> I get java.util.ConcurrentModificationException. I tried using
>> snapshotIterator, but its not working. Can you please tell me wat's
>> happening?
>>
>> Thanks
>>
>> --
>> Bashar
>>
>>
>> _______________________________________________
>> Soot-list mailing list
>> Soot-list at sable.mcgill.ca
>> http://mailman.cs.mcgill.ca/mailman/listinfo/soot-list
>>
>>
>


-- 
Bashar
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mailman.CS.McGill.CA/pipermail/soot-list/attachments/20080820/ae0aa52e/attachment-0001.htm


More information about the Soot-list mailing list