From 3c772aa7d7d7630cbf6b5056ffb7c21a2fb8ea7a Mon Sep 17 00:00:00 2001 From: bdemsky Date: Mon, 28 Mar 2011 07:28:01 +0000 Subject: [PATCH] have to treat reads of inaccessible variables that are the last node specially... --- Robust/src/Analysis/Pointer/Pointer.java | 55 +++++++++++++++++++++--- 1 file changed, 49 insertions(+), 6 deletions(-) diff --git a/Robust/src/Analysis/Pointer/Pointer.java b/Robust/src/Analysis/Pointer/Pointer.java index 0b1ebc4e..ed5e4f4e 100644 --- a/Robust/src/Analysis/Pointer/Pointer.java +++ b/Robust/src/Analysis/Pointer/Pointer.java @@ -27,6 +27,7 @@ public class Pointer implements HeapAnalysis{ HashMap> callMap; HashMap> returnMap; HashMap> bblivetemps; + HashSet mustProcess; private boolean OoOJava=false; CallGraph callGraph; @@ -65,6 +66,7 @@ public class Pointer implements HeapAnalysis{ this.toprocess=new LinkedList(); ClassDescriptor stringcd=typeUtil.getClass(TypeUtil.ObjectClass); this.returntmp=new TempDescriptor("RETURNVAL", stringcd); + this.mustProcess=new HashSet(); } public EffectsAnalysis getEffectsAnalysis() { @@ -153,7 +155,10 @@ public class Pointer implements HeapAnalysis{ if (isNEEDED(currNode)) graphMap.put(currNode, new Graph(graph)); else { - if (i==0) { + if (i==(nodes.size()-1)&&isINACC(currNode)) { + mustProcess.add(currNode); + graphMap.put(currNode, new Graph(graph)); + } else if (i==0) { //base graph works for us graphMap.put(currNode, new Graph(graph)); } else { @@ -171,7 +176,7 @@ public class Pointer implements HeapAnalysis{ } //DEBUG - if (false) { + if (true) { int debugindex=0; for(Map.Entry e:bbgraphMap.entrySet()) { Graph g=e.getValue(); @@ -180,7 +185,7 @@ public class Pointer implements HeapAnalysis{ } for(FlatMethod fm:blockMap.keySet()) { - System.out.println(fm.printMethod()); + System.out.println(fm.printMethod(accessible.inAccessible)); } for(Map.Entry e:graphMap.entrySet()) { FlatNode fn=e.getKey(); @@ -1344,6 +1349,31 @@ public class Pointer implements HeapAnalysis{ graph.oldNodes.put(node, ispresent); } } + + boolean isINACC(FlatNode node) { + if (!OoOJava) + return false; + switch(node.kind()) { + case FKind.FlatSetFieldNode: { + FlatSetFieldNode n=(FlatSetFieldNode)node; + return !accessible.isAccessible(n, n.getDst()); + } + case FKind.FlatSetElementNode: { + FlatSetElementNode n=(FlatSetElementNode)node; + return !accessible.isAccessible(n, n.getDst()); + } + case FKind.FlatFieldNode: { + FlatFieldNode n=(FlatFieldNode)node; + return !accessible.isAccessible(n, n.getSrc()); + } + case FKind.FlatElementNode: { + FlatElementNode n=(FlatElementNode)node; + return !accessible.isAccessible(n, n.getSrc()); + } + } + return false; + } + Delta processSetFieldElementNode(FlatNode node, Delta delta, Graph graph) { TempDescriptor src; FieldDescriptor fd; @@ -1374,6 +1404,9 @@ public class Pointer implements HeapAnalysis{ //Do nothing for non pointers if (!src.getType().isPtr()) { + if (mustProcess.contains(node)) { + applyDiffs(graph, delta); + } return delta; } @@ -1410,6 +1443,9 @@ public class Pointer implements HeapAnalysis{ } if (!src.getType().isPtr()) { + if (mustProcess.contains(node)) { + applyDiffs(graph, delta); + } return delta; } @@ -1536,8 +1572,12 @@ public class Pointer implements HeapAnalysis{ } effectsAnalysis.analyzeFlatFieldNode(srcedges, fd, node); } - if (!dst.getType().isPtr()) + if (!dst.getType().isPtr()) { + if (mustProcess.contains(node)) { + applyDiffs(graph, delta); + } return delta; + } MySet edgesToAdd=GraphManip.dereference(graph, delta, dst, srcedges, fd, node); MySet edgesToRemove=GraphManip.getEdges(graph, delta, dst); @@ -1553,9 +1593,12 @@ public class Pointer implements HeapAnalysis{ } effectsAnalysis.analyzeFlatFieldNode(newsrcedges, fd, node); } - if (!dst.getType().isPtr()) + if (!dst.getType().isPtr()) { + if (mustProcess.contains(node)) { + applyDiffs(graph, delta); + } return delta; - + } /* First compute new objects we read fields of */ MySet allsrcedges=GraphManip.getEdges(graph, delta, src); MySet edgesToAdd=GraphManip.diffDereference(delta, dst, allsrcedges, fd, node); -- 2.34.1