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

Eric Bodden eric.bodden at ec-spride.de
Mon Feb 11 11:04:35 EST 2013


Hello.

This is odd. I have definitely seen this work before, at least with Spark.

Does the edge show up when you run paddle with its default options?

Eric

On 11 February 2013 14:37, ASHISH MISHRA <ashish123.mishragkp at gmail.com> wrote:
> 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
>



-- 
Eric Bodden, Ph.D., http://sse.ec-spride.de/ http://bodden.de/
Head of Secure Software Engineering Group at EC SPRIDE
Tel: +49 6151 16-75422    Fax: +49 6151 16-72051
Room 3.2.14, Mornewegstr. 30, 64293 Darmstadt


More information about the Soot-list mailing list