more changes...
authorbdemsky <bdemsky>
Thu, 17 Mar 2011 10:01:18 +0000 (10:01 +0000)
committerbdemsky <bdemsky>
Thu, 17 Mar 2011 10:01:18 +0000 (10:01 +0000)
Robust/src/Analysis/Pointer/GraphManip.java
Robust/src/Analysis/Pointer/Pointer.java

index f025061df51605882a3e73cd77e817e58fbc9a0a..d36617f014521782a9eedcdacc7fa13cc8dbaed9 100644 (file)
@@ -4,6 +4,7 @@ import IR.*;
 import Analysis.Pointer.AllocFactory.AllocNode;
 import java.util.*;
 import Analysis.Disjoint.TaintSet;
+import Analysis.Disjoint.Taint;
 
 public class GraphManip {
   static MySet<Edge> genEdges(TempDescriptor tmp, HashSet<AllocNode> dstSet) {
@@ -219,12 +220,17 @@ public class GraphManip {
     return edgeset;
   }
 
-  static MySet<Edge> dereference(Graph graph, Delta delta, TempDescriptor dst, MySet<Edge> srcEdges, FieldDescriptor fd, FlatNode fn) {
+  static MySet<Edge> dereference(Graph graph, Delta delta, TempDescriptor dst, MySet<Edge> srcEdges, FieldDescriptor fd, FlatNode fn, TaintSet taint) {
     MySet<Edge> edgeset=new MySet<Edge>();
     for(Edge edge:srcEdges) {
       TaintSet ts=edge.getTaints();
-      if (ts!=null)
-         ts=ts.reTaint(fn);
+      if (ts!=null) {
+       ts=ts.reTaint(fn);
+       if (taint!=null)
+         ts=ts.merge(taint);
+      } else {
+       ts=taint;
+      }
       MySet<Edge> removeedges=delta.heapedgeremove.get(edge.dst);
       for(Edge e:graph.getEdges(edge.dst)) {
        if (e.fd==fd&&(removeedges==null||!removeedges.contains(e))) {
@@ -255,12 +261,16 @@ public class GraphManip {
     return edgeset;
   }
 
-  static MySet<Edge> diffDereference(Delta delta, TempDescriptor dst, MySet<Edge> srcEdges, FieldDescriptor fd, FlatNode fn) {
+  static MySet<Edge> diffDereference(Delta delta, TempDescriptor dst, MySet<Edge> srcEdges, FieldDescriptor fd, FlatNode fn, TaintSet taint) {
     MySet<Edge> edgeset=new MySet<Edge>();
     for(Edge edge:srcEdges) {
       TaintSet ts=edge.getTaints();
-      if (ts!=null)
-         ts=ts.reTaint(fn);
+      if (ts!=null) {
+       if (taint!=null)
+         ts=ts.merge(taint);
+       ts=ts.reTaint(fn);
+      } else
+       ts=taint;
       MySet<Edge> removeedges=delta.heapedgeremove.get(edge.dst);
       if (delta.baseheapedge.containsKey(edge.dst)) {
        for(Edge e:delta.baseheapedge.get(edge.dst)) {
index 03d4825c257206384712f3d3d3543473dc066200..a274ad6796f0179accbb80d9b75debbbf4972f24 100644 (file)
@@ -9,8 +9,10 @@ import Analysis.Disjoint.Taint;
 import Analysis.Disjoint.TaintSet;
 import Analysis.Disjoint.Canonical;
 import Analysis.CallGraph.CallGraph;
+import Analysis.OoOJava.RBlockRelationAnalysis;
 import java.io.*;
 
+
 public class Pointer {
   HashMap<FlatMethod, BasicBlock> blockMap;
   HashMap<BBlock, Graph> bbgraphMap;
@@ -26,10 +28,13 @@ public class Pointer {
   AllocFactory allocFactory;
   LinkedList<Delta> toprocess;
   TempDescriptor returntmp;
+  RBlockRelationAnalysis taskAnalysis;
 
-  public Pointer(State state, TypeUtil typeUtil, CallGraph callGraph) {
+  public Pointer(State state, TypeUtil typeUtil, CallGraph callGraph, RBlockRelationAnalysis taskAnalysis) {
     this(state, typeUtil);
     this.callGraph=callGraph;
+    this.OoOJava=true;
+    this.taskAnalysis=taskAnalysis;
   }
 
   public Pointer(State state, TypeUtil typeUtil) {
@@ -1365,6 +1370,8 @@ public class Pointer {
     TempDescriptor src;
     FieldDescriptor fd;
     TempDescriptor dst;
+    TaintSet taint=null;
+
     if (node.kind()==FKind.FlatElementNode) {
       FlatElementNode fen=(FlatElementNode) node;
       src=fen.getSrc();
@@ -1376,22 +1383,26 @@ public class Pointer {
       fd=ffn.getField();
       dst=ffn.getDst();
     }
+    if (OoOJava&&taskAnalysis.isPotentialStallSite(node)) {
+      taint=TaintSet.factory(Taint.factory(node,  src, null, null, null));
+    }
+
     //Do nothing for non pointers
     if (!dst.getType().isPtr())
       return delta;
     if (delta.getInit()) {
       MySet<Edge> srcedges=GraphManip.getEdges(graph, delta, src);
-      MySet<Edge> edgesToAdd=GraphManip.dereference(graph, delta, dst, srcedges, fd, node);
+      MySet<Edge> edgesToAdd=GraphManip.dereference(graph, delta, dst, srcedges, fd, node, taint);
       MySet<Edge> edgesToRemove=GraphManip.getEdges(graph, delta, dst);
       updateVarDelta(graph, delta, dst, edgesToAdd, edgesToRemove);
       applyDiffs(graph, delta);
     } else {
       /* First compute new objects we read fields of */
       MySet<Edge> allsrcedges=GraphManip.getEdges(graph, delta, src);
-      MySet<Edge> edgesToAdd=GraphManip.diffDereference(delta, dst, allsrcedges, fd, node);
+      MySet<Edge> edgesToAdd=GraphManip.diffDereference(delta, dst, allsrcedges, fd, node, taint);
       /* Next compute new targets of fields */
       MySet<Edge> newsrcedges=GraphManip.getDiffEdges(delta, src);
-      MySet<Edge> newfdedges=GraphManip.dereference(graph, delta, dst, newsrcedges, fd, node);
+      MySet<Edge> newfdedges=GraphManip.dereference(graph, delta, dst, newsrcedges, fd, node, taint);
 
       /* Compute the union, and then the set of edges */
       Edge.mergeEdgesInto(edgesToAdd, newfdedges);