[Soot-list] a problem in the points-to analysis using SPARK

Zhang Yufeng yuffonzhang at 163.com
Thu Mar 14 10:17:02 EDT 2013


Hi all,
I am new to Soot.
Now I am trying to use the points-to analysis using SPARK.
I copy the code from the example of the tutorial "soot survivors document".
But I can't get the points-to set for any local variables.
Indeed, all the points-to set I get are empty.
I don't know what is wrong.
My codes are as follows.


==============
Here are the classes I want to analyze:

================Container.java
public class Container {
private Item item = new Item();
void setItem(Item item) {
this.item = item;
}
Item getItem() {
return this.item;
    }
}



==================Item.java
public class Item {
    Object data;
    public static void main(String[] args) {}
}

==================Use.java
public class Use {
public void go() {
Container c1 = new Container();
Item i1 = new Item();
c1.setItem(i1);

Container c2 = new Container();
Item i2 = new Item();
c2.setItem(i2);
Container c3 = c2;
}
public static void main(String[] args) {}
}

I want to analyze the points-to sets of the local variables in the method Use.go().

The code I used to invoke SPARK is as follows:


=====================TestPointTo.java
public class TestPointTo {
private static SootClass loadClass(String name, boolean main) {
    SootClass c = Scene.v().loadClassAndSupport(name);
c.setApplicationClass();
if (main) Scene.v().setMainClass(c);
        return c;
}

public static void main(String[] args) {

soot.options.Options.v().set_keep_line_number(true);
soot.options.Options.v().set_whole_program(true);
soot.options.Options.v().setPhaseOption("cg","verbose:false");
loadClass("Item", false); 
loadClass("Container", false);
SootClass c = loadClass(args[0], true);

soot.Scene.v().loadNecessaryClasses();
soot.Scene.v().setEntryPoints(EntryPoints.v().all());
HashMap opt = new HashMap();
opt.put("enabled","true"); // enabled, necessary
// opt.put("verbose","true");
opt.put("ignore-types","false");          
opt.put("force-gc","false");            
opt.put("pre-jimplify","false");          
opt.put("vta","false");                   
opt.put("rta","false");                   
opt.put("field-based","false");           
opt.put("types-for-sites","false");        
opt.put("merge-stringbuffer","true");   
opt.put("string-constants","false");     
opt.put("simulate-natives","true");      
opt.put("simple-edges-bidirectional","true");
opt.put("on-fly-cg","true");            
opt.put("simplify-offline","false");    
opt.put("simplify-sccs","false");        
opt.put("ignore-types-for-sccs","false");
opt.put("propagator","worklist");
opt.put("set-impl","double");
opt.put("double-set-old","hybrid");         
opt.put("double-set-new","hybrid");
opt.put("dump-html","false");           
opt.put("dump-pag","false");             
opt.put("dump-solution","false");        
opt.put("topo-sort","false");           
opt.put("dump-types","true");             
opt.put("class-method-var","true");     
opt.put("dump-answer","false");          
opt.put("add-tags","false");             
opt.put("set-mass","false");  
SparkTransformer.v().transform("",opt);

Map/*<Local>*/ ls = getLocals(c,args[1],"Container");
printLocalIntersects(ls); 
}

private static void printLocalIntersects(Map/*<Integer,Local>*/ ls) {
soot.PointsToAnalysis pta = Scene.v().getPointsToAnalysis();
Iterator i1 = ls.entrySet().iterator();
while (i1.hasNext()) {
Map.Entry e1 = (Map.Entry)i1.next();
int p1 = ((Integer)e1.getKey()).intValue();
      Local l1 = (Local)e1.getValue();
PointsToSet r1 = pta.reachingObjects(l1);
     Iterator i2 = ls.entrySet().iterator();
     while (i2.hasNext()) {
      Map.Entry e2 = (Map.Entry)i2.next();
int p2 = ((Integer)e2.getKey()).intValue();
           Local l2 = (Local)e2.getValue();
           PointsToSet r2 = pta.reachingObjects(l2); 
           if (p1<=p2)
               System.out.println("["+p1+","+p2+"]\t Container intersect? "+r1.hasNonEmptyIntersection(r2));
    }
}
}


private static Map/*<Integer,Local>*/ getLocals(SootClass sc, String methodname, String typename) {
Map res = new HashMap();
Iterator mi = sc.getMethods().iterator();
while (mi.hasNext()) {
        SootMethod sm = (SootMethod)mi.next();
        System.err.println(sm.getName());
  if (sm.getName().equals(methodname) && sm.isConcrete()) {
JimpleBody jb = (JimpleBody)sm.retrieveActiveBody();
Iterator ui = jb.getUnits().iterator();
while (ui.hasNext()) {
                Stmt s = (Stmt)ui.next(); 
                int line = getLineNumber(s);
// find definitions
Iterator bi = s.getDefBoxes().iterator();
while (bi.hasNext()) {
Object o = bi.next();
                      if (o instanceof ValueBox) {
                            Value v = ((ValueBox)o).getValue();
if (v.getType().toString().equals(typename) && v instanceof Local)
                                res.put(new Integer(line),v);
                            }
                        } 
                    }
                }
            }
return res;
}

private static int getLineNumber(Stmt s) {
Iterator ti = s.getTags().iterator();
LineNumberTag line = (LineNumberTag) s.getTag("LineNumberTag");
if(line != null)
    return Integer.parseInt(line.toString());
else {
System.out.println("not define line number tag");
return -1;
}
}
}


Does anybody know what is the problem?
Thank you.

Yufeng
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mailman.cs.mcgill.ca/pipermail/soot-list/attachments/20130314/08dfdc6d/attachment-0001.html 


More information about the Soot-list mailing list