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>();
20 for(Edge e : dstSet) {
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);
197 for(Edge e : edges) {
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);
221 for(Edge e : edges) {
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();
232 for(Edge e : edges) {
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) {
250 MySet<Edge> edgeset=new MySet<Edge>();
251 for(Edge edge : srcEdges) {
252 TaintSet ts=edge.getTaints();
256 MySet<Edge> removeedges=delta.heapedgeremove.get(edge.dst);
257 for(Edge e : graph.getEdges(edge.dst)) {
258 if (e.fd==fd&&(removeedges==null||!removeedges.contains(e))) {
259 e=e.changeSrcVar(dst, ts);
260 if (!edgeset.contains(e))
263 Edge preve=edgeset.get(e);
269 if (delta.heapedgeadd.containsKey(edge.dst))
270 for(Edge e : delta.heapedgeadd.get(edge.dst)) {
272 e=e.changeSrcVar(dst, ts);
273 if (!edgeset.contains(e))
276 Edge preve=edgeset.get(e);
286 static MySet<Edge> diffDereference(Delta delta, TempDescriptor dst, MySet<Edge> srcEdges, FieldDescriptor fd, FlatNode fn) {
287 MySet<Edge> edgeset=new MySet<Edge>();
288 for(Edge edge : srcEdges) {
289 TaintSet ts=edge.getTaints();
293 MySet<Edge> removeedges=delta.heapedgeremove.get(edge.dst);
294 if (delta.baseheapedge.containsKey(edge.dst)) {
295 for(Edge e : delta.baseheapedge.get(edge.dst)) {
296 if (e.fd==fd&&(removeedges==null||!removeedges.contains(e))) {
297 e=e.changeSrcVar(dst, ts);
298 if (!edgeset.contains(e))
301 Edge preve=edgeset.get(e);
308 if (delta.heapedgeadd.containsKey(edge.dst))
309 for(Edge e : delta.heapedgeadd.get(edge.dst)) {
311 e=e.changeSrcVar(dst, ts);
312 if (!edgeset.contains(e))
315 Edge preve=edgeset.get(e);
325 static HashSet<AllocNode> getNodes(Graph graph, Delta delta, HashSet<AllocNode> srcNodes, FieldDescriptor fd) {
326 HashSet<AllocNode> nodes=new HashSet<AllocNode>();
327 for(AllocNode node : srcNodes) {
328 MySet<Edge> removeedges=delta.heapedgeremove.get(node);
329 for(Edge e : graph.getEdges(node)) {
330 if (e.fd==fd&&(removeedges==null||!removeedges.contains(e)))
333 if (delta.heapedgeadd.containsKey(node))
334 for(Edge e : delta.heapedgeadd.get(node)) {