From 5137760580cf6ef4a8e48313325810b2a46c628c Mon Sep 17 00:00:00 2001 From: Julian Dolby Date: Wed, 22 Oct 2014 11:27:48 -0400 Subject: [PATCH] fixes to field-based pointer analysis notion of all instance keys. filter for only those actually present in the CG --- .../ibm/wala/cast/js/test/TestPointerAnalyses.java | 4 ++++ .../fieldbased/FieldBasedCallGraphBuilder.java | 2 +- .../js/callgraph/fieldbased/flowgraph/FlowGraph.java | 11 +++++++++-- .../flowgraph/vertices/CreationSiteVertex.java | 6 +++++- .../fieldbased/flowgraph/vertices/FuncVertex.java | 2 +- 5 files changed, 20 insertions(+), 5 deletions(-) diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestPointerAnalyses.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestPointerAnalyses.java index b7f14d097..3c803c69d 100644 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestPointerAnalyses.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestPointerAnalyses.java @@ -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 { diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/FieldBasedCallGraphBuilder.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/FieldBasedCallGraphBuilder.java index 54d1ad7c5..786af2f2a 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/FieldBasedCallGraphBuilder.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/FieldBasedCallGraphBuilder.java @@ -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)); } /** diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/FlowGraph.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/FlowGraph.java index 1262ce8cc..5fb7d2cc4 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/FlowGraph.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/FlowGraph.java @@ -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 { return graph.iterator(); } - public PointerAnalysis getPointerAnalysis(final IProgressMonitor monitor) throws CancelException { + public PointerAnalysis getPointerAnalysis(final CallGraph cg, final IProgressMonitor monitor) throws CancelException { return new PointerAnalysis() { private final GraphReachability pointerAnalysis = computeClosure(graph, monitor, ObjectVertex.class); @@ -173,7 +176,11 @@ public class FlowGraph implements Iterable { @Override public Collection getInstanceKeys() { Set 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; } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/CreationSiteVertex.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/CreationSiteVertex.java index 812d511e9..12bfbe212 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/CreationSiteVertex.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/CreationSiteVertex.java @@ -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> getCreationSites(CallGraph CG) { CGNode cgn = CG.getNode(node, Everywhere.EVERYWHERE); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/FuncVertex.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/FuncVertex.java index 3cefb76d6..7b95e212e 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/FuncVertex.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/FuncVertex.java @@ -79,7 +79,7 @@ public class FuncVertex extends Vertex implements ObjectVertex { Iterator 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()))); }