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:
Julian Dolby 2014-10-22 11:27:48 -04:00
parent 981fc9a4a1
commit 5137760580
5 changed files with 20 additions and 5 deletions

View File

@ -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 {

View File

@ -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));
}
/**

View File

@ -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;
}

View File

@ -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);

View File

@ -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())));
}