1 package Analysis.Pointer;
4 import Analysis.Pointer.AllocFactory.AllocNode;
6 import Analysis.Disjoint.TaintSet;
7 import Analysis.Disjoint.Taint;
9 public class GraphManip {
10 static MySet<Edge> genEdges(TempDescriptor tmp, HashSet<AllocNode> dstSet) {
11 MySet<Edge> edgeset=new MySet<Edge>();
12 for(AllocNode node:dstSet) {
13 edgeset.add(new Edge(tmp, node));
18 static MySet<Edge> genEdges(TempDescriptor tmp, MySet<Edge> dstSet) {
19 MySet<Edge> edgeset=new MySet<Edge>();
21 edgeset.add(e.changeSrcVar(tmp, null));
26 static MySet<Edge> genEdges(HashSet<AllocNode> srcSet, FieldDescriptor fd, HashSet<AllocNode> dstSet) {
27 MySet<Edge> edgeset=new MySet<Edge>();
28 for(AllocNode srcnode:srcSet) {
29 for(AllocNode dstnode:dstSet) {
30 edgeset.add(new Edge(srcnode, fd, dstnode, Edge.NEW));
36 static MySet<Edge> genEdges(MySet<Edge> srcSet, FieldDescriptor fd, MySet<Edge> dstSet) {
37 MySet<Edge> edgeset=new MySet<Edge>();
38 for(Edge srcedge:srcSet) {
39 for(Edge dstedge:dstSet) {
40 edgeset.add(dstedge.changeSrc(fd, srcedge.dst));
46 static MySet<Edge> genEdges(HashSet<AllocNode> srcSet, FieldDescriptor fd, MySet<Edge> dstSet) {
47 MySet<Edge> edgeset=new MySet<Edge>();
48 for(AllocNode srcnode:srcSet) {
49 for(Edge dstedge:dstSet) {
50 edgeset.add(dstedge.changeSrc(fd, srcnode));
56 static MySet<Edge> getDiffEdges(Delta delta, TempDescriptor tmp) {
57 MySet<Edge> edges=new MySet<Edge>();
58 MySet<Edge> removeedges=delta.varedgeremove.get(tmp);
60 MySet<Edge> baseedges=delta.basevaredge.get(tmp);
61 if (baseedges!=null) {
62 for(Edge e:baseedges) {
63 if (removeedges==null||!removeedges.contains(e))
67 if (delta.varedgeadd.containsKey(tmp))
68 for(Edge e:delta.varedgeadd.get(tmp)) {
74 static MySet<Edge> getEdges(Graph graph, Delta delta, TempDescriptor tmp) {
75 MySet<Edge> edges=new MySet<Edge>();
76 MySet<Edge> removeedges=delta.varedgeremove.get(tmp);
78 for(Edge e:graph.getEdges(tmp)) {
79 if (removeedges==null||!removeedges.contains(e))
82 if (delta.varedgeadd.containsKey(tmp))
83 for(Edge e:delta.varedgeadd.get(tmp)) {
89 static MySet<Edge> getEdges(Graph graph, Delta delta, MySet<Edge> srcNodes, FieldDescriptor fd) {
90 MySet<Edge> nodes=new MySet<Edge>();
91 for(Edge node:srcNodes) {
92 MySet<Edge> removeedges=delta.heapedgeremove.get(node.dst);
93 for(Edge e:graph.getEdges(node.dst)) {
94 if (e.fd==fd&&(removeedges==null||!removeedges.contains(e)))
97 if (delta.heapedgeadd.containsKey(node.dst))
98 for(Edge e:delta.heapedgeadd.get(node.dst)) {
106 static MySet<Edge> getEdges(Graph graph, Delta delta, HashSet<AllocNode> srcNodes, FieldDescriptor fd) {
107 MySet<Edge> nodes=new MySet<Edge>();
108 for(AllocNode node:srcNodes) {
109 MySet<Edge> removeedges=delta.heapedgeremove.get(node);
110 for(Edge e:graph.getEdges(node)) {
111 if (e.fd==fd&&(removeedges==null||!removeedges.contains(e)))
114 if (delta.heapedgeadd.containsKey(node))
115 for(Edge e:delta.heapedgeadd.get(node)) {
123 static MySet<Edge> getEdges(Graph graph, Delta delta, AllocNode node) {
124 MySet<Edge> nodes=new MySet<Edge>();
125 MySet<Edge> removeedges=delta.heapedgeremove.get(node);
126 for(Edge e:graph.getEdges(node)) {
127 if ((removeedges==null||!removeedges.contains(e)))
130 if (delta.heapedgeadd.containsKey(node))
131 for(Edge e:delta.heapedgeadd.get(node)) {
138 static HashSet<AllocNode> getDiffNodes(Delta delta, TempDescriptor tmp) {
139 HashSet<AllocNode> nodes=new HashSet<AllocNode>();
140 MySet<Edge> removeedges=delta.varedgeremove.get(tmp);
142 MySet<Edge> baseEdges=delta.basevaredge.get(tmp);
145 for(Edge e:baseEdges) {
146 if (removeedges==null||!removeedges.contains(e))
149 if (delta.varedgeadd.containsKey(tmp))
150 for(Edge e:delta.varedgeadd.get(tmp)) {
156 static HashSet<AllocNode> getNodes(Graph graph, Delta delta, TempDescriptor tmp) {
157 HashSet<AllocNode> nodes=new HashSet<AllocNode>();
158 MySet<Edge> removeedges=delta.varedgeremove.get(tmp);
160 for(Edge e:graph.getEdges(tmp)) {
161 if (removeedges==null||!removeedges.contains(e))
164 if (delta.varedgeadd.containsKey(tmp))
165 for(Edge e:delta.varedgeadd.get(tmp)) {
171 static HashSet<AllocNode> getDiffNodes(Delta delta, HashSet<AllocNode> srcNodes, FieldDescriptor fd) {
172 HashSet<AllocNode> nodes=new HashSet<AllocNode>();
173 for(AllocNode node:srcNodes) {
174 MySet<Edge> removeedges=delta.heapedgeremove.get(node);
175 MySet<Edge> baseEdges=delta.baseheapedge.get(node);
177 for(Edge e:baseEdges) {
178 if (e.fd==fd&&(removeedges==null||!removeedges.contains(e)))
181 if (delta.heapedgeadd.containsKey(node))
182 for(Edge e:delta.heapedgeadd.get(node)) {
190 static MySet<Edge> getDiffEdges(Delta delta, HashSet<AllocNode> srcNodes) {
191 MySet<Edge> newedges=new MySet<Edge>();
192 for(Map.Entry<AllocNode, MySet<Edge>> entry:delta.baseheapedge.entrySet()) {
193 AllocNode node=entry.getKey();
194 if (srcNodes.contains(node)) {
195 MySet<Edge> edges=entry.getValue();
196 MySet<Edge> removeedges=delta.heapedgeremove.get(node);
198 if (removeedges==null||!removeedges.contains(e)) {
204 for(Map.Entry<AllocNode, MySet<Edge>> entry:delta.heapedgeadd.entrySet()) {
205 AllocNode node=entry.getKey();
206 if (srcNodes.contains(node)) {
207 MySet<Edge> edges=entry.getValue();
208 newedges.addAll(edges);
214 static MySet<Edge> getDiffEdges(Delta delta, HashSet<AllocNode> srcNodes, FieldDescriptor fd) {
215 MySet<Edge> newedges=new MySet<Edge>();
216 for(Map.Entry<AllocNode, MySet<Edge>> entry:delta.baseheapedge.entrySet()) {
217 AllocNode node=entry.getKey();
218 if (srcNodes.contains(node)) {
219 MySet<Edge> edges=entry.getValue();
220 MySet<Edge> removeedges=delta.heapedgeremove.get(node);
222 if ((removeedges==null||!removeedges.contains(e))&&(e.fd==fd)) {
228 for(Map.Entry<AllocNode, MySet<Edge>> entry:delta.heapedgeadd.entrySet()) {
229 AllocNode node=entry.getKey();
230 if (srcNodes.contains(node)) {
231 MySet<Edge> edges=entry.getValue();
241 static MySet<Edge> makeOld(MySet<Edge> edgesin) {
242 MySet<Edge> edgeset=new MySet<Edge>();
243 for(Edge e:edgesin) {
244 edgeset.add(e.makeOld());
249 static MySet<Edge> dereference(Graph graph, Delta delta, TempDescriptor dst, MySet<Edge> srcEdges, FieldDescriptor fd, FlatNode fn, TaintSet taint) {
250 MySet<Edge> edgeset=new MySet<Edge>();
251 for(Edge edge:srcEdges) {
252 TaintSet ts=edge.getTaints();
260 MySet<Edge> removeedges=delta.heapedgeremove.get(edge.dst);
261 for(Edge e:graph.getEdges(edge.dst)) {
262 if (e.fd==fd&&(removeedges==null||!removeedges.contains(e))) {
263 e=e.changeSrcVar(dst, ts);
264 if (!edgeset.contains(e))
267 Edge preve=edgeset.get(e);
273 if (delta.heapedgeadd.containsKey(edge.dst))
274 for(Edge e:delta.heapedgeadd.get(edge.dst)) {
276 e=e.changeSrcVar(dst, ts);
277 if (!edgeset.contains(e))
280 Edge preve=edgeset.get(e);
290 static MySet<Edge> diffDereference(Delta delta, TempDescriptor dst, MySet<Edge> srcEdges, FieldDescriptor fd, FlatNode fn, TaintSet taint) {
291 MySet<Edge> edgeset=new MySet<Edge>();
292 for(Edge edge:srcEdges) {
293 TaintSet ts=edge.getTaints();
300 MySet<Edge> removeedges=delta.heapedgeremove.get(edge.dst);
301 if (delta.baseheapedge.containsKey(edge.dst)) {
302 for(Edge e:delta.baseheapedge.get(edge.dst)) {
303 if (e.fd==fd&&(removeedges==null||!removeedges.contains(e))) {
304 e=e.changeSrcVar(dst, ts);
305 if (!edgeset.contains(e))
308 Edge preve=edgeset.get(e);
315 if (delta.heapedgeadd.containsKey(edge.dst))
316 for(Edge e:delta.heapedgeadd.get(edge.dst)) {
318 e=e.changeSrcVar(dst, ts);
319 if (!edgeset.contains(e))
322 Edge preve=edgeset.get(e);
332 static HashSet<AllocNode> getNodes(Graph graph, Delta delta, HashSet<AllocNode> srcNodes, FieldDescriptor fd) {
333 HashSet<AllocNode> nodes=new HashSet<AllocNode>();
334 for(AllocNode node:srcNodes) {
335 MySet<Edge> removeedges=delta.heapedgeremove.get(node);
336 for(Edge e:graph.getEdges(node)) {
337 if (e.fd==fd&&(removeedges==null||!removeedges.contains(e)))
340 if (delta.heapedgeadd.containsKey(node))
341 for(Edge e:delta.heapedgeadd.get(node)) {