another test case for the NullPointerException analysis

This commit is contained in:
Martin Hecker 2016-06-08 14:41:36 +02:00
parent c7f618eb6f
commit 7293d18a89
5 changed files with 100 additions and 9 deletions

View File

@ -7,4 +7,5 @@ package cfg.exc.intra;
public class B {
int f;
B b;
}

View File

@ -98,6 +98,20 @@ public class FieldAccess {
b3 = b1;
}
return b3;
}
public static B testGet(boolean unknown, B b1) {
b1.f = 42;
B b3 = b1.b;
if (unknown) {
b3.f = 17;
} else {
System.out.println();
}
return b3;
}

View File

@ -98,6 +98,20 @@ public class FieldAccessDynamic {
b3 = b1;
}
return b3;
}
public B testGet(boolean unknown, B b1) {
b1.f = 42;
B b3 = b1.b;
if (unknown) {
b3.f = 17;
} else {
System.out.println();
}
return b3;
}

View File

@ -10,26 +10,19 @@
*******************************************************************************/
package com.ibm.wala.core.tests.cfg.exc.inter;
import java.util.Collection;
import java.util.Iterator;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import com.ibm.wala.cfg.ControlFlowGraph;
import com.ibm.wala.cfg.exc.ExceptionPruningAnalysis;
import com.ibm.wala.cfg.exc.InterprocAnalysisResult;
import com.ibm.wala.cfg.exc.NullPointerAnalysis;
import com.ibm.wala.cfg.exc.intra.IntraprocNullPointerAnalysis;
import com.ibm.wala.cfg.exc.intra.NullPointerState;
import com.ibm.wala.cfg.exc.intra.NullPointerState.State;
import com.ibm.wala.classLoader.ClassLoaderFactory;
import com.ibm.wala.classLoader.ClassLoaderFactoryImpl;
import com.ibm.wala.classLoader.IMethod;
import com.ibm.wala.core.tests.callGraph.CallGraphTestUtil;
import com.ibm.wala.core.tests.cfg.exc.intra.NullPointerExceptionIntraTest;
import com.ibm.wala.core.tests.util.TestConstants;
import com.ibm.wala.core.tests.util.WalaTestCase;
import com.ibm.wala.ipa.callgraph.AnalysisCache;
@ -43,9 +36,7 @@ import com.ibm.wala.ipa.callgraph.impl.Util;
import com.ibm.wala.ipa.cha.ClassHierarchy;
import com.ibm.wala.ipa.cha.ClassHierarchyException;
import com.ibm.wala.ssa.IR;
import com.ibm.wala.ssa.ISSABasicBlock;
import com.ibm.wala.ssa.SSAInstruction;
import com.ibm.wala.ssa.SSAReturnInstruction;
import com.ibm.wala.ssa.analysis.IExplodedBasicBlock;
import com.ibm.wala.types.MethodReference;
import com.ibm.wala.util.CancelException;

View File

@ -648,6 +648,77 @@ public class NullPointerExceptionIntraTest extends WalaTestCase {
}
}
@Test
public void testGet() throws UnsoundGraphException, CancelException {
MethodReference mr = StringStuff.makeMethodReference("cfg.exc.intra.FieldAccess.testGet(ZLcfg/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 testDynamicGet() throws UnsoundGraphException, CancelException {
MethodReference mr = StringStuff.makeMethodReference("cfg.exc.intra.FieldAccessDynamic.testGet(ZLcfg/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));
}
}
public static ISSABasicBlock returnNode(ControlFlowGraph<SSAInstruction, ISSABasicBlock> cfg) {
Collection<ISSABasicBlock> returnNodes = cfg.getNormalPredecessors(cfg.exit());