diff --git a/.gitignore b/.gitignore index 0b7f9415b..7c68ca731 100644 --- a/.gitignore +++ b/.gitignore @@ -26,6 +26,7 @@ com.ibm.wala.cast.js/lib/ com.ibm.wala.core.testdata/*.jar com.ibm.wala.core.testdata/@dot/ com.ibm.wala.core.testdata/lib/ +com.ibm.wala.core.testdata/ocaml/ com.ibm.wala.core.tests/dat/wala.examples.properties com.ibm.wala.core.tests/report com.ibm.wala.core/@dot diff --git a/com.ibm.wala.core.testdata/src/slice/JustThrow.java b/com.ibm.wala.core.testdata/src/slice/JustThrow.java new file mode 100644 index 000000000..86fb2e680 --- /dev/null +++ b/com.ibm.wala.core.testdata/src/slice/JustThrow.java @@ -0,0 +1,18 @@ +package slice; + +import java.io.IOException; + +public class JustThrow { + + private static int throwException() { + throw new RuntimeException(); + } + public static void main(String[] argv) throws IOException{ + doNothing(throwException()); + } + + private static void doNothing(int x) { + + } + +} \ No newline at end of file diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/slicer/SlicerTest.java b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/slicer/SlicerTest.java index 9fa4aaed4..6ecde3612 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/slicer/SlicerTest.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/slicer/SlicerTest.java @@ -692,6 +692,28 @@ public class SlicerTest { GraphIntegrity.check(sdg); } + @Test + public void testJustThrow() throws ClassHierarchyException, IllegalArgumentException, CancelException, IOException, UnsoundGraphException { + AnalysisScope scope = findOrCreateAnalysisScope(); + + IClassHierarchy cha = findOrCreateCHA(scope); + Iterable entrypoints = com.ibm.wala.ipa.callgraph.impl.Util.makeMainEntrypoints(scope, cha, + TestConstants.SLICE_JUSTTHROW); + AnalysisOptions options = CallGraphTestUtil.makeAnalysisOptions(scope, entrypoints); + + CallGraphBuilder builder = Util.makeZeroOneCFABuilder(options, new AnalysisCache(), cha, scope); + CallGraph cg = builder.makeCallGraph(options, null); + + CGNode main = findMainMethod(cg); + + Statement s = findCallToDoNothing(main); + System.err.println("Statement: " + s); + + Collection slice = Slicer.computeBackwardSlice(s, cg, builder.getPointerAnalysis(), DataDependenceOptions.FULL, + ControlDependenceOptions.NO_EXCEPTIONAL_EDGES); + dumpSlice(slice); + } + public static int countAllocations(Collection slice) { int count = 0; for (Statement s : slice) { diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/util/TestConstants.java b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/util/TestConstants.java index a40a7ddf4..5be76376a 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/util/TestConstants.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/util/TestConstants.java @@ -139,4 +139,6 @@ public interface TestConstants { public final static String SLICE_TESTINETADDR = "Lslice/TestInetAddr"; + public final static String SLICE_JUSTTHROW = "Lslice/JustThrow"; + } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/cfg/PrunedCFG.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/cfg/PrunedCFG.java index ef25b2124..96ea169b2 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/cfg/PrunedCFG.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/cfg/PrunedCFG.java @@ -289,10 +289,8 @@ public class PrunedCFG> extends AbstractNumberedGrap Set reachable = DFS.getReachableNodes(temp, Collections.singleton(cfg.entry())); Set back = DFS.getReachableNodes(GraphInverter.invert(temp), Collections.singleton(cfg.exit())); reachable.retainAll(back); -/** BEGIN Custom change: entry and exit in every cfg */ reachable.add(cfg.entry()); reachable.add(cfg.exit()); -/** END Custom change: entry and exit in every cfg */ this.nodes = new FilteredNodes(cfg, reachable); this.edges = new FilteredCFGEdges(cfg, nodes, filter); diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/PDG.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/PDG.java index 4eec8fa53..3d8bdd11a 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/PDG.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/PDG.java @@ -28,6 +28,7 @@ import com.ibm.wala.ipa.callgraph.propagation.InstanceKey; import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis; import com.ibm.wala.ipa.callgraph.propagation.PointerKey; import com.ibm.wala.ipa.cfg.ExceptionPrunedCFG; +import com.ibm.wala.ipa.cfg.PrunedCFG; import com.ibm.wala.ipa.modref.DelegatingExtendedHeapModel; import com.ibm.wala.ipa.modref.ExtendedHeapModel; import com.ibm.wala.ipa.modref.ModRef; @@ -62,6 +63,7 @@ import com.ibm.wala.util.collections.MapUtil; import com.ibm.wala.util.config.SetOfClasses; import com.ibm.wala.util.debug.Assertions; import com.ibm.wala.util.debug.UnimplementedError; +import com.ibm.wala.util.graph.GraphUtil; import com.ibm.wala.util.graph.NumberedGraph; import com.ibm.wala.util.graph.dominators.Dominators; import com.ibm.wala.util.graph.labeled.SlowSparseNumberedLabeledGraph; @@ -233,14 +235,18 @@ public class PDG implements NumberedGraph { } ControlFlowGraph controlFlowGraph = ir.getControlFlowGraph(); if (cOptions.equals(ControlDependenceOptions.NO_EXCEPTIONAL_EDGES)) { - controlFlowGraph = ExceptionPrunedCFG.make(controlFlowGraph); - // In case the CFG has no nodes left because the only control dependencies - // were - // exceptional, simply return because at this point there are no nodes. + PrunedCFG prunedCFG = ExceptionPrunedCFG.make(controlFlowGraph); + // In case the CFG has only the entry and exit nodes left + // and no edges because the only control dependencies + // were exceptional, simply return because at this point there are no nodes. // Otherwise, later this may raise an Exception. - if (controlFlowGraph.getNumberOfNodes() == 0) { + if (prunedCFG.getNumberOfNodes() == 2 + && prunedCFG.containsNode(controlFlowGraph.entry()) + && prunedCFG.containsNode(controlFlowGraph.exit()) + && GraphUtil.countEdges(prunedCFG) == 0) { return; } + controlFlowGraph = prunedCFG; } else { Assertions.productionAssertion(cOptions.equals(ControlDependenceOptions.FULL)); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/dominators/DominanceFrontiers.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/dominators/DominanceFrontiers.java index ccfac7c07..05d27b114 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/dominators/DominanceFrontiers.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/dominators/DominanceFrontiers.java @@ -47,7 +47,11 @@ public class DominanceFrontiers { } public Iterator getDominanceFrontier(T n) { - return DF.get(n).iterator(); + Set frontier = DF.get(n); + if (frontier == null) { + throw new IllegalArgumentException("no dominance frontier for node " + n); + } + return frontier.iterator(); } public boolean isDominatedBy(T node, T master) {