From 390d65076977769b0555f018244cf46932b3d80a Mon Sep 17 00:00:00 2001 From: bdemsky Date: Thu, 17 Mar 2011 10:01:18 +0000 Subject: [PATCH] more changes... --- Robust/src/Analysis/Pointer/GraphManip.java | 22 +++++++++++++++------ Robust/src/Analysis/Pointer/Pointer.java | 19 ++++++++++++++---- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/Robust/src/Analysis/Pointer/GraphManip.java b/Robust/src/Analysis/Pointer/GraphManip.java index f025061d..d36617f0 100644 --- a/Robust/src/Analysis/Pointer/GraphManip.java +++ b/Robust/src/Analysis/Pointer/GraphManip.java @@ -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 genEdges(TempDescriptor tmp, HashSet dstSet) { @@ -219,12 +220,17 @@ public class GraphManip { return edgeset; } - static MySet dereference(Graph graph, Delta delta, TempDescriptor dst, MySet srcEdges, FieldDescriptor fd, FlatNode fn) { + static MySet dereference(Graph graph, Delta delta, TempDescriptor dst, MySet srcEdges, FieldDescriptor fd, FlatNode fn, TaintSet taint) { MySet edgeset=new MySet(); 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 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 diffDereference(Delta delta, TempDescriptor dst, MySet srcEdges, FieldDescriptor fd, FlatNode fn) { + static MySet diffDereference(Delta delta, TempDescriptor dst, MySet srcEdges, FieldDescriptor fd, FlatNode fn, TaintSet taint) { MySet edgeset=new MySet(); 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 removeedges=delta.heapedgeremove.get(edge.dst); if (delta.baseheapedge.containsKey(edge.dst)) { for(Edge e:delta.baseheapedge.get(edge.dst)) { diff --git a/Robust/src/Analysis/Pointer/Pointer.java b/Robust/src/Analysis/Pointer/Pointer.java index 03d4825c..a274ad67 100644 --- a/Robust/src/Analysis/Pointer/Pointer.java +++ b/Robust/src/Analysis/Pointer/Pointer.java @@ -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 blockMap; HashMap bbgraphMap; @@ -26,10 +28,13 @@ public class Pointer { AllocFactory allocFactory; LinkedList 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 srcedges=GraphManip.getEdges(graph, delta, src); - MySet edgesToAdd=GraphManip.dereference(graph, delta, dst, srcedges, fd, node); + MySet edgesToAdd=GraphManip.dereference(graph, delta, dst, srcedges, fd, node, taint); MySet 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 allsrcedges=GraphManip.getEdges(graph, delta, src); - MySet edgesToAdd=GraphManip.diffDereference(delta, dst, allsrcedges, fd, node); + MySet edgesToAdd=GraphManip.diffDereference(delta, dst, allsrcedges, fd, node, taint); /* Next compute new targets of fields */ MySet newsrcedges=GraphManip.getDiffEdges(delta, src); - MySet newfdedges=GraphManip.dereference(graph, delta, dst, newsrcedges, fd, node); + MySet newfdedges=GraphManip.dereference(graph, delta, dst, newsrcedges, fd, node, taint); /* Compute the union, and then the set of edges */ Edge.mergeEdgesInto(edgesToAdd, newfdedges); -- 2.34.1