[Soot-list] patch to make HashMutablePDG not loop forever for figure 5 from cytron's SSA construction paper.

Phil Pratt-Szeliga pcpratts at syr.edu
Wed Apr 4 16:45:50 EDT 2012


Hello,

Here is a patch to make HashMutablePDG not loop forever for figure 5
from cytron's SSA construction paper. I also made a public getter for
m_blockCFG because I need that.

My test case that caused the bug behavior is:

//////////////////////////////////////////////////////////////////////
// CytronFigure5.java
//////////////////////////////////////////////////////////////////////

package edu.syr.pcpratts.symarray.test;

public class CytronFigure5 {

  public void figure5(boolean p, boolean q, boolean r, boolean s, boolean t){
    int i = 1;
    int j = 1;
    int k = 1;
    int l = 1;
    do {
      if(p){
        j = i;
        if(q){
          l = 2;
        } else {
          l = 3;
        }
        ++k;
      } else {
        k += 2;
      }
      System.out.println("i: "+i+" j: "+j+" k: "+k+" l: "+l);
      do {
        if(r){
          l += 4;
        }
      } while(s == false);
      i += 6;
    } while(t == false);
  }
}

////////////////////////////////////////////////////////////
// The patch
////////////////////////////////////////////////////////////

diff --git a/src/soot/toolkits/graph/pdg/HashMutablePDG.java
b/src/soot/toolkits/graph/pdg/HashMutablePDG.java
--- a/src/soot/toolkits/graph/pdg/HashMutablePDG.java
+++ b/src/soot/toolkits/graph/pdg/HashMutablePDG.java
@@ -26,6 +26,8 @@
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Queue;
+import java.util.Set;
+import java.util.HashSet;

 import soot.Body;
 import soot.SootClass;
@@ -36,6 +38,7 @@
 import soot.toolkits.graph.HashMutableEdgeLabelledDirectedGraph;
 import soot.toolkits.graph.UnitGraph;
 import soot.toolkits.graph.pdg.IRegion;
+import soot.toolkits.graph.DirectedGraph;


 /**
@@ -91,7 +94,6 @@
 	protected List<PDGRegion> m_pdgRegions = null;
 	private RegionAnalysis m_regionAnalysis = null;
 	private int m_strongRegionStartID;
-
 	
 	public HashMutablePDG(UnitGraph cfg)
 	{
@@ -126,6 +128,10 @@
 		this.m_startNode.setNode(r);
 		
 	}
+
+  public BlockGraph getBlockGraph(){
+    return m_blockCFG;
+  }
 	
 	/**
 	 * This is the heart of the PDG contruction. It is huge and definitely needs
@@ -153,12 +159,14 @@
 		this.m_startNode = pdgnode;
 		topLevelRegion.setParent(null);
 		
+    Set<Region> processedRegions = new HashSet<Region>();
 		regions2process.add(topLevelRegion);
 		
 		//while there's a (weak) region to process
 		while(!regions2process.isEmpty())
 		{
 			Region r = regions2process.remove(0);
+      processedRegions.add(r);
 			
 			//get the corresponding pdgnode
 			pdgnode = this.m_obj2pdgNode.get(r);
@@ -276,7 +284,9 @@
 					//add the dependency edges
 					this.addEdge(pdgNodeOfA, pdgnodeOfBRegion, "dependency");
 					pdgNodeOfA.addDependent(pdgnodeOfBRegion);
-					regions2process.add(regionOfB);
+          if(!processedRegions.contains(regionOfB)){
+					  regions2process.add(regionOfB);
+          }
 					//now remove b and all the nodes in the same weak region from
the list of dependents
 					copyOfDependents.remove(b);
 					copyOfDependents.removeAll(regionOfB.getBlocks());
@@ -326,7 +336,9 @@
 							//add the dependency edges
 							this.addEdge(pdgnodeOfBRegion, pdgnodeOfdepBRegion, "dependency");
 							pdgnodeOfBRegion.addDependent(pdgnodeOfdepBRegion);
-							regions2process.add(rdepB);
+              if(!processedRegions.contains(rdepB)){
+							  regions2process.add(rdepB);
+              }
 							
 							//now remove all the nodes in the same weak region from the
list of dependents
 							
@@ -371,7 +383,9 @@
 							
 							this.addEdge(pdgnodeOfBRegion, pdgnodeOfdepBRegion, "dependency");
 							pdgnodeOfBRegion.addDependent(pdgnodeOfdepBRegion);
-							regions2process.add(rdepB);
+              if(!processedRegions.contains(rdepB)){
+							  regions2process.add(rdepB);
+              }
 							
 							//now remove all the nodes in the same weak region from the
list of dependents
 							
@@ -686,8 +700,11 @@
 	
 	private static PDGRegion pdgpostorder(PDGNode node, List<PDGRegion> list)
 	{
+    if(node.getVisited()){
+      return null;
+    }
 		node.setVisited(true);
-		
+
 		PDGRegion region = null;
 		if(!node2Region.containsKey(node))
 		{
@@ -696,8 +713,7 @@
 		}
 		else
 			region = node2Region.get(node);
-		
-		
+
 		//If there are children, push the children to the stack
 		List<PDGNode> dependents = node.getDependets();
 		if(!dependents.isEmpty())
@@ -713,12 +729,13 @@
 				{
 					PDGNode body = ((LoopedPDGNode)curNode).getBody();
 					PDGRegion kid = pdgpostorder(body, list);
-					kid.setParent(region);
-					region.addChildRegion(kid);
+          if(kid != null){
+					  kid.setParent(region);
+					  region.addChildRegion(kid);
 					
-					//This sets the node from the old Region into a PDGRegion
-					body.setNode(kid);
-					
+					  //This sets the node from the old Region into a PDGRegion
+					  body.setNode(kid);
+          }
 				}
 				else if(curNode instanceof ConditionalPDGNode)
 				{
@@ -728,12 +745,13 @@
 					{
 						PDGNode child = (PDGNode)condItr.next();
 						PDGRegion kid = pdgpostorder(child, list);
-						kid.setParent(region);
-						region.addChildRegion(kid);
-						//This sets the node from the old Region into a PDGRegion
+            if(kid != null){
+						  kid.setParent(region);
+						  region.addChildRegion(kid);
+						  //This sets the node from the old Region into a PDGRegion

-						child.setNode(kid);
-						
+						  child.setNode(kid);
+						}
 					}

 				}

diff --git a/src/soot/toolkits/graph/pdg/ProgramDependenceGraph.java
b/src/soot/toolkits/graph/pdg/ProgramDependenceGraph.java
--- a/src/soot/toolkits/graph/pdg/ProgramDependenceGraph.java
+++ b/src/soot/toolkits/graph/pdg/ProgramDependenceGraph.java
@@ -22,6 +22,7 @@
 import java.util.List;

 import soot.toolkits.graph.MutableEdgeLabelledDirectedGraph;
+import soot.toolkits.graph.BlockGraph;


 /**
@@ -60,6 +61,8 @@
 	 * @return The root region of the PDG.
 	 */
 	public IRegion GetStartRegion();
+
+  public BlockGraph getBlockGraph();
 	
 	/**
 	 * @return The root node of the PDG, which is essentially the same
as the start region



Phil Pratt-Szeliga
Syracuse University


More information about the Soot-list mailing list