fixes to field-based pointer analysis notion of all instance keys.
filter for only those actually present in the CG
This commit is contained in:
parent
981fc9a4a1
commit
5137760580
|
@ -187,6 +187,10 @@ public abstract class TestPointerAnalyses {
|
|||
Assert.assertTrue(fbPtrs + " should intersect " + propPtrs + " for " + i + " of " + fbNodes.iterator().next().getIR(), test.test(Pair.make(fbPtrs, propPtrs)));
|
||||
}
|
||||
}
|
||||
|
||||
for(InstanceKey k : fbPA.getInstanceKeys()) {
|
||||
k.getCreationSites(fbCG);
|
||||
}
|
||||
}
|
||||
|
||||
private void testUserCodeEquivalent(URL page) throws IOException, WalaException, CancelException {
|
||||
|
|
|
@ -130,7 +130,7 @@ public abstract class FieldBasedCallGraphBuilder {
|
|||
System.out.println("call graph extraction took " + (cgEnd-cgBegin)/1000.0 + " seconds");
|
||||
}
|
||||
|
||||
return Pair.make(cg,flowGraph.getPointerAnalysis(monitor));
|
||||
return Pair.make(cg,flowGraph.getPointerAnalysis(cg, monitor));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -16,6 +16,7 @@ import java.util.Set;
|
|||
|
||||
import com.ibm.wala.analysis.pointers.HeapGraph;
|
||||
import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.AbstractVertexVisitor;
|
||||
import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.CreationSiteVertex;
|
||||
import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.FuncVertex;
|
||||
import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.ObjectVertex;
|
||||
import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.UnknownVertex;
|
||||
|
@ -28,6 +29,8 @@ import com.ibm.wala.classLoader.IMethod;
|
|||
import com.ibm.wala.classLoader.NewSiteReference;
|
||||
import com.ibm.wala.classLoader.ProgramCounter;
|
||||
import com.ibm.wala.ipa.callgraph.CGNode;
|
||||
import com.ibm.wala.ipa.callgraph.CallGraph;
|
||||
import com.ibm.wala.ipa.callgraph.impl.Everywhere;
|
||||
import com.ibm.wala.ipa.callgraph.propagation.FilteredPointerKey;
|
||||
import com.ibm.wala.ipa.callgraph.propagation.FilteredPointerKey.TypeFilter;
|
||||
import com.ibm.wala.ipa.callgraph.propagation.HeapModel;
|
||||
|
@ -157,7 +160,7 @@ public class FlowGraph implements Iterable<Vertex> {
|
|||
return graph.iterator();
|
||||
}
|
||||
|
||||
public PointerAnalysis<ObjectVertex> getPointerAnalysis(final IProgressMonitor monitor) throws CancelException {
|
||||
public PointerAnalysis<ObjectVertex> getPointerAnalysis(final CallGraph cg, final IProgressMonitor monitor) throws CancelException {
|
||||
return new PointerAnalysis<ObjectVertex>() {
|
||||
private final GraphReachability<Vertex,ObjectVertex> pointerAnalysis = computeClosure(graph, monitor, ObjectVertex.class);
|
||||
|
||||
|
@ -173,7 +176,11 @@ public class FlowGraph implements Iterable<Vertex> {
|
|||
@Override
|
||||
public Collection<ObjectVertex> getInstanceKeys() {
|
||||
Set<ObjectVertex> result = HashSetFactory.make();
|
||||
result.addAll(factory.creationSites());
|
||||
for(CreationSiteVertex cs : factory.creationSites()) {
|
||||
if (cg.getNode(cs.getMethod(), Everywhere.EVERYWHERE) != null) {
|
||||
result.add(cs);
|
||||
}
|
||||
}
|
||||
result.addAll(factory.getFuncVertices());
|
||||
return result;
|
||||
}
|
||||
|
|
|
@ -24,12 +24,16 @@ public class CreationSiteVertex extends Vertex implements ObjectVertex {
|
|||
this.node = node;
|
||||
this.instructionIndex = instructionIndex;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public IClass getConcreteType() {
|
||||
return node.getClassHierarchy().lookupClass(JavaScriptTypes.Object);
|
||||
}
|
||||
|
||||
public IMethod getMethod() {
|
||||
return node;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterator<Pair<CGNode, NewSiteReference>> getCreationSites(CallGraph CG) {
|
||||
CGNode cgn = CG.getNode(node, Everywhere.EVERYWHERE);
|
||||
|
|
|
@ -79,7 +79,7 @@ public class FuncVertex extends Vertex implements ObjectVertex {
|
|||
|
||||
Iterator<CallSiteReference> sites = CG.getPossibleSites(caller, ctor);
|
||||
CallSiteReference site = sites.next();
|
||||
assert !sites.hasNext();
|
||||
assert !sites.hasNext() : caller + " --> " + ctor + " @ " + site + " and " + sites.next() + "\n" + caller.getIR();
|
||||
|
||||
return NonNullSingletonIterator.make(Pair.make(caller, NewSiteReference.make(site.getProgramCounter(), klass.getReference())));
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue