some more simple tests for intraprocedurel NullPointerException Analysis
This commit is contained in:
parent
edf4f8ed6f
commit
4fca71c595
|
@ -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) {
|
||||
|
||||
|
|
|
@ -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");
|
||||
|
|
Loading…
Reference in New Issue