some more simple tests for intraprocedurel NullPointerException Analysis

This commit is contained in:
Martin Hecker 2016-06-06 17:41:30 +02:00
parent edf4f8ed6f
commit 4fca71c595
2 changed files with 134 additions and 0 deletions

View File

@ -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) {

View File

@ -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<SSAInstruction, IExplodedBasicBlock> 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<SSAInstruction, ISSABasicBlock> 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<SSAInstruction, IExplodedBasicBlock> 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<SSAInstruction, ISSABasicBlock> 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<SSAInstruction, IExplodedBasicBlock> 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<SSAInstruction, ISSABasicBlock> 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");