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 {
|
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) {
|
static B testIf(boolean unknown, B b1, B b2) {
|
||||||
b1.f = 42;
|
b1.f = 42;
|
||||||
b2.f = 17;
|
b2.f = 17;
|
||||||
|
@ -38,6 +49,24 @@ public class FieldAccess {
|
||||||
return b3;
|
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) {
|
static B testIf3(boolean unknown, B b1) {
|
||||||
if (unknown) {
|
if (unknown) {
|
||||||
b1.f = 42;
|
b1.f = 42;
|
||||||
|
@ -72,6 +101,7 @@ public class FieldAccess {
|
||||||
return b3;
|
return b3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
|
|
||||||
B b1 = new B();
|
B b1 = new B();
|
||||||
|
|
|
@ -85,6 +85,75 @@ public class NullPointerExceptionIntraTest extends WalaTestCase {
|
||||||
justThisTest(NullPointerExceptionIntraTest.class);
|
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
|
@Test
|
||||||
public void testIf() throws UnsoundGraphException, CancelException {
|
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");
|
MethodReference mr = StringStuff.makeMethodReference("cfg.exc.intra.FieldAccess.testIf(ZLcfg/exc/intra/B;Lcfg/exc/intra/B;)Lcfg/exc/intra/B");
|
||||||
|
@ -155,6 +224,41 @@ public class NullPointerExceptionIntraTest extends WalaTestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@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
|
@Test
|
||||||
public void testIf3() throws UnsoundGraphException, CancelException {
|
public void testIf3() throws UnsoundGraphException, CancelException {
|
||||||
MethodReference mr = StringStuff.makeMethodReference("cfg.exc.intra.FieldAccess.testIf3(ZLcfg/exc/intra/B;)Lcfg/exc/intra/B");
|
MethodReference mr = StringStuff.makeMethodReference("cfg.exc.intra.FieldAccess.testIf3(ZLcfg/exc/intra/B;)Lcfg/exc/intra/B");
|
||||||
|
|
Loading…
Reference in New Issue