[Soot-list] Incomplete Call Graph with paddle in case of multi threaded program

ASHISH MISHRA ashish123.mishragkp at gmail.com
Mon Feb 11 08:37:23 EST 2013


Dear all,

I am trying to build Context sensitive call graph for a program involving
threads. But I think the graph is missing the call Edge from main method to
MyThread.run().

1) This is the case when I use Runnable interface for thread execution.

2) However for the *other example program* , where I execute threads via
extending Thread class ,* the said edge is present. *

I am doing some thing like this-

//My analysis code starts here//

public class PaddleTest {
 public static void main(String[] args) {
 List<String> argList= new ArrayList<String>(Arrays.asList(args));
String[] soot_options= new String[]{
"-w",
"-p",
"jb",
"use-original-names:true",
"-p",
"cg",
"enabled:true",
"-cp",
".",
"-pp",
"-main-class",
args[0],
"--app",
args[0],
"-f",
"jimp"
 };
argList.addAll(Arrays.asList(soot_options));
  PackManager.v().getPack("wjtp").add(
    new Transform("wjtp.myTransform", new SceneTransformer() {
      protected void internalTransform(String phase, Map options) {

      CallGraph cg = null;
      //set paddle options
      HashMap opt = new HashMap();
      opt.put("enabled","true");
      opt.put("verbose","true");
      opt.put("bdd","true");
      opt.put("backend","buddy");
      opt.put("context","kcfa");
      opt.put("context-heap", "true");
     // opt.put("context-counts","true");
      opt.put("k","2");
      opt.put("propagator","auto");
      opt.put("conf","ofcg-aot");
      opt.put("order","32");
      opt.put("q","auto");
      opt.put("set-impl","double");
      opt.put("double-set-old","hybrid");
      opt.put("double-set-new","hybrid");
      opt.put("pre-jimplify","false");
      opt.put("whole-program", "true");
      PaddleTransformer pt = new PaddleTransformer();
      PaddleOptions paddle_opt = new PaddleOptions(opt);
      pt.setup(paddle_opt);
      pt.solve(paddle_opt);
      soot.jimple.paddle.Results.v().makeStandardSootResults();




     cg= Scene.v().getCallGraph(); //return paddle call graph
        //do your stuff here

     System.out.println("The Call Graph size " + cg.size());

     System.out.println("Call Graph" + cg.toString());

                                        }
  }));

 Scene.v().addBasicClass("java.lang.Process",SootClass.HIERARCHY);
 Scene.v().addBasicClass("java.io.FileSystem",SootClass.HIERARCHY);
soot.Main.main(soot_options);
}

}

INPUT - WHICH DOES NOT SHOW CALL EDGE main() ---->

*public class test_thread{*
*
*
*    public static void main(String[] args) {*
*
*
*    AliasClass obj = new AliasClass();*
*    obj.twoDArray = new int[10][10]; // Allocate shared memory*
*    Runnable myThread_obj1 = new MyThread(obj);*
*    Runnable myThread_obj2 = new MyThread(obj);*
*
*
*    // Both threads will access the same shared object of the AliasClass.*
*    Thread t_1 = new Thread(myThread_obj1);*
*    Thread t_2 = new Thread(myThread_obj2);*
*    t_1.start();*
*    t_2.start();*
*    }*
*}*
*
*
*
*
*class AliasClass{*
*    public int [][]twoDArray;*
*    public AliasClass() {}*
*}*
*
*
*
*
*
*
*class MyThread implements Runnable{*
*    public AliasClass sharedObj;*
*
*
*    public MyThread(AliasClass paramObj) {*
*    sharedObj = paramObj;*
*    }*
*
*
*
*
*     *
*    public void run() {*
*    *
*    int [][]auxArr = sharedObj.twoDArray;*
*    int []arr;*
*    int j=0;*
*
*
*    for(j=0; j<10; ++j) {*
*        arr = new int[10];*
*        auxArr[j] = arr;*
*    }*
*    }*
*}*


CODE - WHICH HAS THE SAID EDGE-


*package testcases;*
*
*
*import java.lang.Thread;*
*import java.lang.Runnable;*
*
*
*public class test_thread2{*
*
*
*    public static void main(String[] args) {*
*
*
*   *
*
*
*   *
*    Thread t_1 = new MyThread_et();*
*   *
*    t_1.start();*
*    }*
*}*
*
*
*class MyThread_et extends Thread{*
* *
* public MyThread_et(){ }*
* *
* //Override run *
* *
* public void run(){*
* *
* for(int i=0; i<10; i++){*
* System.out.println("Iside Thread object");*
* try{*
* Thread.sleep(10);*
* }catch (Exception e) {*
* // TODO: handle exception*
* }*
* } *
* *
* *
* }*
* *
*} *
* *
* *
* *
* *
* *
* *
*}*
*
*
*
*
*This problem is not a new one and has been reported earlier too in the
list follow link, unfortunately remains unsolved . *
*
*
http://www.sable.mcgill.ca/pipermail/soot-list/2011-June/003722.html*
*


I looked at the paddle code but couldn't get the answer yes. Please help me
on this.



-- 
Regards,
Ashish Mishra
Graduate Student,
Computer Science and Automation Department,IISc
Cell : +91-9611194714
Mailto : ashishmishra at csa.iisc.ernet.in
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mailman.cs.mcgill.ca/pipermail/soot-list/attachments/20130211/ba8323f7/attachment-0001.html 


More information about the Soot-list mailing list