more changes...
[IRC.git] / Robust / src / Analysis / Pointer / GraphManip.java
index 9ee46a88ce88bc9f3d97f452c6dc9a422a35afb5..d36617f014521782a9eedcdacc7fa13cc8dbaed9 100644 (file)
@@ -3,6 +3,8 @@ import IR.Flat.*;
 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) {
@@ -16,7 +18,7 @@ public class GraphManip {
   static MySet<Edge> genEdges(TempDescriptor tmp, MySet<Edge> dstSet) {
     MySet<Edge> edgeset=new MySet<Edge>();
     for(Edge e:dstSet) {
-      edgeset.add(e.changeSrcVar(tmp));
+      edgeset.add(e.changeSrcVar(tmp, null));
     }
     return edgeset;
   }
@@ -31,6 +33,16 @@ public class GraphManip {
     return edgeset;
   }
 
+  static MySet<Edge> genEdges(HashSet<AllocNode> srcSet, FieldDescriptor fd, MySet<Edge> dstSet) {
+    MySet<Edge> edgeset=new MySet<Edge>();
+    for(AllocNode srcnode:srcSet) {
+      for(Edge dstedge:dstSet) {
+       edgeset.add(dstedge.changeSrc(fd, srcnode));
+      }
+    }
+    return edgeset;
+  }
+
   static MySet<Edge> getDiffEdges(Delta delta, TempDescriptor tmp) {
     MySet<Edge> edges=new MySet<Edge>();
     MySet<Edge> removeedges=delta.varedgeremove.get(tmp);
@@ -208,13 +220,21 @@ public class GraphManip {
     return edgeset;
   }
 
-  static MySet<Edge> dereference(Graph graph, Delta delta, TempDescriptor dst, MySet<Edge> srcEdges, FieldDescriptor fd) {
+  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 (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))) {
-         e=e.changeSrcVar(dst);
+         e=e.changeSrcVar(dst, ts);
          if (!edgeset.contains(e))
            edgeset.add(e);
          else {
@@ -227,7 +247,7 @@ public class GraphManip {
       if (delta.heapedgeadd.containsKey(edge.dst))
        for(Edge e:delta.heapedgeadd.get(edge.dst)) {
          if (e.fd==fd) {
-           e=e.changeSrcVar(dst);
+           e=e.changeSrcVar(dst, ts);
            if (!edgeset.contains(e))
              edgeset.add(e);
            else {
@@ -241,14 +261,21 @@ public class GraphManip {
     return edgeset;
   }
 
-  static MySet<Edge> diffDereference(Delta delta, TempDescriptor dst, MySet<Edge> srcEdges, FieldDescriptor fd) {
+  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) {
+       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)) {
          if (e.fd==fd&&(removeedges==null||!removeedges.contains(e))) {
-           e=e.changeSrcVar(dst);
+           e=e.changeSrcVar(dst, ts);
            if (!edgeset.contains(e))
              edgeset.add(e);
            else {
@@ -262,7 +289,7 @@ public class GraphManip {
       if (delta.heapedgeadd.containsKey(edge.dst))
        for(Edge e:delta.heapedgeadd.get(edge.dst)) {
          if (e.fd==fd) {
-           e=e.changeSrcVar(dst);
+           e=e.changeSrcVar(dst, ts);
            if (!edgeset.contains(e))
              edgeset.add(e);
            else {