wala / WALA

T.J. Watson Libraries for Analysis, with frontends for Java, Android, and JavaScript, and may common static program analyses
http://github.com/wala/WALA
Eclipse Public License 2.0
743 stars 221 forks source link

NPE when building ControlDependencyGraph at a method which unique return statement is a throw exception #171

Open ivanpostolski opened 7 years ago

ivanpostolski commented 7 years ago

This issue can be reproduced with the following code snippet as code input

public static void main(String[] args) {
    int x = Integer.parseInt(args[0]);
    for (int h = 0; h < 10; h++) {
        x = exceptionmethod(x);
    }
    System.out.println(x);
}

public static int exceptionmethod(int x) {
    throw new RuntimeException("wala rocks!");
}

And trying to build a backwards slice with the following data/control options

   Collection<Statement> slice = Slicer.computeBackwardSlice(statement, callGraph, pointerAnalysis, Slicer.DataDependenceOptions.NO_EXCEPTIONS, Slicer.ControlDependenceOptions.NO_EXCEPTIONAL_EDGES);
ivanpostolski commented 7 years ago

And this is the exception stack trace, to get a sense of what is going on at runtime

Exception in thread "main" java.lang.NullPointerException at com.ibm.wala.util.graph.dominators.DominanceFrontiers.getDominanceFrontier(DominanceFrontiers.java:50) at com.ibm.wala.cfg.cdg.ControlDependenceGraph.buildControlDependence(ControlDependenceGraph.java:77) at com.ibm.wala.cfg.cdg.ControlDependenceGraph.(ControlDependenceGraph.java:231) at com.ibm.wala.cfg.cdg.ControlDependenceGraph.(ControlDependenceGraph.java:238) at com.ibm.wala.ipa.slicer.PDG.createControlDependenceEdges(PDG.java:248) at com.ibm.wala.ipa.slicer.PDG.createScalarEdges(PDG.java:186) at com.ibm.wala.ipa.slicer.PDG.populate(PDG.java:180) at com.ibm.wala.ipa.slicer.PDG.getNumber(PDG.java:1240) at com.ibm.wala.ipa.slicer.SDGSupergraph.getLocalBlockNumber(SDGSupergraph.java:154) at com.ibm.wala.ipa.slicer.SDGSupergraph.getLocalBlockNumber(SDGSupergraph.java:1) at com.ibm.wala.dataflow.IFDS.BackwardsSupergraph.getLocalBlockNumber(BackwardsSupergraph.java:347) at com.ibm.wala.dataflow.IFDS.TabulationSolver.processParticularCallee(TabulationSolver.java:646) at com.ibm.wala.dataflow.IFDS.TabulationSolver.processCall(TabulationSolver.java:554) at com.ibm.wala.dataflow.IFDS.TabulationSolver.forwardTabulateSLRPs(TabulationSolver.java:279) at com.ibm.wala.dataflow.IFDS.TabulationSolver.solve(TabulationSolver.java:206) at com.ibm.wala.ipa.slicer.Slicer.slice(Slicer.java:205) at com.ibm.wala.ipa.slicer.Slicer.computeSlice(Slicer.java:184) at com.ibm.wala.ipa.slicer.Slicer.computeBackwardSlice(Slicer.java:135)

msridhar commented 7 years ago

Nice one! I will take a look.