add standard type parameter to most pointer analysis references. When it breaks we move back to ? extends InstanceKey.

This commit is contained in:
Juergen Graf 2014-05-20 22:00:06 +02:00
parent fad9e87654
commit 4772f36d47
40 changed files with 143 additions and 123 deletions

View File

@ -40,6 +40,8 @@ import com.ibm.wala.classLoader.SourceFileModule;
import com.ibm.wala.client.AbstractAnalysisEngine;
import com.ibm.wala.ipa.callgraph.CGNode;
import com.ibm.wala.ipa.callgraph.CallGraph;
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
import com.ibm.wala.ipa.cha.IClassHierarchy;
import com.ibm.wala.properties.WalaProperties;
import com.ibm.wala.ssa.IR;
@ -344,8 +346,8 @@ public abstract class IRTests {
protected abstract AbstractAnalysisEngine getAnalysisEngine(String[] mainClassDescriptors, Collection<String> sources, List<String> libs);
public Pair runTest(Collection<String> sources, List<String> libs, String[] mainClassDescriptors, List<? extends IRAssertion> ca,
boolean assertReachable) {
public Pair<CallGraph, PointerAnalysis<InstanceKey>> runTest(Collection<String> sources, List<String> libs,
String[] mainClassDescriptors, List<? extends IRAssertion> ca, boolean assertReachable) {
AbstractAnalysisEngine engine = getAnalysisEngine(mainClassDescriptors, sources, libs);
CallGraph callGraph;

View File

@ -379,13 +379,13 @@ public abstract class JavaIRTests extends IRTests {
}
@Test public void testInnerClassA() {
Pair x = runTest(singleTestSrc(), rtJar, simpleTestEntryPoint(), new ArrayList<IRAssertion>(), true);
Pair<CallGraph, PointerAnalysis<InstanceKey>> x =
runTest(singleTestSrc(), rtJar, simpleTestEntryPoint(), new ArrayList<IRAssertion>(), true);
// can't do an IRAssertion() -- we need the pointer analysis
CallGraph cg = (CallGraph) x.fst;
@SuppressWarnings("unchecked")
PointerAnalysis<? extends InstanceKey> pa = (PointerAnalysis<? extends InstanceKey>) x.snd;
CallGraph cg = x.fst;
PointerAnalysis<InstanceKey> pa = x.snd;
Iterator<CGNode> iter = cg.iterator();
while ( iter.hasNext() ) {
@ -438,13 +438,13 @@ public abstract class JavaIRTests extends IRTests {
}
@Test public void testInnerClassSuper() {
Pair x = runTest(singleTestSrc(), rtJar, simpleTestEntryPoint(), new ArrayList<IRAssertion>(), true);
Pair<CallGraph, PointerAnalysis<InstanceKey>> x =
runTest(singleTestSrc(), rtJar, simpleTestEntryPoint(), new ArrayList<IRAssertion>(), true);
// can't do an IRAssertion() -- we need the pointer analysis
CallGraph cg = (CallGraph) x.fst;
@SuppressWarnings("unchecked")
PointerAnalysis<? extends InstanceKey> pa = (PointerAnalysis<? extends InstanceKey>) x.snd;
CallGraph cg = x.fst;
PointerAnalysis<InstanceKey> pa = x.snd;
Iterator<CGNode> iter = cg.iterator();
while ( iter.hasNext() ) {
@ -596,10 +596,10 @@ public abstract class JavaIRTests extends IRTests {
}
@Test public void testMiniaturSliceBug() throws IllegalArgumentException, CancelException {
Pair<?, ?> x = runTest(singleTestSrc(), rtJar, simpleTestEntryPoint(), emptyList, true);
Pair<CallGraph, PointerAnalysis<InstanceKey>> x = runTest(singleTestSrc(), rtJar, simpleTestEntryPoint(), emptyList, true);
PointerAnalysis pa = (PointerAnalysis) x.snd;
CallGraph cg = (CallGraph) x.fst;
PointerAnalysis<InstanceKey> pa = x.snd;
CallGraph cg = x.fst;
// test partial slice
MethodReference sliceRootRef = getSliceRootReference("MiniaturSliceBug", "validNonDispatchedCall", "(LIntWrapper;)V");

View File

@ -17,6 +17,7 @@ import com.ibm.wala.cast.java.ssa.AstJavaInstructionVisitor;
import com.ibm.wala.cast.java.ssa.AstJavaInvokeInstruction;
import com.ibm.wala.cast.java.ssa.EnclosingObjectReference;
import com.ibm.wala.ipa.callgraph.CGNode;
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
import com.ibm.wala.ipa.callgraph.propagation.PointerKey;
import com.ibm.wala.ipa.modref.ExtendedHeapModel;
@ -28,7 +29,7 @@ public class AstJavaModRef extends AstModRef {
implements AstJavaInstructionVisitor
{
protected AstJavaRefVisitor(CGNode n, Collection<PointerKey> result, PointerAnalysis pa, ExtendedHeapModel h) {
protected AstJavaRefVisitor(CGNode n, Collection<PointerKey> result, PointerAnalysis<InstanceKey> pa, ExtendedHeapModel h) {
super(n, result, pa, h);
}
@ -45,7 +46,7 @@ public class AstJavaModRef extends AstModRef {
}
@Override
protected RefVisitor makeRefVisitor(CGNode n, Collection<PointerKey> result, PointerAnalysis pa, ExtendedHeapModel h) {
protected RefVisitor makeRefVisitor(CGNode n, Collection<PointerKey> result, PointerAnalysis<InstanceKey> pa, ExtendedHeapModel h) {
return new AstJavaRefVisitor(n, result, pa, h);
}
@ -54,7 +55,7 @@ public class AstJavaModRef extends AstModRef {
implements AstJavaInstructionVisitor
{
protected AstJavaModVisitor(CGNode n, Collection<PointerKey> result, ExtendedHeapModel h, PointerAnalysis pa) {
protected AstJavaModVisitor(CGNode n, Collection<PointerKey> result, ExtendedHeapModel h, PointerAnalysis<InstanceKey> pa) {
super(n, result, h, pa);
}
@ -71,7 +72,7 @@ public class AstJavaModRef extends AstModRef {
}
@Override
protected ModVisitor makeModVisitor(CGNode n, Collection<PointerKey> result, PointerAnalysis pa, ExtendedHeapModel h, boolean ignoreAllocHeapDefs) {
protected ModVisitor makeModVisitor(CGNode n, Collection<PointerKey> result, PointerAnalysis<InstanceKey> pa, ExtendedHeapModel h, boolean ignoreAllocHeapDefs) {
return new AstJavaModVisitor(n, result, h, pa);
}

View File

@ -21,6 +21,7 @@ import com.ibm.wala.cast.java.ipa.modref.AstJavaModRef;
import com.ibm.wala.ipa.callgraph.CGNode;
import com.ibm.wala.ipa.callgraph.CallGraph;
import com.ibm.wala.ipa.callgraph.impl.PartialCallGraph;
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
import com.ibm.wala.ipa.slicer.NormalStatement;
import com.ibm.wala.ipa.slicer.SDG;
@ -111,7 +112,7 @@ public class AstJavaSlicer extends Slicer {
});
}
public static Pair<Collection<Statement>, SDG> computeAssertionSlice(CallGraph CG, PointerAnalysis pa,
public static Pair<Collection<Statement>, SDG> computeAssertionSlice(CallGraph CG, PointerAnalysis<InstanceKey> pa,
Collection<CGNode> partialRoots, boolean multiThreadedCode) throws IllegalArgumentException, CancelException {
CallGraph pcg = PartialCallGraph.make(CG, new LinkedHashSet<CGNode>(partialRoots));
SDG sdg = new SDG(pcg, pa, new AstJavaModRef(), DataDependenceOptions.FULL, ControlDependenceOptions.FULL);

View File

@ -28,6 +28,7 @@ import com.ibm.wala.cast.js.translator.CAstRhinoTranslatorFactory;
import com.ibm.wala.ipa.callgraph.CGNode;
import com.ibm.wala.ipa.callgraph.CallGraph;
import com.ibm.wala.ipa.callgraph.CallGraphBuilderCancelException;
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
import com.ibm.wala.ipa.cha.ClassHierarchyException;
import com.ibm.wala.util.NullProgressMonitor;
@ -59,7 +60,7 @@ public class HTMLCGBuilder {
public JSCFABuilder builder;
/** pointer analysis results; partial if {@link #construction_time} is {@code -1} */
public PointerAnalysis pa;
public PointerAnalysis<InstanceKey> pa;
/** call graph; partial if {@link #construction_time} is {@code -1} */
public CallGraph cg;

View File

@ -18,6 +18,7 @@ import org.junit.Test;
import com.ibm.wala.cast.js.ipa.callgraph.JSCFABuilder;
import com.ibm.wala.cast.js.translator.CAstRhinoTranslatorFactory;
import com.ibm.wala.cast.js.util.Util;
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
import com.ibm.wala.ipa.callgraph.propagation.PropagationCallGraphBuilder;
import com.ibm.wala.util.CancelException;
@ -39,7 +40,7 @@ public class TestSimpleCallGraphShapeRhino extends TestSimpleCallGraphShape {
public void test214631() throws IOException, IllegalArgumentException, CancelException, WalaException {
JSCFABuilder b = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "214631.js");
b.makeCallGraph(b.getOptions());
PointerAnalysis PA = b.getPointerAnalysis();
PointerAnalysis<InstanceKey> PA = b.getPointerAnalysis();
// just make sure this does not crash
}

View File

@ -31,6 +31,7 @@ import com.ibm.wala.cast.js.translator.CAstRhinoTranslatorFactory;
import com.ibm.wala.classLoader.SourceFileModule;
import com.ibm.wala.classLoader.SourceModule;
import com.ibm.wala.ipa.callgraph.CallGraph;
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
import com.ibm.wala.ipa.cha.ClassHierarchyException;
import com.ibm.wala.util.CancelException;
@ -57,7 +58,7 @@ public class JsViewerDriver extends JSCallGraphBuilderUtil {
builder.setBaseURL(url);
CallGraph cg = builder.makeCallGraph(builder.getOptions());
PointerAnalysis pa = builder.getPointerAnalysis();
PointerAnalysis<InstanceKey> pa = builder.getPointerAnalysis();
new JsViewer(cg, pa);
}

View File

@ -369,7 +369,7 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph
protected PropagationSystem makeSystem(AnalysisOptions options) {
return new PropagationSystem(callGraph, pointerKeyFactory, instanceKeyFactory) {
@Override
public PointerAnalysis makePointerAnalysis(PropagationCallGraphBuilder builder) {
public PointerAnalysis<InstanceKey> makePointerAnalysis(PropagationCallGraphBuilder builder) {
return new JSPointerAnalysisImpl(builder, cg, pointsToMap, instanceKeys, pointerKeyFactory, instanceKeyFactory);
}
};

View File

@ -37,12 +37,12 @@ public class JsPaPanel extends PaPanel {
private MutableMapping<List<ObjectPropertyCatalogKey>> instanceKeyIdToObjectPropertyCatalogKey = MutableMapping.<List<ObjectPropertyCatalogKey>> make();
private List<AstGlobalPointerKey> globalsPointerKeys = new ArrayList<AstGlobalPointerKey>();
public JsPaPanel(CallGraph cg, PointerAnalysis pa) {
public JsPaPanel(CallGraph cg, PointerAnalysis<InstanceKey> pa) {
super(cg, pa);
initDataStructures(pa);
}
private void initDataStructures(PointerAnalysis pa) {
private void initDataStructures(PointerAnalysis<InstanceKey> pa) {
HeapGraph heapGraph = pa.getHeapGraph();
OrdinalSetMapping<InstanceKey> instanceKeyMapping = pa.getInstanceKeyMapping();
for (Object n : heapGraph){

View File

@ -11,6 +11,7 @@
package com.ibm.wala.cast.js.vis;
import com.ibm.wala.ipa.callgraph.CallGraph;
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
import com.ibm.wala.viz.viewer.PaPanel;
import com.ibm.wala.viz.viewer.WalaViewer;
@ -19,12 +20,12 @@ public class JsViewer extends WalaViewer{
private static final long serialVersionUID = 1L;
public JsViewer(CallGraph cg, PointerAnalysis pa) {
public JsViewer(CallGraph cg, PointerAnalysis<InstanceKey> pa) {
super(cg, pa);
}
@Override
protected PaPanel createPaPanel(CallGraph cg, PointerAnalysis pa) {
protected PaPanel createPaPanel(CallGraph cg, PointerAnalysis<InstanceKey> pa) {
return new JsPaPanel(cg, pa);
}
}

View File

@ -26,6 +26,7 @@ import com.ibm.wala.ipa.callgraph.AnalysisCache;
import com.ibm.wala.ipa.callgraph.AnalysisScope;
import com.ibm.wala.ipa.callgraph.CGNode;
import com.ibm.wala.ipa.callgraph.CallGraph;
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
import com.ibm.wala.ipa.callgraph.propagation.PointerKey;
import com.ibm.wala.ssa.IR;
@ -98,7 +99,7 @@ public class CAstCallGraphUtil {
return result;
}
public static void dumpCG(PointerAnalysis PA, CallGraph CG) {
public static void dumpCG(PointerAnalysis<InstanceKey> PA, CallGraph CG) {
if (AVOID_DUMP)
return;
for (Iterator x = CG.iterator(); x.hasNext();) {

View File

@ -77,7 +77,7 @@ public abstract class CrossLanguageSSAPropagationCallGraphBuilder extends AstSSA
protected PropagationSystem makeSystem(AnalysisOptions options) {
return new PropagationSystem(callGraph, pointerKeyFactory, instanceKeyFactory) {
@Override
public PointerAnalysis makePointerAnalysis(PropagationCallGraphBuilder builder) {
public PointerAnalysis<InstanceKey> makePointerAnalysis(PropagationCallGraphBuilder builder) {
assert builder == CrossLanguageSSAPropagationCallGraphBuilder.this;
return new CrossLanguagePointerAnalysisImpl(CrossLanguageSSAPropagationCallGraphBuilder.this, cg, pointsToMap,
instanceKeys, pointerKeyFactory, instanceKeyFactory);

View File

@ -36,15 +36,15 @@ import com.ibm.wala.util.intset.OrdinalSet;
*/
public class LexicalModRef {
public static LexicalModRef make(CallGraph cg, PointerAnalysis pa) {
public static LexicalModRef make(CallGraph cg, PointerAnalysis<InstanceKey> pa) {
return new LexicalModRef(cg, pa);
}
private final CallGraph cg;
private final PointerAnalysis pa;
private final PointerAnalysis<InstanceKey> pa;
protected LexicalModRef(CallGraph cg, PointerAnalysis pa) {
protected LexicalModRef(CallGraph cg, PointerAnalysis<InstanceKey> pa) {
this.cg = cg;
this.pa = pa;
}

View File

@ -23,6 +23,7 @@ import com.ibm.wala.cast.ir.ssa.AstLexicalWrite;
import com.ibm.wala.cast.ir.ssa.EachElementGetInstruction;
import com.ibm.wala.cast.ir.ssa.EachElementHasNextInstruction;
import com.ibm.wala.ipa.callgraph.CGNode;
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
import com.ibm.wala.ipa.callgraph.propagation.PointerKey;
import com.ibm.wala.ipa.modref.ExtendedHeapModel;
@ -35,7 +36,7 @@ public class AstModRef extends ModRef {
implements AstInstructionVisitor
{
protected AstRefVisitor(CGNode n, Collection<PointerKey> result, PointerAnalysis pa, ExtendedHeapModel h) {
protected AstRefVisitor(CGNode n, Collection<PointerKey> result, PointerAnalysis<InstanceKey> pa, ExtendedHeapModel h) {
super(n, result, pa, h);
}
@ -86,7 +87,7 @@ public class AstModRef extends ModRef {
}
@Override
protected RefVisitor makeRefVisitor(CGNode n, Collection<PointerKey> result, PointerAnalysis pa, ExtendedHeapModel h) {
protected RefVisitor makeRefVisitor(CGNode n, Collection<PointerKey> result, PointerAnalysis<InstanceKey> pa, ExtendedHeapModel h) {
return new AstRefVisitor(n, result, pa, h);
}
@ -95,7 +96,7 @@ public class AstModRef extends ModRef {
implements AstInstructionVisitor
{
protected AstModVisitor(CGNode n, Collection<PointerKey> result, ExtendedHeapModel h, PointerAnalysis pa) {
protected AstModVisitor(CGNode n, Collection<PointerKey> result, ExtendedHeapModel h, PointerAnalysis<InstanceKey> pa) {
super(n, result, h, pa, true);
}
@ -146,7 +147,7 @@ public class AstModRef extends ModRef {
}
@Override
protected ModVisitor makeModVisitor(CGNode n, Collection<PointerKey> result, PointerAnalysis pa, ExtendedHeapModel h, boolean ignoreAllocHeapDefs) {
protected ModVisitor makeModVisitor(CGNode n, Collection<PointerKey> result, PointerAnalysis<InstanceKey> pa, ExtendedHeapModel h, boolean ignoreAllocHeapDefs) {
return new AstModVisitor(n, result, h, pa);
}

View File

@ -254,7 +254,7 @@ public class CallGraphTest extends WalaTestCase {
AnalysisCache cache = new AnalysisCache();
CallGraphBuilder builder = Util.makeZeroOneContainerCFABuilder(options, cache, cha, scope);
CallGraph cg = builder.makeCallGraph(options, null);
PointerAnalysis pa = builder.getPointerAnalysis();
PointerAnalysis<InstanceKey> pa = builder.getPointerAnalysis();
CGNode mainMethod = AbstractPtrTest.findMainMethod(cg);
PointerKey keyToQuery = AbstractPtrTest.getParam(mainMethod, "testThisVar", pa.getHeapModel());
OrdinalSet<InstanceKey> pointsToSet = pa.getPointsToSet(keyToQuery);

View File

@ -63,7 +63,7 @@ public class TunedRefinementTest extends AbstractPtrTest {
// we know this one fails...
// @Test public void testOnTheFlyCS() throws ClassHierarchyException {
// String mainClass = TestInfo.TEST_ONTHEFLY_CS;
// final IDemandPointerAnalysis dmp =
// final IDemandPointerAnalysis<InstanceKey> dmp =
// makeDemandPointerAnalysis(TestInfo.SCOPE_FILE, mainClass);
// CGNode testMethod =
// AbstractPtrTest.findInstanceMethod(dmp.getBaseCallGraph(),

View File

@ -65,7 +65,7 @@ public class MultiDimArrayTest extends WalaTestCase {
CallGraphBuilder builder = Util.makeVanillaZeroOneCFABuilder(options, new AnalysisCache(),cha, scope);
CallGraph cg = builder.makeCallGraph(options, null);
PointerAnalysis pa = builder.getPointerAnalysis();
PointerAnalysis<InstanceKey> pa = builder.getPointerAnalysis();
System.err.println(pa);
CGNode node = findDoNothingNode(cg);

View File

@ -48,7 +48,7 @@ public class TypeBasedArrayAliasTest extends WalaTestCase {
// RTA yields a TypeBasedPointerAnalysis
CallGraphBuilder builder = Util.makeRTABuilder(options, new AnalysisCache(),cha, scope);
CallGraph cg = builder.makeCallGraph(options, null);
PointerAnalysis pa = builder.getPointerAnalysis();
PointerAnalysis<InstanceKey> pa = builder.getPointerAnalysis();
CGNode node = findNode(cg, "testMayAlias1");
PointerKey pk1 = pa.getHeapModel().getPointerKeyForLocal(node, 1);
@ -77,7 +77,7 @@ public class TypeBasedArrayAliasTest extends WalaTestCase {
return null;
}
private static boolean mayAliased(PointerKey pk1, PointerKey pk2, PointerAnalysis pa) {
private static boolean mayAliased(PointerKey pk1, PointerKey pk2, PointerAnalysis<InstanceKey> pa) {
OrdinalSet<InstanceKey> ptsTo1 = pa.getPointsToSet(pk1);
OrdinalSet<InstanceKey> ptsTo2 = pa.getPointsToSet(pk2);
boolean foundIntersection = false;

View File

@ -52,7 +52,7 @@ public class ZeroLengthArrayTest {
CallGraphBuilder builder = Util.makeVanillaZeroOneCFABuilder(options, new AnalysisCache(), cha, scope);
CallGraph cg = builder.makeCallGraph(options, null);
PointerAnalysis pa = builder.getPointerAnalysis();
PointerAnalysis<InstanceKey> pa = builder.getPointerAnalysis();
// System.err.println(pa);
HeapModel heapModel = pa.getHeapModel();

View File

@ -141,7 +141,7 @@ public class CompareToZeroOneCFADriver {
private static void doTests(AnalysisScope scope, final ClassHierarchy cha, AnalysisOptions options) throws IllegalArgumentException, CancelException {
final SSAPropagationCallGraphBuilder builder = Util.makeVanillaZeroOneCFABuilder(options, new AnalysisCache(), cha, scope);
final CallGraph oldCG = builder.makeCallGraph(options,null);
final PointerAnalysis pa = builder.getPointerAnalysis();
final PointerAnalysis<InstanceKey> pa = builder.getPointerAnalysis();
// now, run our analysis
// build an RTA call graph

View File

@ -204,7 +204,7 @@ public class SimpleThreadEscapeAnalysis extends AbstractAnalysisEngine {
// extract data for analysis
//
CallGraph cg = getCallGraph();
PointerAnalysis pa = getPointerAnalysis();
PointerAnalysis<InstanceKey> pa = getPointerAnalysis();
//
// collect all places where objects can escape their creating thread:

View File

@ -22,6 +22,7 @@ import com.ibm.wala.ipa.callgraph.CallGraph;
import com.ibm.wala.ipa.callgraph.CallGraphBuilderCancelException;
import com.ibm.wala.ipa.callgraph.Entrypoint;
import com.ibm.wala.ipa.callgraph.impl.Util;
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
import com.ibm.wala.ipa.cha.ClassHierarchy;
import com.ibm.wala.ipa.cha.ClassHierarchyException;
@ -65,7 +66,7 @@ public class JavaViewerDriver {
com.ibm.wala.ipa.callgraph.CallGraphBuilder builder = Util.makeZeroCFABuilder(options, new AnalysisCache(), cha, scope);
CallGraph cg = builder.makeCallGraph(options, null);
PointerAnalysis pa = builder.getPointerAnalysis();
PointerAnalysis<InstanceKey> pa = builder.getPointerAnalysis();
new WalaViewer(cg, pa);
}

View File

@ -70,7 +70,7 @@ public class BasicHeapGraph extends HeapGraph {
* @param P governing pointer analysis
* @throws NullPointerException if P is null
*/
public BasicHeapGraph(final PointerAnalysis P, final CallGraph callGraph) throws NullPointerException {
public BasicHeapGraph(final PointerAnalysis<InstanceKey> P, final CallGraph callGraph) throws NullPointerException {
super(P);
this.callGraph = callGraph;

View File

@ -30,7 +30,7 @@ import com.ibm.wala.util.intset.IntSet;
*
* Nodes in the Graph are {@link PointerKey}s and {@link InstanceKey}s.
*
* There is an edge from a PointerKey P to an InstanceKey I iff the PointerAnalysis indicates that P may point to I.
* There is an edge from a PointerKey P to an InstanceKey I iff the PointerAnalysis<InstanceKey> indicates that P may point to I.
*
* There is an edge from an InstanceKey I to a PointerKey P iff - P represents a field of an object instance modeled by I, or - P
* represents the array contents of array instance I.
@ -38,9 +38,9 @@ import com.ibm.wala.util.intset.IntSet;
@SuppressWarnings("deprecation")
public abstract class HeapGraph implements NumberedGraph<Object> {
private final PointerAnalysis pa;
private final PointerAnalysis<InstanceKey> pa;
protected HeapGraph(PointerAnalysis pa) {
protected HeapGraph(PointerAnalysis<InstanceKey> pa) {
if (pa == null) {
throw new IllegalArgumentException("null pa ");
}
@ -74,7 +74,7 @@ public abstract class HeapGraph implements NumberedGraph<Object> {
return pa.getHeapModel();
}
public PointerAnalysis getPointerAnalysis() {
public PointerAnalysis<InstanceKey> getPointerAnalysis() {
return pa;
}

View File

@ -28,6 +28,7 @@ import com.ibm.wala.ipa.callgraph.CallGraph;
import com.ibm.wala.ipa.callgraph.CallGraphBuilder;
import com.ibm.wala.ipa.callgraph.Entrypoint;
import com.ibm.wala.ipa.callgraph.impl.Util;
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
import com.ibm.wala.ipa.cha.ClassHierarchy;
import com.ibm.wala.ipa.cha.ClassHierarchyException;
@ -113,7 +114,7 @@ public abstract class AbstractAnalysisEngine implements AnalysisEngine {
/**
* Results of pointer analysis
*/
protected PointerAnalysis pointerAnalysis;
protected PointerAnalysis<InstanceKey> pointerAnalysis;
/**
* Graph view of flow of pointers between heap abstractions
@ -256,7 +257,7 @@ public abstract class AbstractAnalysisEngine implements AnalysisEngine {
return scope;
}
public PointerAnalysis getPointerAnalysis() {
public PointerAnalysis<InstanceKey> getPointerAnalysis() {
return pointerAnalysis;
}

View File

@ -409,7 +409,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo {
* @return a {@link PointsToResult} indicating whether a points-to set satisfying the predicate was computed
* @throws IllegalArgumentException if <code>pk</code> is not a {@link LocalPointerKey}; to eventually be fixed
*/
public PointsToResult pointsToPassesPred(PointerKey pk, Predicate<InstanceKey> ikeyPred, PointerAnalysis pa)
public PointsToResult pointsToPassesPred(PointerKey pk, Predicate<InstanceKey> ikeyPred, PointerAnalysis<InstanceKey> pa)
throws IllegalArgumentException {
if (!(pk instanceof com.ibm.wala.ipa.callgraph.propagation.LocalPointerKey)) {
throw new IllegalArgumentException("only locals for now");
@ -2047,7 +2047,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo {
*/
@SuppressWarnings("unused")
private boolean doTopLevelTraversal(PointerKey pk, final Predicate<InstanceKey> pred, final PointsToComputer ptoComputer,
PointerAnalysis pa) {
PointerAnalysis<InstanceKey> pa) {
final Set<PointerKeyAndState> visited = HashSetFactory.make();
final LinkedList<PointerKeyAndState> worklist = new LinkedList<PointerKeyAndState>();
@ -2458,7 +2458,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo {
return true;
}
private boolean predHoldsForPk(PointerKey curPk, Predicate<InstanceKey> pred, PointerAnalysis pa) {
private boolean predHoldsForPk(PointerKey curPk, Predicate<InstanceKey> pred, PointerAnalysis<InstanceKey> pa) {
PointerKey curPkForPAHeapModel = convertToHeapModel(curPk, pa.getHeapModel());
OrdinalSet<InstanceKey> pointsToSet = pa.getPointsToSet(curPkForPAHeapModel);
for (InstanceKey ik : pointsToSet) {

View File

@ -43,7 +43,7 @@ public class PABasedMemoryAccessMap implements MemoryAccessMap {
private static final boolean DEBUG = false;
private final PointerAnalysis<? extends InstanceKey> pa;
private final PointerAnalysis<InstanceKey> pa;
private final HeapModel heapModel;
@ -51,15 +51,15 @@ public class PABasedMemoryAccessMap implements MemoryAccessMap {
private final Map<PointerKey, Set<Statement>> invRef;
public PABasedMemoryAccessMap(CallGraph cg, PointerAnalysis<? extends InstanceKey> pa) {
public PABasedMemoryAccessMap(CallGraph cg, PointerAnalysis<InstanceKey> pa) {
this(cg, pa, new SDG(cg, pa, DataDependenceOptions.NO_BASE_NO_HEAP_NO_EXCEPTIONS, ControlDependenceOptions.NONE));
}
public PABasedMemoryAccessMap(CallGraph cg, PointerAnalysis<? extends InstanceKey> pa, SDG sdg) {
public PABasedMemoryAccessMap(CallGraph cg, PointerAnalysis<InstanceKey> pa, SDG sdg) {
this(cg, pa, CISlicer.scanForMod(sdg, pa, true, ModRef.make()), CISlicer.scanForRef(sdg, pa));
}
public PABasedMemoryAccessMap(CallGraph cg, PointerAnalysis<? extends InstanceKey> pa, Map<Statement, Set<PointerKey>> mod,
public PABasedMemoryAccessMap(CallGraph cg, PointerAnalysis<InstanceKey> pa, Map<Statement, Set<PointerKey>> mod,
Map<Statement, Set<PointerKey>> ref) {
if (pa == null) {
throw new IllegalArgumentException("null pa");

View File

@ -10,6 +10,7 @@
*******************************************************************************/
package com.ibm.wala.ipa.callgraph;
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
import com.ibm.wala.util.CancelException;
@ -21,15 +22,15 @@ public class CallGraphBuilderCancelException extends CancelException {
private final CallGraph cg;
private final PointerAnalysis pointerAnalysis;
private final PointerAnalysis<InstanceKey> pointerAnalysis;
public static CallGraphBuilderCancelException createCallGraphBuilderCancelException(Exception cause, CallGraph cg,
PointerAnalysis pointerAnalysis) {
PointerAnalysis<InstanceKey> pointerAnalysis) {
return new CallGraphBuilderCancelException(cause, cg, pointerAnalysis);
}
public static CallGraphBuilderCancelException createCallGraphBuilderCancelException(String msg, CallGraph cg,
PointerAnalysis pointerAnalysis) {
PointerAnalysis<InstanceKey> pointerAnalysis) {
return new CallGraphBuilderCancelException(msg, cg, pointerAnalysis);
}
@ -43,17 +44,17 @@ public class CallGraphBuilderCancelException extends CancelException {
/**
* @return the {@link PointerAnalysis} in whatever state it was left when computation was canceled
*/
public PointerAnalysis getPartialPointerAnalysis() {
public PointerAnalysis<InstanceKey> getPartialPointerAnalysis() {
return pointerAnalysis;
}
private CallGraphBuilderCancelException(String msg, CallGraph cg, PointerAnalysis pointerAnalysis) {
private CallGraphBuilderCancelException(String msg, CallGraph cg, PointerAnalysis<InstanceKey> pointerAnalysis) {
super(msg);
this.cg = cg;
this.pointerAnalysis = pointerAnalysis;
}
private CallGraphBuilderCancelException(Exception cause, CallGraph cg, PointerAnalysis pointerAnalysis) {
private CallGraphBuilderCancelException(Exception cause, CallGraph cg, PointerAnalysis<InstanceKey> pointerAnalysis) {
super(cause);
this.cg = cg;
this.pointerAnalysis = pointerAnalysis;

View File

@ -89,7 +89,7 @@ public class PropagationSystem extends DefaultFixedPointSolver<PointsToSetVariab
/**
* An abstraction of the pointer analysis result
*/
private PointerAnalysis pointerAnalysis;
private PointerAnalysis<InstanceKey> pointerAnalysis;
/**
* Meta-data regarding how pointers are modelled.
@ -134,7 +134,7 @@ public class PropagationSystem extends DefaultFixedPointSolver<PointsToSetVariab
/**
* @return an object which encapsulates the pointer analysis result
*/
public PointerAnalysis makePointerAnalysis(PropagationCallGraphBuilder builder) {
public PointerAnalysis<InstanceKey> makePointerAnalysis(PropagationCallGraphBuilder builder) {
return new PointerAnalysisImpl(builder, cg, pointsToMap, instanceKeys, pointerKeyFactory, instanceKeyFactory);
}
@ -601,7 +601,7 @@ public class PropagationSystem extends DefaultFixedPointSolver<PointsToSetVariab
/**
* @return an object that encapsulates the pointer analysis results
*/
public PointerAnalysis extractPointerAnalysis(PropagationCallGraphBuilder builder) {
public PointerAnalysis<InstanceKey> extractPointerAnalysis(PropagationCallGraphBuilder builder) {
if (pointerAnalysis == null) {
pointerAnalysis = makePointerAnalysis(builder);
}

View File

@ -418,7 +418,7 @@ public abstract class AbstractRTABuilder extends PropagationCallGraphBuilder {
* @see com.ibm.wala.ipa.callgraph.CallGraphBuilder#getPointerAnalysis()
*/
@Override
public PointerAnalysis getPointerAnalysis() {
public PointerAnalysis<InstanceKey> getPointerAnalysis() {
return TypeBasedPointerAnalysis.make(getOptions(), allocatedClasses, getCallGraph());
}
}

View File

@ -57,7 +57,7 @@ public class ModRef {
* @throws IllegalArgumentException if cg is null
*
*/
public Map<CGNode, OrdinalSet<PointerKey>> computeMod(CallGraph cg, PointerAnalysis pa, HeapExclusions heapExclude) {
public Map<CGNode, OrdinalSet<PointerKey>> computeMod(CallGraph cg, PointerAnalysis<InstanceKey> pa, HeapExclusions heapExclude) {
if (cg == null) {
throw new IllegalArgumentException("cg is null");
}
@ -71,7 +71,7 @@ public class ModRef {
* @throws IllegalArgumentException if cg is null
*
*/
public Map<CGNode, OrdinalSet<PointerKey>> computeRef(CallGraph cg, PointerAnalysis pa, HeapExclusions heapExclude) {
public Map<CGNode, OrdinalSet<PointerKey>> computeRef(CallGraph cg, PointerAnalysis<InstanceKey> pa, HeapExclusions heapExclude) {
if (cg == null) {
throw new IllegalArgumentException("cg is null");
}
@ -83,7 +83,7 @@ public class ModRef {
* For each call graph node, what heap locations (as determined by a heap model) may it write, including its callees transitively
*
*/
public Map<CGNode, OrdinalSet<PointerKey>> computeMod(CallGraph cg, PointerAnalysis pa) {
public Map<CGNode, OrdinalSet<PointerKey>> computeMod(CallGraph cg, PointerAnalysis<InstanceKey> pa) {
return computeMod(cg, pa, null);
}
@ -91,7 +91,7 @@ public class ModRef {
* For each call graph node, what heap locations (as determined by a heap model) may it read, including its callees transitively
*
*/
public Map<CGNode, OrdinalSet<PointerKey>> computeRef(CallGraph cg, PointerAnalysis pa) {
public Map<CGNode, OrdinalSet<PointerKey>> computeRef(CallGraph cg, PointerAnalysis<InstanceKey> pa) {
return computeRef(cg, pa, null);
}
@ -101,7 +101,7 @@ public class ModRef {
*
* @param heapExclude
*/
private Map<CGNode, Collection<PointerKey>> scanForMod(CallGraph cg, final PointerAnalysis pa, final HeapExclusions heapExclude) {
private Map<CGNode, Collection<PointerKey>> scanForMod(CallGraph cg, final PointerAnalysis<InstanceKey> pa, final HeapExclusions heapExclude) {
return CallGraphTransitiveClosure.collectNodeResults(cg, new Function<CGNode, Collection<PointerKey>>() {
@ -118,7 +118,7 @@ public class ModRef {
*
* @param heapExclude
*/
private Map<CGNode, Collection<PointerKey>> scanForRef(CallGraph cg, final PointerAnalysis pa, final HeapExclusions heapExclude) {
private Map<CGNode, Collection<PointerKey>> scanForRef(CallGraph cg, final PointerAnalysis<InstanceKey> pa, final HeapExclusions heapExclude) {
return CallGraphTransitiveClosure.collectNodeResults(cg, new Function<CGNode, Collection<PointerKey>>() {
@Override
@ -134,7 +134,7 @@ public class ModRef {
*
* @param heapExclude
*/
private Collection<PointerKey> scanNodeForMod(final CGNode n, final PointerAnalysis pa, HeapExclusions heapExclude) {
private Collection<PointerKey> scanNodeForMod(final CGNode n, final PointerAnalysis<InstanceKey> pa, HeapExclusions heapExclude) {
Collection<PointerKey> result = HashSetFactory.make();
final ExtendedHeapModel h = new DelegatingExtendedHeapModel(pa.getHeapModel());
SSAInstruction.Visitor v = makeModVisitor(n, result, pa, h);
@ -154,7 +154,7 @@ public class ModRef {
* For a call graph node, what heap locations (as determined by a heap model) may it read, <bf> NOT </bf> including it's callees
* transitively
*/
private Collection<PointerKey> scanNodeForRef(final CGNode n, final PointerAnalysis pa, HeapExclusions heapExclude) {
private Collection<PointerKey> scanNodeForRef(final CGNode n, final PointerAnalysis<InstanceKey> pa, HeapExclusions heapExclude) {
Collection<PointerKey> result = HashSetFactory.make();
final ExtendedHeapModel h = new DelegatingExtendedHeapModel(pa.getHeapModel());
SSAInstruction.Visitor v = makeRefVisitor(n, result, pa, h);
@ -175,11 +175,11 @@ public class ModRef {
private final Collection<PointerKey> result;
private final PointerAnalysis<? extends InstanceKey> pa;
private final PointerAnalysis<InstanceKey> pa;
private final ExtendedHeapModel h;
protected RefVisitor(CGNode n, Collection<PointerKey> result, PointerAnalysis<? extends InstanceKey> pa, ExtendedHeapModel h) {
protected RefVisitor(CGNode n, Collection<PointerKey> result, PointerAnalysis<InstanceKey> pa, ExtendedHeapModel h) {
this.n = n;
this.result = result;
this.pa = pa;
@ -225,12 +225,12 @@ public class ModRef {
private final ExtendedHeapModel h;
private final PointerAnalysis<? extends InstanceKey> pa;
private final PointerAnalysis<InstanceKey> pa;
private final boolean ignoreAllocHeapDefs;
protected ModVisitor(CGNode n, Collection<PointerKey> result, ExtendedHeapModel h,
PointerAnalysis<? extends InstanceKey> pa, boolean ignoreAllocHeapDefs) {
PointerAnalysis<InstanceKey> pa, boolean ignoreAllocHeapDefs) {
this.n = n;
this.result = result;
this.h = h;
@ -329,11 +329,11 @@ public class ModRef {
}
}
protected ModVisitor makeModVisitor(CGNode n, Collection<PointerKey> result, PointerAnalysis pa, ExtendedHeapModel h) {
protected ModVisitor makeModVisitor(CGNode n, Collection<PointerKey> result, PointerAnalysis<InstanceKey> pa, ExtendedHeapModel h) {
return makeModVisitor(n, result, pa, h, false);
}
protected ModVisitor makeModVisitor(CGNode n, Collection<PointerKey> result, PointerAnalysis pa, ExtendedHeapModel h,
protected ModVisitor makeModVisitor(CGNode n, Collection<PointerKey> result, PointerAnalysis<InstanceKey> pa, ExtendedHeapModel h,
boolean ignoreAllocHeapDefs) {
return new ModVisitor(n, result, h, pa, ignoreAllocHeapDefs);
}
@ -341,14 +341,14 @@ public class ModRef {
/**
* Compute the set of {@link PointerKey}s that represent pointers that instruction s may write to.
*/
public Set<PointerKey> getMod(CGNode n, ExtendedHeapModel h, PointerAnalysis pa, SSAInstruction s, HeapExclusions hexcl) {
public Set<PointerKey> getMod(CGNode n, ExtendedHeapModel h, PointerAnalysis<InstanceKey> pa, SSAInstruction s, HeapExclusions hexcl) {
return getMod(n, h, pa, s, hexcl, false);
}
/**
* Compute the set of {@link PointerKey}s that represent pointers that instruction s may write to.
*/
public Set<PointerKey> getMod(CGNode n, ExtendedHeapModel h, PointerAnalysis pa, SSAInstruction s, HeapExclusions hexcl,
public Set<PointerKey> getMod(CGNode n, ExtendedHeapModel h, PointerAnalysis<InstanceKey> pa, SSAInstruction s, HeapExclusions hexcl,
boolean ignoreAllocHeapDefs) {
if (s == null) {
throw new IllegalArgumentException("s is null");
@ -359,14 +359,14 @@ public class ModRef {
return hexcl == null ? result : hexcl.filter(result);
}
protected RefVisitor makeRefVisitor(CGNode n, Collection<PointerKey> result, PointerAnalysis pa, ExtendedHeapModel h) {
protected RefVisitor makeRefVisitor(CGNode n, Collection<PointerKey> result, PointerAnalysis<InstanceKey> pa, ExtendedHeapModel h) {
return new RefVisitor(n, result, pa, h);
}
/**
* Compute the set of {@link PointerKey}s that represent pointers that instruction s may read.
*/
public Set<PointerKey> getRef(CGNode n, ExtendedHeapModel h, PointerAnalysis pa, SSAInstruction s, HeapExclusions hexcl) {
public Set<PointerKey> getRef(CGNode n, ExtendedHeapModel h, PointerAnalysis<InstanceKey> pa, SSAInstruction s, HeapExclusions hexcl) {
if (s == null) {
throw new IllegalArgumentException("s is null");
}

View File

@ -28,6 +28,7 @@ import com.ibm.wala.fixpoint.BitVectorVariable;
import com.ibm.wala.fixpoint.UnaryOperator;
import com.ibm.wala.ipa.callgraph.CGNode;
import com.ibm.wala.ipa.callgraph.CallGraph;
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
import com.ibm.wala.ipa.callgraph.propagation.PointerKey;
import com.ibm.wala.ipa.callgraph.propagation.StaticFieldKey;
@ -93,7 +94,7 @@ public class HeapReachingDefs {
* @throws IllegalArgumentException if statements is null
*/
@SuppressWarnings("unused")
public Map<Statement, OrdinalSet<Statement>> computeReachingDefs(CGNode node, IR ir, PointerAnalysis pa,
public Map<Statement, OrdinalSet<Statement>> computeReachingDefs(CGNode node, IR ir, PointerAnalysis<InstanceKey> pa,
Map<CGNode, OrdinalSet<PointerKey>> mod, Collection<Statement> statements, HeapExclusions exclusions, CallGraph cg) {
if (statements == null) {
@ -148,7 +149,7 @@ public class HeapReachingDefs {
private final CallGraph cg;
RDMap(BitVectorSolver<? extends ISSABasicBlock> solver, OrdinalSetMapping<Statement> domain, CGNode node, ExtendedHeapModel h,
PointerAnalysis pa, Map<CGNode, OrdinalSet<PointerKey>> mod, ExplodedControlFlowGraph cfg,
PointerAnalysis<InstanceKey> pa, Map<CGNode, OrdinalSet<PointerKey>> mod, ExplodedControlFlowGraph cfg,
Map<Integer, NormalStatement> ssaInstructionIndex2Statement, HeapExclusions exclusions, CallGraph cg) {
if (VERBOSE) {
System.err.println("Init pointer Key mod ");
@ -166,7 +167,7 @@ public class HeapReachingDefs {
}
private void eagerPopulate(Map<PointerKey, MutableIntSet> pointerKeyMod, BitVectorSolver<? extends ISSABasicBlock> solver,
OrdinalSetMapping<Statement> domain, CGNode node, ExtendedHeapModel h, PointerAnalysis pa,
OrdinalSetMapping<Statement> domain, CGNode node, ExtendedHeapModel h, PointerAnalysis<InstanceKey> pa,
Map<CGNode, OrdinalSet<PointerKey>> mod, ExplodedControlFlowGraph cfg,
Map<Integer, NormalStatement> ssaInstruction2Statement) {
for (Statement s : domain) {
@ -178,7 +179,7 @@ public class HeapReachingDefs {
* For each pointerKey, which statements may def it
*/
private Map<PointerKey, MutableIntSet> initPointerKeyMod(OrdinalSetMapping<Statement> domain, CGNode node, ExtendedHeapModel h,
PointerAnalysis pa) {
PointerAnalysis<InstanceKey> pa) {
Map<PointerKey, MutableIntSet> pointerKeyMod = HashMapFactory.make();
for (Statement s : domain) {
switch (s.getKind()) {
@ -303,7 +304,7 @@ public class HeapReachingDefs {
*/
OrdinalSet<Statement> computeResult(Statement s, Map<PointerKey, MutableIntSet> pointerKeyMod,
BitVectorSolver<? extends ISSABasicBlock> solver, OrdinalSetMapping<Statement> domain, CGNode node, ExtendedHeapModel h,
PointerAnalysis pa, Map<CGNode, OrdinalSet<PointerKey>> mod, ExplodedControlFlowGraph cfg,
PointerAnalysis<InstanceKey> pa, Map<CGNode, OrdinalSet<PointerKey>> mod, ExplodedControlFlowGraph cfg,
Map<Integer, NormalStatement> ssaInstructionIndex2Statement) {
switch (s.getKind()) {
case NORMAL:
@ -394,7 +395,7 @@ public class HeapReachingDefs {
* For each statement s, compute the set of statements that may def the heap value read by s.
*/
private Map<Statement, OrdinalSet<Statement>> makeResult(BitVectorSolver<? extends ISSABasicBlock> solver,
OrdinalSetMapping<Statement> domain, CGNode node, ExtendedHeapModel h, PointerAnalysis pa,
OrdinalSetMapping<Statement> domain, CGNode node, ExtendedHeapModel h, PointerAnalysis<InstanceKey> pa,
Map<CGNode, OrdinalSet<PointerKey>> mod, ExplodedControlFlowGraph cfg,
Map<Integer, NormalStatement> ssaInstructionIndex2Statement, HeapExclusions exclusions, CallGraph cg) {
@ -417,7 +418,7 @@ public class HeapReachingDefs {
return true;
}
private Collection<PointerKey> getMod(Statement s, CGNode n, ExtendedHeapModel h, PointerAnalysis pa, HeapExclusions exclusions) {
private Collection<PointerKey> getMod(Statement s, CGNode n, ExtendedHeapModel h, PointerAnalysis<InstanceKey> pa, HeapExclusions exclusions) {
switch (s.getKind()) {
case NORMAL:
NormalStatement ns = (NormalStatement) s;
@ -478,7 +479,7 @@ public class HeapReachingDefs {
private final OrdinalSetMapping<Statement> domain;
private final PointerAnalysis pa;
private final PointerAnalysis<InstanceKey> pa;
private final ExtendedHeapModel h;
@ -492,7 +493,7 @@ public class HeapReachingDefs {
*/
private final IBinaryNaturalRelation heapReturnCaller = new BasicNaturalRelation();
public RD(CGNode node, ExplodedControlFlowGraph cfg, PointerAnalysis pa, OrdinalSetMapping<Statement> domain,
public RD(CGNode node, ExplodedControlFlowGraph cfg, PointerAnalysis<InstanceKey> pa, OrdinalSetMapping<Statement> domain,
Map<Integer, NormalStatement> ssaInstructionIndex2Statement, HeapExclusions exclusions) {
this.node = node;
this.cfg = cfg;

View File

@ -22,9 +22,9 @@ import com.ibm.wala.analysis.stackMachine.AbstractIntStackMachine;
import com.ibm.wala.cfg.ControlFlowGraph;
import com.ibm.wala.cfg.cdg.ControlDependenceGraph;
import com.ibm.wala.classLoader.CallSiteReference;
import com.ibm.wala.classLoader.IClass;
import com.ibm.wala.ipa.callgraph.CGNode;
import com.ibm.wala.ipa.callgraph.CallGraph;
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
import com.ibm.wala.ipa.callgraph.propagation.PointerKey;
import com.ibm.wala.ipa.cfg.ExceptionPrunedCFG;
@ -105,7 +105,7 @@ public class PDG implements NumberedGraph<Statement> {
private final Collection<PointerKey> locationsHandled = HashSetFactory.make();
private final PointerAnalysis pa;
private final PointerAnalysis<InstanceKey> pa;
private final ExtendedHeapModel heapModel;
@ -131,7 +131,7 @@ public class PDG implements NumberedGraph<Statement> {
* @param ref the set of heap locations which may be read (transitively) by this node. These are logically parameters in the SDG.
* @throws IllegalArgumentException if node is null
*/
public PDG(final CGNode node, PointerAnalysis pa, Map<CGNode, OrdinalSet<PointerKey>> mod,
public PDG(final CGNode node, PointerAnalysis<InstanceKey> pa, Map<CGNode, OrdinalSet<PointerKey>> mod,
Map<CGNode, OrdinalSet<PointerKey>> ref, DataDependenceOptions dOptions, ControlDependenceOptions cOptions,
HeapExclusions exclusions, CallGraph cg, ModRef modRef) {
this(node, pa, mod, ref, dOptions, cOptions, exclusions, cg, modRef, false);
@ -143,7 +143,7 @@ public class PDG implements NumberedGraph<Statement> {
* @param ref the set of heap locations which may be read (transitively) by this node. These are logically parameters in the SDG.
* @throws IllegalArgumentException if node is null
*/
public PDG(final CGNode node, PointerAnalysis pa, Map<CGNode, OrdinalSet<PointerKey>> mod,
public PDG(final CGNode node, PointerAnalysis<InstanceKey> pa, Map<CGNode, OrdinalSet<PointerKey>> mod,
Map<CGNode, OrdinalSet<PointerKey>> ref, DataDependenceOptions dOptions, ControlDependenceOptions cOptions,
HeapExclusions exclusions, CallGraph cg, ModRef modRef, boolean ignoreAllocHeapDefs) {

View File

@ -18,6 +18,7 @@ import java.util.Map;
import com.ibm.wala.classLoader.CallSiteReference;
import com.ibm.wala.ipa.callgraph.CGNode;
import com.ibm.wala.ipa.callgraph.CallGraph;
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
import com.ibm.wala.ipa.callgraph.propagation.PointerKey;
import com.ibm.wala.ipa.cha.IClassHierarchy;
@ -77,7 +78,7 @@ public class SDG extends AbstractNumberedGraph<Statement> implements ISDG {
/**
* governing pointer analysis
*/
private final PointerAnalysis pa;
private final PointerAnalysis<InstanceKey> pa;
/**
* keeps track of PDG for each call graph node
@ -121,16 +122,16 @@ public class SDG extends AbstractNumberedGraph<Statement> implements ISDG {
*/
private boolean eagerComputed = false;
public SDG(final CallGraph cg, PointerAnalysis pa, DataDependenceOptions dOptions, ControlDependenceOptions cOptions) {
public SDG(final CallGraph cg, PointerAnalysis<InstanceKey> pa, DataDependenceOptions dOptions, ControlDependenceOptions cOptions) {
this(cg, pa, ModRef.make(), dOptions, cOptions, null);
}
public SDG(final CallGraph cg, PointerAnalysis pa, ModRef modRef, DataDependenceOptions dOptions,
public SDG(final CallGraph cg, PointerAnalysis<InstanceKey> pa, ModRef modRef, DataDependenceOptions dOptions,
ControlDependenceOptions cOptions) {
this(cg, pa, modRef, dOptions, cOptions, null);
}
public SDG(CallGraph cg, PointerAnalysis pa, ModRef modRef, DataDependenceOptions dOptions, ControlDependenceOptions cOptions,
public SDG(CallGraph cg, PointerAnalysis<InstanceKey> pa, ModRef modRef, DataDependenceOptions dOptions, ControlDependenceOptions cOptions,
HeapExclusions heapExclude) throws IllegalArgumentException {
super();
if (dOptions == null) {
@ -819,7 +820,7 @@ public class SDG extends AbstractNumberedGraph<Statement> implements ISDG {
return cg.getClassHierarchy();
}
public PointerAnalysis getPointerAnalysis() {
public PointerAnalysis<InstanceKey> getPointerAnalysis() {
return pa;
}

View File

@ -24,6 +24,7 @@ import com.ibm.wala.dataflow.IFDS.TabulationDomain;
import com.ibm.wala.dataflow.IFDS.TabulationResult;
import com.ibm.wala.dataflow.IFDS.UnorderedDomain;
import com.ibm.wala.ipa.callgraph.CallGraph;
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
import com.ibm.wala.ipa.modref.ModRef;
import com.ibm.wala.util.CancelException;
@ -129,7 +130,7 @@ public class Slicer {
* @return the backward slice of s.
* @throws CancelException
*/
public static Collection<Statement> computeBackwardSlice(Statement s, CallGraph cg, PointerAnalysis pa,
public static Collection<Statement> computeBackwardSlice(Statement s, CallGraph cg, PointerAnalysis<InstanceKey> pa,
DataDependenceOptions dOptions, ControlDependenceOptions cOptions) throws IllegalArgumentException, CancelException {
return computeSlice(new SDG(cg, pa, ModRef.make(), dOptions, cOptions), Collections.singleton(s), true);
}
@ -139,7 +140,7 @@ public class Slicer {
* @return the forward slice of s.
* @throws CancelException
*/
public static Collection<Statement> computeForwardSlice(Statement s, CallGraph cg, PointerAnalysis pa,
public static Collection<Statement> computeForwardSlice(Statement s, CallGraph cg, PointerAnalysis<InstanceKey> pa,
DataDependenceOptions dOptions, ControlDependenceOptions cOptions) throws IllegalArgumentException, CancelException {
return computeSlice(new SDG(cg, pa, ModRef.make(), dOptions, cOptions), Collections.singleton(s), false);
}
@ -225,7 +226,7 @@ public class Slicer {
* @return the backward slice of s.
* @throws CancelException
*/
public static Collection<Statement> computeBackwardSlice(Statement s, CallGraph cg, PointerAnalysis pointerAnalysis)
public static Collection<Statement> computeBackwardSlice(Statement s, CallGraph cg, PointerAnalysis<InstanceKey> pointerAnalysis)
throws IllegalArgumentException, CancelException {
return computeBackwardSlice(s, cg, pointerAnalysis, DataDependenceOptions.FULL, ControlDependenceOptions.FULL);
}

View File

@ -17,6 +17,7 @@ import java.util.Set;
import com.ibm.wala.ipa.callgraph.CGNode;
import com.ibm.wala.ipa.callgraph.CallGraph;
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
import com.ibm.wala.ipa.callgraph.propagation.PointerKey;
import com.ibm.wala.ipa.modref.DelegatingExtendedHeapModel;
@ -51,11 +52,11 @@ public class CISlicer {
*/
private final Graph<Statement> depGraph;
public CISlicer(CallGraph cg, PointerAnalysis pa, DataDependenceOptions dOptions, ControlDependenceOptions cOptions) {
public CISlicer(CallGraph cg, PointerAnalysis<InstanceKey> pa, DataDependenceOptions dOptions, ControlDependenceOptions cOptions) {
this(cg, pa, ModRef.make(), dOptions, cOptions);
}
public CISlicer(CallGraph cg, PointerAnalysis pa, ModRef modRef, DataDependenceOptions dOptions, ControlDependenceOptions cOptions)
public CISlicer(CallGraph cg, PointerAnalysis<InstanceKey> pa, ModRef modRef, DataDependenceOptions dOptions, ControlDependenceOptions cOptions)
throws IllegalArgumentException {
if (dOptions == null) {
throw new IllegalArgumentException("dOptions == null");
@ -73,7 +74,7 @@ public class CISlicer {
}
public CISlicer(final SDG sdg, final PointerAnalysis pa, final ModRef modRef) {
public CISlicer(final SDG sdg, final PointerAnalysis<InstanceKey> pa, final ModRef modRef) {
Map<Statement, Set<PointerKey>> mod = scanForMod(sdg, pa, modRef);
Map<Statement, Set<PointerKey>> ref = scanForRef(sdg, pa, modRef);
@ -93,14 +94,14 @@ public class CISlicer {
/**
* Compute the set of pointer keys each statement mods
*/
public static Map<Statement, Set<PointerKey>> scanForMod(SDG sdg, PointerAnalysis pa) {
public static Map<Statement, Set<PointerKey>> scanForMod(SDG sdg, PointerAnalysis<InstanceKey> pa) {
return scanForMod(sdg, pa, false, ModRef.make());
}
/**
* Compute the set of pointer keys each statement refs
*/
public static Map<Statement, Set<PointerKey>> scanForRef(SDG sdg, PointerAnalysis pa) {
public static Map<Statement, Set<PointerKey>> scanForRef(SDG sdg, PointerAnalysis<InstanceKey> pa) {
if (sdg == null) {
throw new IllegalArgumentException("null sdg");
}
@ -110,7 +111,7 @@ public class CISlicer {
/**
* Compute the set of pointer keys each statement mods
*/
public static Map<Statement, Set<PointerKey>> scanForMod(SDG sdg, PointerAnalysis pa, ModRef modRef) {
public static Map<Statement, Set<PointerKey>> scanForMod(SDG sdg, PointerAnalysis<InstanceKey> pa, ModRef modRef) {
return scanForMod(sdg, pa, false, modRef);
}
@ -118,7 +119,7 @@ public class CISlicer {
* Compute the set of pointer keys each statement mods. Be careful to avoid eager PDG construction here! That means .. don't
* iterate over SDG statements!
*/
public static Map<Statement, Set<PointerKey>> scanForMod(SDG sdg, PointerAnalysis pa, boolean ignoreAllocHeapDefs, ModRef modRef) {
public static Map<Statement, Set<PointerKey>> scanForMod(SDG sdg, PointerAnalysis<InstanceKey> pa, boolean ignoreAllocHeapDefs, ModRef modRef) {
if (pa == null) {
throw new IllegalArgumentException("null pa");
}
@ -146,7 +147,7 @@ public class CISlicer {
* Compute the set of PointerKeys each statement refs.Be careful to avoid eager PDG construction here! That means .. don't iterate
* over SDG statements!
*/
public static Map<Statement, Set<PointerKey>> scanForRef(SDG sdg, PointerAnalysis pa, ModRef modRef) {
public static Map<Statement, Set<PointerKey>> scanForRef(SDG sdg, PointerAnalysis<InstanceKey> pa, ModRef modRef) {
if (pa == null) {
throw new IllegalArgumentException("null pa");
}

View File

@ -11,6 +11,7 @@
package com.ibm.wala.ipa.slicer.thin;
import com.ibm.wala.ipa.callgraph.CallGraph;
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
import com.ibm.wala.ipa.modref.ModRef;
import com.ibm.wala.ipa.slicer.Slicer.ControlDependenceOptions;
@ -29,11 +30,11 @@ import com.ibm.wala.ipa.slicer.Slicer.DataDependenceOptions;
*/
public class ThinSlicer extends CISlicer {
public ThinSlicer(CallGraph cg, PointerAnalysis pa) {
public ThinSlicer(CallGraph cg, PointerAnalysis<InstanceKey> pa) {
this(cg, pa, ModRef.make());
}
public ThinSlicer(CallGraph cg, PointerAnalysis pa, ModRef modRef) {
public ThinSlicer(CallGraph cg, PointerAnalysis<InstanceKey> pa, ModRef modRef) {
super(cg, pa, modRef, DataDependenceOptions.NO_HEAP, ControlDependenceOptions.NONE);
}
}

View File

@ -54,7 +54,7 @@ import com.ibm.wala.util.intset.OrdinalSetMapping;
*/
public class PaPanel extends JSplitPane {
protected final PointerAnalysis<? extends InstanceKey> pa;
protected final PointerAnalysis<InstanceKey> pa;
protected final CallGraph cg;
private JTextField fullName;
@ -66,7 +66,7 @@ public class PaPanel extends JSplitPane {
private MutableMapping<List<InstanceFieldPointerKey>> instanceKeyIdToInstanceFieldPointers = MutableMapping.<List<InstanceFieldPointerKey>> make();
public PaPanel(CallGraph cg, PointerAnalysis<? extends InstanceKey> pa) {
public PaPanel(CallGraph cg, PointerAnalysis<InstanceKey> pa) {
super(JSplitPane.HORIZONTAL_SPLIT);
this.pa = pa;
@ -166,7 +166,7 @@ public class PaPanel extends JSplitPane {
}
private void initDataStructures(PointerAnalysis pa) {
private void initDataStructures(PointerAnalysis<InstanceKey> pa) {
HeapGraph heapGraph = pa.getHeapGraph();
OrdinalSetMapping<InstanceKey> instanceKeyMapping = pa.getInstanceKeyMapping();
for (Object n : heapGraph){

View File

@ -18,6 +18,7 @@ import javax.swing.JTabbedPane;
import javax.swing.UIManager;
import com.ibm.wala.ipa.callgraph.CallGraph;
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
/**
@ -31,7 +32,7 @@ public class WalaViewer extends JFrame {
protected static final String DefaultMutableTreeNode = null;
public WalaViewer(CallGraph cg, PointerAnalysis pa) {
public WalaViewer(CallGraph cg, PointerAnalysis<InstanceKey> pa) {
setNativeLookAndFeel();
JTabbedPane tabbedPane = new JTabbedPane();
@ -51,7 +52,7 @@ public class WalaViewer extends JFrame {
setVisible(true);
}
protected PaPanel createPaPanel(CallGraph cg, PointerAnalysis pa) {
protected PaPanel createPaPanel(CallGraph cg, PointerAnalysis<InstanceKey> pa) {
return new PaPanel(cg, pa);
}

View File

@ -24,6 +24,7 @@ import com.ibm.wala.ipa.callgraph.AnalysisScope;
import com.ibm.wala.ipa.callgraph.CallGraph;
import com.ibm.wala.ipa.callgraph.Entrypoint;
import com.ibm.wala.ipa.callgraph.impl.Util;
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
import com.ibm.wala.ipa.cha.ClassHierarchy;
import com.ibm.wala.util.CancelException;
@ -92,7 +93,7 @@ public class SWTPointsTo {
// //
com.ibm.wala.ipa.callgraph.CallGraphBuilder builder = Util.makeVanillaZeroOneCFABuilder(options, new AnalysisCache(),cha, scope, null, null);
CallGraph cg = builder.makeCallGraph(options,null);
PointerAnalysis pointerAnalysis = builder.getPointerAnalysis();
PointerAnalysis<InstanceKey> pointerAnalysis = builder.getPointerAnalysis();
System.err.println(pointerAnalysis);