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)));
|
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 {
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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())));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue