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))); 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 { 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"); 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.analysis.pointers.HeapGraph;
import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.AbstractVertexVisitor; 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.FuncVertex;
import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.ObjectVertex; import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.ObjectVertex;
import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.UnknownVertex; 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.NewSiteReference;
import com.ibm.wala.classLoader.ProgramCounter; import com.ibm.wala.classLoader.ProgramCounter;
import com.ibm.wala.ipa.callgraph.CGNode; 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;
import com.ibm.wala.ipa.callgraph.propagation.FilteredPointerKey.TypeFilter; import com.ibm.wala.ipa.callgraph.propagation.FilteredPointerKey.TypeFilter;
import com.ibm.wala.ipa.callgraph.propagation.HeapModel; import com.ibm.wala.ipa.callgraph.propagation.HeapModel;
@ -157,7 +160,7 @@ public class FlowGraph implements Iterable<Vertex> {
return graph.iterator(); 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>() { return new PointerAnalysis<ObjectVertex>() {
private final GraphReachability<Vertex,ObjectVertex> pointerAnalysis = computeClosure(graph, monitor, ObjectVertex.class); private final GraphReachability<Vertex,ObjectVertex> pointerAnalysis = computeClosure(graph, monitor, ObjectVertex.class);
@ -173,7 +176,11 @@ public class FlowGraph implements Iterable<Vertex> {
@Override @Override
public Collection<ObjectVertex> getInstanceKeys() { public Collection<ObjectVertex> getInstanceKeys() {
Set<ObjectVertex> result = HashSetFactory.make(); 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()); result.addAll(factory.getFuncVertices());
return result; return result;
} }

View File

@ -24,12 +24,16 @@ public class CreationSiteVertex extends Vertex implements ObjectVertex {
this.node = node; this.node = node;
this.instructionIndex = instructionIndex; this.instructionIndex = instructionIndex;
} }
@Override @Override
public IClass getConcreteType() { public IClass getConcreteType() {
return node.getClassHierarchy().lookupClass(JavaScriptTypes.Object); return node.getClassHierarchy().lookupClass(JavaScriptTypes.Object);
} }
public IMethod getMethod() {
return node;
}
@Override @Override
public Iterator<Pair<CGNode, NewSiteReference>> getCreationSites(CallGraph CG) { public Iterator<Pair<CGNode, NewSiteReference>> getCreationSites(CallGraph CG) {
CGNode cgn = CG.getNode(node, Everywhere.EVERYWHERE); 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); Iterator<CallSiteReference> sites = CG.getPossibleSites(caller, ctor);
CallSiteReference site = sites.next(); 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()))); return NonNullSingletonIterator.make(Pair.make(caller, NewSiteReference.make(site.getProgramCounter(), klass.getReference())));
} }