starting towards taints
authorbdemsky <bdemsky>
Wed, 16 Mar 2011 19:14:06 +0000 (19:14 +0000)
committerbdemsky <bdemsky>
Wed, 16 Mar 2011 19:14:06 +0000 (19:14 +0000)
Robust/src/Analysis/Disjoint/PointerMethod.java
Robust/src/Analysis/Disjoint/TaintSet.java
Robust/src/Analysis/Pointer/Edge.java
Robust/src/Analysis/Pointer/Pointer.java

index c3625e942bf6ff58a72cb09654d3ab69f478f81d..299a677f9a1e3b0d79bbd5f60e57d7d1ca671ee7 100644 (file)
@@ -98,6 +98,7 @@ public class PointerMethod {
     case FKind.FlatSESEEnterNode:
     case FKind.FlatSESEExitNode:
     case FKind.FlatGenReachNode:
+    case FKind.FlatExit:
       return true;
     case FKind.FlatCastNode:
       FlatCastNode fcn=(FlatCastNode)fn;
index 4fda15a04ba0582d298df712c3bdde48fc672936..7e632b18a68ed11befd68c0f1554de573bfda3ed 100644 (file)
@@ -70,6 +70,20 @@ public class TaintSet extends Canonical {
     return out;
   }
 
+  public TaintSet add(Taint t) {
+    TaintSet newt=new TaintSet();
+    newt.taints.addAll(taints);
+    newt.taints.add(t);
+    return (TaintSet) Canonical.makeCanonical(newt);
+  }
+
+  public TaintSet merge(TaintSet ts) {
+    TaintSet newt=new TaintSet();
+    newt.taints.addAll(taints);
+    newt.taints.addAll(ts.taints);
+    return (TaintSet) Canonical.makeCanonical(newt);
+  }
+
   protected TaintSet() {
     taints = new HashSet<Taint>();
   }
index 61fdbb421e2ff58d027cb733f98f07958125c863..94d50884058b776116a170280a198043b4c1ce5c 100644 (file)
@@ -2,6 +2,8 @@ package Analysis.Pointer;
 import IR.Flat.*;
 import IR.*;
 import Analysis.Pointer.AllocFactory.AllocNode;
+import Analysis.Disjoint.Taint;
+import Analysis.Disjoint.TaintSet;
 
 public class Edge {
   FieldDescriptor fd;
@@ -9,6 +11,8 @@ public class Edge {
   TempDescriptor srcvar;
   AllocNode dst;
   int statuspredicate;
+  TaintSet taints;
+
   public static final int SNGSNG=1;
   public static final int SNGSUM=2;
   public static final int SUMSNG=4;
@@ -67,6 +71,15 @@ public class Edge {
     return hashcode;
   }
 
+  public Edge addTaint(Taint t) {
+    Edge newe=copy();
+    if (newe.taints==null)
+      newe.taints=TaintSet.factory(t);
+    else
+      newe.taints=newe.taints.add(t);
+    return newe;
+  }
+
   public boolean equals(Object o) {
     if (o instanceof Edge) {
       Edge e=(Edge) o;
@@ -86,6 +99,8 @@ public class Edge {
     e.srcvar=srcvar;
     e.dst=dst;
     e.statuspredicate=statuspredicate;
+    if (taints!=null)
+      e.taints=taints;
     return e;
   }
 
@@ -94,6 +109,12 @@ public class Edge {
       return this;
     Edge newe=copy();
     newe.statuspredicate=mergeStatus(statuspredicate, e.statuspredicate);
+    if (e.taints!=null) { 
+      if (newe.taints==null)
+       newe.taints=e.taints;
+      else
+       newe.taints=newe.taints.merge(taints);
+    }
     return newe;
   }
 
index fcff4a50be00601138b0321d43422d9910d71ec5..60bed04587799e6001cd38a25e6f54d9b202f1b6 100644 (file)
@@ -5,6 +5,7 @@ import IR.*;
 import Analysis.Liveness;
 import Analysis.Pointer.BasicBlock.BBlock;
 import Analysis.Pointer.AllocFactory.AllocNode;
+import Analysis.Disjoint.Taint;
 import java.io.*;
 
 public class Pointer {
@@ -130,7 +131,7 @@ public class Pointer {
     }
 
     //DEBUG
-    if (false) {
+    if (true) {
       int debugindex=0;
       for(Map.Entry<BBlock, Graph> e:bbgraphMap.entrySet()) {
        Graph g=e.getValue();
@@ -387,6 +388,28 @@ public class Pointer {
     }
   }
 
+  Delta processSESEEnter(FlatSESEEnterNode sese, Delta delta, Graph graph) {
+    for (TempDescriptor tmp:sese.getInVarSet()) {
+      Taint taint=Taint.factory(sese,  null, tmp, null, sese, null);
+      if (delta.getInit()) {
+       MySet<Edge> edges=GraphManip.getEdges(graph, delta, tmp);
+       for(Edge e:edges) {
+         Edge newe=e.addTaint(taint);
+         delta.addVarEdge(newe);
+       }
+      } else {
+       MySet<Edge> edges=GraphManip.getDiffEdges(delta, tmp);
+       for(Edge e:edges) {
+         Edge newe=e.addTaint(taint);
+         delta.addVarEdge(newe);
+       }
+      }
+    }
+    applyDiffs(graph, delta);
+    return delta;
+  }
+  
+
   /* This function compute the edges for the this variable for a
    * callee if it exists. */