another test case for the NullPointerException analysis
This commit is contained in:
parent
c7f618eb6f
commit
7293d18a89
|
@ -7,4 +7,5 @@ package cfg.exc.intra;
|
|||
|
||||
public class B {
|
||||
int f;
|
||||
B b;
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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());
|
||||
|
|
Loading…
Reference in New Issue