From 4fca71c595c622ed936c3f319faf168b760c7649 Mon Sep 17 00:00:00 2001 From: Martin Hecker Date: Mon, 6 Jun 2016 17:41:30 +0200 Subject: [PATCH] some more simple tests for intraprocedurel NullPointerException Analysis --- .../src/cfg/exc/intra/FieldAccess.java | 30 +++++ .../intra/NullPointerExceptionIntraTest.java | 104 ++++++++++++++++++ 2 files changed, 134 insertions(+) diff --git a/com.ibm.wala.core.testdata/src/cfg/exc/intra/FieldAccess.java b/com.ibm.wala.core.testdata/src/cfg/exc/intra/FieldAccess.java index a63da4a5e..37ed5924d 100644 --- a/com.ibm.wala.core.testdata/src/cfg/exc/intra/FieldAccess.java +++ b/com.ibm.wala.core.testdata/src/cfg/exc/intra/FieldAccess.java @@ -11,6 +11,17 @@ package cfg.exc.intra; public class FieldAccess { + static B testParam(boolean unknown, B b1, B b2) { + b1 = null; + return b1; + } + + static B testParam2(boolean unknown, B b1, B b2) { + b1.f = 42; + return b1; + } + + static B testIf(boolean unknown, B b1, B b2) { b1.f = 42; b2.f = 17; @@ -38,6 +49,24 @@ public class FieldAccess { return b3; } + static B testIfContinued(boolean unknown, B b1, B b2, B b4) { + b1.f = 42; + + B b3; + if (unknown) { + b3 = b1; + } else { + b3 = b2; + } + + if (unknown) { + b1.f = 42; + } + + b3.f = 17; + return b2; + } + static B testIf3(boolean unknown, B b1) { if (unknown) { b1.f = 42; @@ -71,6 +100,7 @@ public class FieldAccess { return b3; } + public static void main(String[] args) { diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/cfg/exc/intra/NullPointerExceptionIntraTest.java b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/cfg/exc/intra/NullPointerExceptionIntraTest.java index b26a0bdd2..8aa5ea819 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/cfg/exc/intra/NullPointerExceptionIntraTest.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/cfg/exc/intra/NullPointerExceptionIntraTest.java @@ -85,6 +85,75 @@ public class NullPointerExceptionIntraTest extends WalaTestCase { justThisTest(NullPointerExceptionIntraTest.class); } + @Test + public void testParam() throws UnsoundGraphException, CancelException { + MethodReference mr = StringStuff.makeMethodReference("cfg.exc.intra.FieldAccess.testParam(ZLcfg/exc/intra/B;Lcfg/exc/intra/B;)Lcfg/exc/intra/B"); + + IMethod m = cha.resolveMethod(mr); + AnalysisCache cache = new AnalysisCache(); + IR ir = cache.getIR(m); + final ISSABasicBlock returnNode = returnNode(ir.getControlFlowGraph()); + final int returnVal = returnVal(returnNode); + + { + ExceptionPruningAnalysis intraExplodedCFG = + NullPointerAnalysis.createIntraproceduralExplodedCFGAnalysis(ir); + intraExplodedCFG.compute(new NullProgressMonitor()); + + final IExplodedBasicBlock returnNodeExploded = returnNodeExploded(returnNode, intraExplodedCFG.getCFG()); + final NullPointerState returnState = intraExplodedCFG.getState(returnNodeExploded); + + Assert.assertEquals(State.NULL, returnState.getState(returnVal)); + } + { + ExceptionPruningAnalysis intraSSACFG = + NullPointerAnalysis.createIntraproceduralSSACFGAnalyis(ir); + intraSSACFG.compute(new NullProgressMonitor()); + + Assert.assertEquals(ir.getControlFlowGraph().exit(), intraSSACFG.getCFG().exit()); + Assert.assertEquals(returnNode, returnNode(intraSSACFG.getCFG())); + + final NullPointerState returnState = intraSSACFG.getState(returnNode); + + Assert.assertEquals(State.NULL, returnState.getState(returnVal)); + } + } + + @Test + public void testParam2() throws UnsoundGraphException, CancelException { + MethodReference mr = StringStuff.makeMethodReference("cfg.exc.intra.FieldAccess.testParam2(ZLcfg/exc/intra/B;Lcfg/exc/intra/B;)Lcfg/exc/intra/B"); + + IMethod m = cha.resolveMethod(mr); + AnalysisCache cache = new AnalysisCache(); + IR ir = cache.getIR(m); + final ISSABasicBlock returnNode = returnNode(ir.getControlFlowGraph()); + final int returnVal = returnVal(returnNode); + + { + ExceptionPruningAnalysis intraExplodedCFG = + NullPointerAnalysis.createIntraproceduralExplodedCFGAnalysis(ir); + intraExplodedCFG.compute(new NullProgressMonitor()); + + final IExplodedBasicBlock returnNodeExploded = returnNodeExploded(returnNode, intraExplodedCFG.getCFG()); + final NullPointerState returnState = intraExplodedCFG.getState(returnNodeExploded); + + Assert.assertEquals(State.NOT_NULL, returnState.getState(returnVal)); + } + { + ExceptionPruningAnalysis intraSSACFG = + NullPointerAnalysis.createIntraproceduralSSACFGAnalyis(ir); + intraSSACFG.compute(new NullProgressMonitor()); + + Assert.assertEquals(ir.getControlFlowGraph().exit(), intraSSACFG.getCFG().exit()); + Assert.assertEquals(returnNode, returnNode(intraSSACFG.getCFG())); + + final NullPointerState returnState = intraSSACFG.getState(returnNode); + + Assert.assertEquals(State.NOT_NULL, returnState.getState(returnVal)); + } + } + + @Test public void testIf() throws UnsoundGraphException, CancelException { MethodReference mr = StringStuff.makeMethodReference("cfg.exc.intra.FieldAccess.testIf(ZLcfg/exc/intra/B;Lcfg/exc/intra/B;)Lcfg/exc/intra/B"); @@ -154,7 +223,42 @@ public class NullPointerExceptionIntraTest extends WalaTestCase { Assert.assertNotEquals(State.NULL, returnState.getState(returnVal)); } } + + @Test + public void testIfContinued() throws UnsoundGraphException, CancelException { + MethodReference mr = StringStuff.makeMethodReference("cfg.exc.intra.FieldAccess.testIfContinued(ZLcfg/exc/intra/B;Lcfg/exc/intra/B;Lcfg/exc/intra/B;)Lcfg/exc/intra/B"); + IMethod m = cha.resolveMethod(mr); + AnalysisCache cache = new AnalysisCache(); + IR ir = cache.getIR(m); + final ISSABasicBlock returnNode = returnNode(ir.getControlFlowGraph()); + final int returnVal = returnVal(returnNode); + + { + ExceptionPruningAnalysis intraExplodedCFG = + NullPointerAnalysis.createIntraproceduralExplodedCFGAnalysis(ir); + intraExplodedCFG.compute(new NullProgressMonitor()); + + final IExplodedBasicBlock returnNodeExploded = returnNodeExploded(returnNode, intraExplodedCFG.getCFG()); + final NullPointerState returnState = intraExplodedCFG.getState(returnNodeExploded); + + Assert.assertNotEquals(State.NOT_NULL, returnState.getState(returnVal)); + Assert.assertNotEquals(State.NULL, returnState.getState(returnVal)); + } + { + ExceptionPruningAnalysis intraSSACFG = + NullPointerAnalysis.createIntraproceduralSSACFGAnalyis(ir); + intraSSACFG.compute(new NullProgressMonitor()); + + Assert.assertEquals(ir.getControlFlowGraph().exit(), intraSSACFG.getCFG().exit()); + Assert.assertEquals(returnNode, returnNode(intraSSACFG.getCFG())); + + final NullPointerState returnState = intraSSACFG.getState(returnNode); + + Assert.assertNotEquals(State.NOT_NULL, returnState.getState(returnVal)); + Assert.assertNotEquals(State.NULL, returnState.getState(returnVal)); + } + } @Test public void testIf3() throws UnsoundGraphException, CancelException { MethodReference mr = StringStuff.makeMethodReference("cfg.exc.intra.FieldAccess.testIf3(ZLcfg/exc/intra/B;)Lcfg/exc/intra/B");