bug fixes
authorbdemsky <bdemsky>
Tue, 22 Mar 2011 22:33:47 +0000 (22:33 +0000)
committerbdemsky <bdemsky>
Tue, 22 Mar 2011 22:33:47 +0000 (22:33 +0000)
Robust/src/Analysis/Pointer/GraphManip.java
Robust/src/Analysis/Pointer/Pointer.java

index 34b3d1bcc9135e19a3717de14e87ba50d9bd55a0..d8c66f8a56116d0d0015c8d5ccdc2cf03da58d84 100644 (file)
@@ -246,19 +246,12 @@ public class GraphManip {
     return edgeset;
   }
 
-  static MySet<Edge> dereference(Graph graph, Delta delta, TempDescriptor dst, MySet<Edge> srcEdges, FieldDescriptor fd, FlatNode fn, TaintSet taint) {
+  static MySet<Edge> dereference(Graph graph, Delta delta, TempDescriptor dst, MySet<Edge> srcEdges, FieldDescriptor fd, FlatNode fn) {
     MySet<Edge> edgeset=new MySet<Edge>();
-    if (taint!=null) {
-      edgeset.addAll(Edge.taintAll(srcEdges, taint));
-    }
     for(Edge edge:srcEdges) {
       TaintSet ts=edge.getTaints();
       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)) {
@@ -290,16 +283,13 @@ public class GraphManip {
     return edgeset;
   }
 
-  static MySet<Edge> diffDereference(Delta delta, TempDescriptor dst, MySet<Edge> srcEdges, FieldDescriptor fd, FlatNode fn, TaintSet taint) {
+  static MySet<Edge> diffDereference(Delta delta, TempDescriptor dst, MySet<Edge> srcEdges, FieldDescriptor fd, FlatNode fn) {
     MySet<Edge> edgeset=new MySet<Edge>();
     for(Edge edge:srcEdges) {
       TaintSet ts=edge.getTaints();
       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 4666894a4466f73081c738dce3c1a592f13f1836..e85a6387c9c86dfc7faaedc6d2e694e8bfc031bb 100644 (file)
@@ -171,7 +171,7 @@ public class Pointer implements HeapAnalysis{
     }
 
     //DEBUG
-    if (false) {
+    if (true) {
       int debugindex=0;
       for(Map.Entry<BBlock, Graph> e:bbgraphMap.entrySet()) {
        Graph g=e.getValue();
@@ -1299,25 +1299,30 @@ public class Pointer implements HeapAnalysis{
       fd=ffn.getField();
       dst=ffn.getDst();
     }
-    //Do nothing for non pointers
-    if (!src.getType().isPtr())
-      return delta;
 
     if (delta.getInit()) {
-      MySet<Edge> srcEdges=GraphManip.getEdges(graph, delta, src);
       MySet<Edge> dstEdges=GraphManip.getEdges(graph, delta, dst);
 
-      if (OoOJava&&!accessible.isAccessible(node, src)) {
-       Taint srcStallTaint=Taint.factory(node,  src, AllocFactory.dummySite, node, ReachGraph.predsEmpty);
-       srcEdges=Edge.taintAll(srcEdges, srcStallTaint);
-       updateVarDelta(graph, delta, src, srcEdges, null);
-      }
-
       if (OoOJava&&!accessible.isAccessible(node, dst)) {
        Taint dstStallTaint=Taint.factory(node,  dst, AllocFactory.dummySite, node, ReachGraph.predsEmpty);
        dstEdges=Edge.taintAll(dstEdges, dstStallTaint);
        updateVarDelta(graph, delta, dst, dstEdges, null);
       }
+      if (OoOJava) {
+       effectsAnalysis.analyzeFlatSetFieldNode(dstEdges, fd, node);
+      }
+
+      //Do nothing for non pointers
+      if (!src.getType().isPtr()) {
+       return delta;
+      }
+
+      MySet<Edge> srcEdges=GraphManip.getEdges(graph, delta, src);
+      if (OoOJava&&!accessible.isAccessible(node, src)) {
+       Taint srcStallTaint=Taint.factory(node,  src, AllocFactory.dummySite, node, ReachGraph.predsEmpty);
+       srcEdges=Edge.taintAll(srcEdges, srcStallTaint);
+       updateVarDelta(graph, delta, src, srcEdges, null);
+      }
 
       MySet<Edge> edgesToAdd=GraphManip.genEdges(dstEdges, fd, srcEdges);
       MySet<Edge> edgesToRemove=null;
@@ -1328,27 +1333,12 @@ public class Pointer implements HeapAnalysis{
       } else
        graph.strongUpdateSet=new MySet<Edge>();
 
-      if (OoOJava) {
-       effectsAnalysis.analyzeFlatSetFieldNode(dstEdges, fd, node);
-      }
-
       /* Update diff */
       updateHeapDelta(graph, delta, edgesToAdd, edgesToRemove);
       applyDiffs(graph, delta);
     } else {
-      /* First look at new sources */
-      MySet<Edge> edgesToAdd=new MySet<Edge>();
-      MySet<Edge> newSrcEdges=GraphManip.getDiffEdges(delta, src);
-      MySet<Edge> srcEdges=GraphManip.getEdges(graph, delta, src);
-      HashSet<AllocNode> dstNodes=GraphManip.getNodes(graph, delta, dst);
       MySet<Edge> newDstEdges=GraphManip.getDiffEdges(delta, dst);
 
-      if (OoOJava&&!accessible.isAccessible(node, src)) {
-       Taint srcStallTaint=Taint.factory(node,  src, AllocFactory.dummySite, node, ReachGraph.predsEmpty);
-       newSrcEdges=Edge.taintAll(newSrcEdges, srcStallTaint);
-       updateVarDelta(graph, delta, src, newSrcEdges, null);
-      }
-
       if (OoOJava&&!accessible.isAccessible(node, dst)) {
        Taint dstStallTaint=Taint.factory(node,  dst, AllocFactory.dummySite, node, ReachGraph.predsEmpty);
        newDstEdges=Edge.taintAll(newDstEdges, dstStallTaint);
@@ -1359,6 +1349,23 @@ public class Pointer implements HeapAnalysis{
        effectsAnalysis.analyzeFlatSetFieldNode(newDstEdges, fd, node);
       }
 
+      if (!src.getType().isPtr()) {
+       return delta;
+      }
+
+      /* Next look at new sources */
+
+      MySet<Edge> edgesToAdd=new MySet<Edge>();
+      MySet<Edge> newSrcEdges=GraphManip.getDiffEdges(delta, src);
+      MySet<Edge> srcEdges=GraphManip.getEdges(graph, delta, src);
+      HashSet<AllocNode> dstNodes=GraphManip.getNodes(graph, delta, dst);
+
+      if (OoOJava&&!accessible.isAccessible(node, src)) {
+       Taint srcStallTaint=Taint.factory(node,  src, AllocFactory.dummySite, node, ReachGraph.predsEmpty);
+       newSrcEdges=Edge.taintAll(newSrcEdges, srcStallTaint);
+       updateVarDelta(graph, delta, src, newSrcEdges, null);
+      }
+
       MySet<Edge> edgesToRemove=null;
       if (newDstEdges.size()!=0) {
        if (dstNodes.size()>1&&!dstNodes.iterator().next().isSummary()&&fd!=null) {
@@ -1460,24 +1467,40 @@ public class Pointer implements HeapAnalysis{
     }
 
     //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, taint);
-      MySet<Edge> edgesToRemove=GraphManip.getEdges(graph, delta, dst);
-      if (OoOJava)
+      if (OoOJava) {
+       if (taint!=null) {
+         srcedges=Edge.taintAll(srcedges, taint);
+         updateVarDelta(graph, delta, src, srcedges, null);
+       }
        effectsAnalysis.analyzeFlatFieldNode(srcedges, fd, node);
+      }
+      if (!dst.getType().isPtr())
+       return delta;
+
+      MySet<Edge> edgesToAdd=GraphManip.dereference(graph, delta, dst, srcedges, fd, node);
+      MySet<Edge> edgesToRemove=GraphManip.getEdges(graph, delta, dst);
 
       updateVarDelta(graph, delta, dst, edgesToAdd, edgesToRemove);
       applyDiffs(graph, delta);
     } else {
+      MySet<Edge> newsrcedges=GraphManip.getDiffEdges(delta, src);
+      if (OoOJava) {
+       if (taint!=null) {
+         newsrcedges=Edge.taintAll(newsrcedges, taint);
+         updateVarDelta(graph, delta, src, newsrcedges, null);
+       }
+       effectsAnalysis.analyzeFlatFieldNode(newsrcedges, fd, node);
+      }
+      if (!dst.getType().isPtr())
+       return delta;
+
       /* 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, taint);
+      MySet<Edge> edgesToAdd=GraphManip.diffDereference(delta, dst, allsrcedges, fd, node);
       /* Next compute new targets of fields */
-      MySet<Edge> newsrcedges=GraphManip.getDiffEdges(delta, src);
-      MySet<Edge> newfdedges=GraphManip.dereference(graph, delta, dst, newsrcedges, fd, node, taint);
+      MySet<Edge> newfdedges=GraphManip.dereference(graph, delta, dst, newsrcedges, fd, node);
 
       /* Compute the union, and then the set of edges */
       Edge.mergeEdgesInto(edgesToAdd, newfdedges);
@@ -1485,8 +1508,6 @@ public class Pointer implements HeapAnalysis{
       /* Compute set of edges to remove */
       MySet<Edge> edgesToRemove=GraphManip.getDiffEdges(delta, dst);      
 
-      if (OoOJava)
-       effectsAnalysis.analyzeFlatFieldNode(newsrcedges, fd, node);
       
       /* Update diff */
       updateVarDelta(graph, delta, dst, edgesToAdd, edgesToRemove);