compiling again...
authorbdemsky <bdemsky>
Thu, 17 Mar 2011 05:44:05 +0000 (05:44 +0000)
committerbdemsky <bdemsky>
Thu, 17 Mar 2011 05:44:05 +0000 (05:44 +0000)
Robust/src/Analysis/Pointer/Edge.java
Robust/src/Analysis/Pointer/GraphManip.java
Robust/src/Analysis/Pointer/Pointer.java

index c13a7d5da3dc99236e0fa7381d59c446a9e16926..35b7187effdb7f54a1da67489939a1b37af56250 100644 (file)
@@ -4,6 +4,7 @@ import IR.*;
 import Analysis.Pointer.AllocFactory.AllocNode;
 import Analysis.Disjoint.Taint;
 import Analysis.Disjoint.TaintSet;
+import Analysis.Pointer.MySet;
 
 public class Edge {
   FieldDescriptor fd;
@@ -102,6 +103,17 @@ public class Edge {
     return false;
   }
 
+  public Edge changeSrcVar(TempDescriptor tmp) {
+    Edge e=new Edge();
+    e.fd=fd;
+    e.srcvar=srcvar;
+    e.dst=dst;
+    e.statuspredicate=NEW;
+    if (taints!=null)
+      e.taints=taints;
+    return e;
+  }
+
   public Edge copy() {
     Edge e=new Edge();
     e.fd=fd;
@@ -180,4 +192,14 @@ public class Edge {
     e.statuspredicate=val;
     return e;
   }
+
+  public static void mergeEdgesInto(MySet<Edge> orig, MySet<Edge> merge) {
+    for(Edge e:merge) {
+      if (orig.contains(e)) {
+       Edge old=orig.get(e);
+       e=e.merge(old);
+      }
+      orig.add(e);
+    }
+  }
 }
\ No newline at end of file
index ad41bf82be1542f64833d73740b5efea7805e06d..9ee46a88ce88bc9f3d97f452c6dc9a422a35afb5 100644 (file)
@@ -13,6 +13,14 @@ public class GraphManip {
     return edgeset;
   }
 
+  static MySet<Edge> genEdges(TempDescriptor tmp, MySet<Edge> dstSet) {
+    MySet<Edge> edgeset=new MySet<Edge>();
+    for(Edge e:dstSet) {
+      edgeset.add(e.changeSrcVar(tmp));
+    }
+    return edgeset;
+  }
+
   static MySet<Edge> genEdges(HashSet<AllocNode> srcSet, FieldDescriptor fd, HashSet<AllocNode> dstSet) {
     MySet<Edge> edgeset=new MySet<Edge>();
     for(AllocNode srcnode:srcSet) {
@@ -200,6 +208,74 @@ public class GraphManip {
     return edgeset;
   }
 
+  static MySet<Edge> dereference(Graph graph, Delta delta, TempDescriptor dst, MySet<Edge> srcEdges, FieldDescriptor fd) {
+    MySet<Edge> edgeset=new MySet<Edge>();
+    for(Edge edge:srcEdges) {
+      MySet<Edge> removeedges=delta.heapedgeremove.get(edge.dst);
+      for(Edge e:graph.getEdges(edge.dst)) {
+       if (e.fd==fd&&(removeedges==null||!removeedges.contains(e))) {
+         e=e.changeSrcVar(dst);
+         if (!edgeset.contains(e))
+           edgeset.add(e);
+         else {
+           Edge preve=edgeset.get(e);
+           e=e.merge(preve);
+           edgeset.add(e);
+         }
+       }
+      }
+      if (delta.heapedgeadd.containsKey(edge.dst))
+       for(Edge e:delta.heapedgeadd.get(edge.dst)) {
+         if (e.fd==fd) {
+           e=e.changeSrcVar(dst);
+           if (!edgeset.contains(e))
+             edgeset.add(e);
+           else {
+             Edge preve=edgeset.get(e);
+             e=e.merge(preve);
+             edgeset.add(e);
+           }
+         }
+       }
+    }
+    return edgeset;
+  }
+
+  static MySet<Edge> diffDereference(Delta delta, TempDescriptor dst, MySet<Edge> srcEdges, FieldDescriptor fd) {
+    MySet<Edge> edgeset=new MySet<Edge>();
+    for(Edge edge:srcEdges) {
+      MySet<Edge> removeedges=delta.heapedgeremove.get(edge.dst);
+      if (delta.baseheapedge.containsKey(edge.dst)) {
+       for(Edge e:delta.baseheapedge.get(edge.dst)) {
+         if (e.fd==fd&&(removeedges==null||!removeedges.contains(e))) {
+           e=e.changeSrcVar(dst);
+           if (!edgeset.contains(e))
+             edgeset.add(e);
+           else {
+             Edge preve=edgeset.get(e);
+             e=e.merge(preve);
+             edgeset.add(e);
+           }
+         }
+       }
+      }
+      if (delta.heapedgeadd.containsKey(edge.dst))
+       for(Edge e:delta.heapedgeadd.get(edge.dst)) {
+         if (e.fd==fd) {
+           e=e.changeSrcVar(dst);
+           if (!edgeset.contains(e))
+             edgeset.add(e);
+           else {
+             Edge preve=edgeset.get(e);
+             e=e.merge(preve);
+             edgeset.add(e);
+           }
+         }
+       }
+    }
+    return edgeset;
+  }
+
   static HashSet<AllocNode> getNodes(Graph graph, Delta delta, HashSet<AllocNode> srcNodes, FieldDescriptor fd) {
     HashSet<AllocNode> nodes=new HashSet<AllocNode>();
     for(AllocNode node:srcNodes) {
index 50b4974cd9dc52de594b1641e7cd07b27211729e..cca1f9781a51853c3ebd1ac57fde6f182067cba5 100644 (file)
@@ -1339,17 +1339,17 @@ public class Pointer {
       dst=fcn.getDst();
     }
     if (delta.getInit()) {
-      HashSet<AllocNode> srcnodes=GraphManip.getNodes(graph, delta, src);
-      MySet<Edge> edgesToAdd=GraphManip.genEdges(dst, srcnodes);
+      MySet<Edge> srcedges=GraphManip.getEdges(graph, delta, src);
+      MySet<Edge> edgesToAdd=GraphManip.genEdges(dst, srcedges);
       MySet<Edge> edgesToRemove=GraphManip.getEdges(graph, delta, dst);
       updateVarDelta(graph, delta, dst, edgesToAdd, edgesToRemove);
       applyDiffs(graph, delta);
     } else {
       /* First compute new src nodes */
-      HashSet<AllocNode> newSrcNodes=GraphManip.getDiffNodes(delta, src);
+      MySet<Edge> newSrcEdges=GraphManip.getDiffEdges(delta, src);
 
       /* Compute the union, and then the set of edges */
-      MySet<Edge> edgesToAdd=GraphManip.genEdges(dst, newSrcNodes);
+      MySet<Edge> edgesToAdd=GraphManip.genEdges(dst, newSrcEdges);
       
       /* Compute set of edges to remove */
       MySet<Edge> edgesToRemove=GraphManip.getDiffEdges(delta, dst);      
@@ -1380,24 +1380,21 @@ public class Pointer {
     if (!dst.getType().isPtr())
       return delta;
     if (delta.getInit()) {
-      HashSet<AllocNode> srcnodes=GraphManip.getNodes(graph, delta, src);
-      HashSet<AllocNode> fdnodes=GraphManip.getNodes(graph, delta, srcnodes, fd);
-      MySet<Edge> edgesToAdd=GraphManip.genEdges(dst, fdnodes);
+      MySet<Edge> srcedges=GraphManip.getEdges(graph, delta, src);
+      MySet<Edge> edgesToAdd=GraphManip.dereference(graph, delta, dst, srcedges, fd);
       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 */
-      HashSet<AllocNode> allsrcnodes=GraphManip.getNodes(graph, delta, src);
-      HashSet<AllocNode> difffdnodes=GraphManip.getDiffNodes(delta, allsrcnodes, fd);     
+      MySet<Edge> allsrcedges=GraphManip.getEdges(graph, delta, src);
+      MySet<Edge> edgesToAdd=GraphManip.diffDereference(delta, dst, allsrcedges, fd);     
       /* Next compute new targets of fields */
-      HashSet<AllocNode> newsrcnodes=GraphManip.getDiffNodes(delta, src);
-      HashSet<AllocNode> newfdnodes=GraphManip.getNodes(graph, delta, newsrcnodes, fd);
+      MySet<Edge> newsrcedges=GraphManip.getDiffEdges(delta, src);
+      MySet<Edge> newfdedges=GraphManip.dereference(graph, delta, dst, newsrcedges, fd);
+
       /* Compute the union, and then the set of edges */
-      HashSet<AllocNode> newTargets=new HashSet<AllocNode>();
-      newTargets.addAll(newfdnodes);
-      newTargets.addAll(difffdnodes);
-      MySet<Edge> edgesToAdd=GraphManip.genEdges(dst, newTargets);      
+      Edge.mergeEdgesInto(edgesToAdd, newfdedges);
       
       /* Compute set of edges to remove */
       MySet<Edge> edgesToRemove=GraphManip.getDiffEdges(delta, dst);