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) {
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;
}
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);
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 {
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 {
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 {
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 {