more bug fixes...
authorbdemsky <bdemsky>
Thu, 10 Mar 2011 09:46:04 +0000 (09:46 +0000)
committerbdemsky <bdemsky>
Thu, 10 Mar 2011 09:46:04 +0000 (09:46 +0000)
Robust/src/Analysis/Pointer/BasicBlock.java
Robust/src/Analysis/Pointer/Delta.java
Robust/src/Analysis/Pointer/Graph.java
Robust/src/Analysis/Pointer/GraphManip.java
Robust/src/Analysis/Pointer/Pointer.java
Robust/src/Analysis/Pointer/Util.java

index 2f6e990317a79b5e59e84fe95409641a4278b506..80e122c408ce220c381c75c8fe26c6f709493f8a 100644 (file)
@@ -63,13 +63,13 @@ public class BasicBlock {
          for(int i=0;i<pm.numNext(fn);i++) {
            FlatNode fnext=pm.getNext(fn,i);
            if (!map.containsKey(fnext)) {
-             map.put(fn, new BBlock());
-             toprocess.add(fn);
+             map.put(fnext, new BBlock());
+             toprocess.add(fnext);
            }
            //link block in
-           if (!block.nextb.contains(map.get(fn))) {
-             block.nextb.add(map.get(fn));
-             map.get(fn).prevb.add(block);
+           if (!block.nextb.contains(map.get(fnext))) {
+             block.nextb.add(map.get(fnext));
+             map.get(fnext).prevb.add(block);
            }
          }
          break;
index e150f02c3943b2aecedf4976c02e33bc77645f03..94d805e0791544b33d1246067a4865f872d8b006 100644 (file)
@@ -60,6 +60,23 @@ public class Delta {
     this.block=block;
   }
 
+  public void print() {
+    System.out.println("----------------------------------------------");
+    System.out.println("baseheapedge empty:"+baseheapedge.isEmpty());
+    System.out.println("basevaredge empty:"+basevaredge.isEmpty());
+    System.out.println("heapedgeadd empty:"+heapedgeadd.isEmpty());
+    System.out.println("heapedgeremove empty:"+heapedgeremove.isEmpty());
+    System.out.println("varedgeadd empty:"+varedgeadd.isEmpty());
+    if (varedgeremove==null)
+      System.out.println("varedge remove: null");
+    else
+      System.out.println("varedgeremove empty:"+varedgeremove.isEmpty());
+    System.out.println("baseNodeAges empty:"+baseNodeAges.isEmpty());
+    System.out.println("addNodeAges empty:"+addNodeAges.isEmpty());
+    System.out.println("baseOldNodes empty:"+baseOldNodes.isEmpty());
+    System.out.println("addOldNodes empty:"+addOldNodes.isEmpty());
+  }
+
   private Delta() {
   }
 
index 6ad79aaae17aabc2d7f82c28df434e47ff021692..3fcfdab2a5be9f7c5b7d0d3ca803908073aedecb 100644 (file)
@@ -71,11 +71,15 @@ public class Graph {
       MySet<Edge> edges=varMap.get(old.srcvar);
       if (edges==null)
        edges=parent.varMap.get(old.srcvar);
+      if (edges==null)
+       return null;
       return edges.get(old);
     } else {
       MySet<Edge> edges=nodeMap.get(old.src);
       if (edges==null)
        edges=parent.nodeMap.get(old.src);
+      if (edges==null)
+       return null;
       return edges.get(old);
     }
   }
index ea998fae5f78f95e19550fbb79ffb5424712612b..163e958146a517f51103635ca209d526a5d811c6 100644 (file)
@@ -125,10 +125,12 @@ public class GraphManip {
     HashSet<AllocNode> nodes=new HashSet<AllocNode>();
     for(AllocNode node:srcNodes) {
       MySet<Edge> removeedges=delta.heapedgeremove.get(node);
-      for(Edge e:delta.baseheapedge.get(node)) {
-       if (e.fd==fd&&(removeedges==null||!removeedges.contains(e)))
-         nodes.add(e.dst);
-      }
+      MySet<Edge> baseEdges=delta.baseheapedge.get(node);
+      if (baseEdges!=null)
+       for(Edge e:baseEdges) {
+         if (e.fd==fd&&(removeedges==null||!removeedges.contains(e)))
+           nodes.add(e.dst);
+       }
       if (delta.heapedgeadd.containsKey(node))
        for(Edge e:delta.heapedgeadd.get(node)) {
          if (e.fd==fd)
index 0c73bd53ab01d6228a18008f202f4276af0c189e..a0b8441f4af2df181a52f8d886fd962741305c6c 100644 (file)
@@ -57,9 +57,9 @@ public class Pointer {
 
   public void doAnalysis() {
     toprocess.add(buildInitialContext());
-
     while(!toprocess.isEmpty()) {
       Delta delta=toprocess.remove();
+      delta.print();
       PPoint ppoint=delta.getBlock();
       BBlock bblock=ppoint.getBBlock();
       Vector<FlatNode> nodes=bblock.nodes();
@@ -245,7 +245,6 @@ public class Pointer {
     /* Now we need to propagate newdelta */
     if (!newDelta.heapedgeadd.isEmpty()||!newDelta.heapedgeremove.isEmpty()||!newDelta.varedgeadd.isEmpty()||!newDelta.addNodeAges.isEmpty()||!newDelta.addOldNodes.isEmpty()) {
       /* We have a delta to propagate */
-
       if (returnMap.containsKey(bblock)) {
        //exit of call block
        boolean first=true;
@@ -292,6 +291,7 @@ public class Pointer {
       return processSetFieldElementNode(node, delta, newgraph);
     case FKind.FlatMethod:
     case FKind.FlatExit:
+    case FKind.FlatBackEdge:
     case FKind.FlatGenReachNode:
       return processFlatNop(node, delta, newgraph);
     case FKind.FlatCall:
@@ -789,8 +789,10 @@ public class Pointer {
       } else {
        //Generate diff from parent graph
        MySet<Edge> parentedges=graph.parent.nodeMap.get(node);
-       MySet<Edge> newedgeset=Util.setSubtract(parentedges, edgestoremove);
-       graph.nodeMap.put(node, newedgeset);
+       if (parentedges!=null) {
+         MySet<Edge> newedgeset=Util.setSubtract(parentedges, edgestoremove);
+         graph.nodeMap.put(node, newedgeset);
+       }
       }
     }
 
index c0573003c47b88615707abd22eb77d646ebf9451..c7bd09fbdc79e7a8a434b5cfe3b180fa59ac84cb 100644 (file)
@@ -19,7 +19,8 @@ public class Util {
        map.get(key).removeAll(toremove);
       map.get(key).addAll(toadd);
     } else {
-      map.put(key, (MySet<V>) toadd.clone());
+      if (toadd!=null)
+       map.put(key, (MySet<V>) toadd.clone());
     }
   }