--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<classpath>\r
+ <classpathentry kind="src" path="src"/>\r
+ <classpathentry kind="src" path="sample"/>\r
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>\r
+ <classpathentry combineaccessrules="false" kind="src" path="/com.ibm.wala.core"/>\r
+ <classpathentry combineaccessrules="false" kind="src" path="/com.ibm.wala.util"/>\r
+ <classpathentry combineaccessrules="false" kind="src" path="/com.ibm.wala.core.tests"/>\r
+ <classpathentry combineaccessrules="false" kind="src" path="/soba"/>\r
+ <classpathentry combineaccessrules="false" kind="src" path="/com.ibm.wala.shrike"/>\r
+ <classpathentry kind="output" path="bin"/>\r
+</classpath>\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<projectDescription>\r
+ <name>JavaAnalysisToolsDemo</name>\r
+ <comment></comment>\r
+ <projects>\r
+ </projects>\r
+ <buildSpec>\r
+ <buildCommand>\r
+ <name>org.eclipse.jdt.core.javabuilder</name>\r
+ <arguments>\r
+ </arguments>\r
+ </buildCommand>\r
+ </buildSpec>\r
+ <natures>\r
+ <nature>org.eclipse.jdt.core.javanature</nature>\r
+ </natures>\r
+</projectDescription>\r
--- /dev/null
+eclipse.preferences.version=1\r
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled\r
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8\r
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve\r
+org.eclipse.jdt.core.compiler.compliance=1.8\r
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate\r
+org.eclipse.jdt.core.compiler.debug.localVariable=generate\r
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate\r
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error\r
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error\r
+org.eclipse.jdt.core.compiler.source=1.8\r
--- /dev/null
+java\/awt\/.*
+javax\/swing\/.*
+sun\/awt\/.*
+sun\/swing\/.*
+com\/sun\/.*
+sun\/.*
+org\/netbeans\/.*
+org\/openide\/.*
+com\/ibm\/crypto\/.*
+com\/ibm\/security\/.*
+org\/apache\/xerces\/.*
+dalvik\/.*
+java\/io\/ObjectStreamClass*
+apple\/.*
+com\/apple\/.*
+jdk\/.*
+org\/omg\/.*
+org\/w3c\/.*
--- /dev/null
+package soba.testdata.inheritance1;\r
+\r
+import soba.testdata.inheritance2.F;\r
+\r
+public class C {\r
+\r
+ protected int x;\r
+ \r
+ public static void main(String[] args) {\r
+ System.err.println(J.x);\r
+ F f = new F();\r
+ C c = f;\r
+ c.o();\r
+ f.o();\r
+ }\r
+ \r
+ public C(int x) {\r
+ System.err.println("C.<init>");\r
+ q(0.0);\r
+ }\r
+\r
+ protected void m() {\r
+ System.err.println("C.m");\r
+ }\r
+ \r
+ void n() {\r
+ System.err.println("C.n()");\r
+ }\r
+ \r
+ void o() {\r
+ System.err.println("C.o()");\r
+ }\r
+ \r
+ protected void p(int x) {\r
+ System.out.println("C.p(int)");\r
+ }\r
+ \r
+ private void q(double d) {\r
+ System.out.println("C.q(double)");\r
+ }\r
+ \r
+ public static void novariables() {\r
+ \r
+ }\r
+ \r
+ public void x(int t) {\r
+ System.out.println("C.x(int)");\r
+ }\r
+ \r
+ public void y(int t) {\r
+ System.out.println("C.y(int)");\r
+ }\r
+ \r
+ @Override\r
+ public String toString() {\r
+ return super.toString();\r
+ }\r
+}\r
--- /dev/null
+package soba.testdata.inheritance1;\r
+\r
+import soba.testdata.inheritance2.F;\r
+import soba.testdata.inheritance2.H;\r
+\r
+public class D extends C implements I, K {\r
+\r
+ \r
+ public D() {\r
+ this(K.x);\r
+ System.err.println("D.<init>");\r
+ }\r
+ \r
+ public D(int x) {\r
+ super(x);\r
+ System.err.println("D.<init>(int)");\r
+ }\r
+ \r
+ public void m() {\r
+ super.m();\r
+ System.err.println("D.m");\r
+ }\r
+ \r
+ public void testPackagePrivate() {\r
+ C c = new C(0);\r
+ c.n();\r
+ }\r
+\r
+ public void testPackagePrivate2() {\r
+ C c = new F();\r
+ c.n();\r
+ }\r
+\r
+ public void testPackagePrivate3() {\r
+ C c = new G();\r
+ c.n();\r
+ }\r
+\r
+ public void testPackagePrivate4() {\r
+ C c = new H();\r
+ c.n();\r
+ }\r
+\r
+ public void n() {\r
+ System.err.println("D.n()");\r
+ }\r
+ \r
+ public int example(int i, long l, double d, String s) {\r
+ return i;\r
+ }\r
+ \r
+ public void x(int t) {\r
+ System.out.println("D.x(int)");\r
+ }\r
+\r
+ @Override\r
+ public String toString() {\r
+ return super.toString();\r
+ }\r
+}\r
--- /dev/null
+package soba.testdata.inheritance1;\r
+\r
+public class G extends C {\r
+\r
+ public G() {\r
+ super(0);\r
+ }\r
+ \r
+ @Override\r
+ void n() {\r
+ super.n();\r
+ System.err.println("G.n()");\r
+ }\r
+ \r
+ public final void finalMethod() {\r
+ \r
+ }\r
+ \r
+ protected volatile int volatileField = 0;\r
+ public transient int transientField = 0;\r
+ private final int finalField = 0;\r
+ \r
+ \r
+ public class InternalG {\r
+ \r
+ public InternalG() {\r
+ super();\r
+ System.out.println();\r
+ }\r
+ \r
+ public void m() {\r
+ finalMethod();\r
+ n();\r
+ System.out.println(finalField);\r
+ }\r
+ \r
+ }\r
+ \r
+ public void x(int t) {\r
+ System.out.println("G.x(int)");\r
+ }\r
+\r
+}\r
--- /dev/null
+package soba.testdata.inheritance1;\r
+\r
+public interface I {\r
+\r
+ public static final int x = 2;\r
+ public void m();\r
+}\r
--- /dev/null
+package soba.testdata.inheritance1;\r
+\r
+public interface J {\r
+\r
+ public static final int x = 1;\r
+}\r
--- /dev/null
+package soba.testdata.inheritance1;\r
+\r
+public interface K extends I {\r
+\r
+}\r
--- /dev/null
+package soba.testdata.inheritance2;\r
+\r
+import java.util.ArrayList;\r
+import java.util.LinkedList;\r
+import java.util.List;\r
+\r
+import soba.testdata.inheritance1.C;\r
+import soba.testdata.inheritance1.D;\r
+import soba.testdata.inheritance1.G;\r
+\r
+public class E {\r
+\r
+ public static void main(String[] args) {\r
+ new E().exec();\r
+ }\r
+ \r
+ public E() {\r
+ D d = new D(0);\r
+ d.m();\r
+ }\r
+ \r
+ public void testPackagePrivate() {\r
+ F f = new F();\r
+ f.n();\r
+ }\r
+\r
+\r
+ public void exec() {\r
+ System.err.println("Hello, World!");\r
+ D d = new D();\r
+ d.testPackagePrivate();\r
+ d.testPackagePrivate2();\r
+ d.testPackagePrivate3();\r
+ d.testPackagePrivate4();\r
+ }\r
+ \r
+ private int flag;\r
+ \r
+ /*\r
+ * Test case:\r
+ * def1 -> use1, use2\r
+ * def2 -> use2\r
+ * VTA judges both use1 and use2 may call D.x(int) and G.x(int)\r
+ */\r
+ public void testDynamicBinding1() {\r
+ C c = new D(0); // def1\r
+ c.x(0); // use1\r
+ if (flag != 0) { \r
+ c = new G(); // def2\r
+ }\r
+ c.x(1); // use2\r
+ }\r
+ \r
+ /*\r
+ * Test case:\r
+ * def1 -> use1\r
+ * def2 -> use2\r
+ * Our VTA implementation judges use1 call D.x(int), use2 calls G.x(int)\r
+ * This is because our VTA uses a flow-sensitive data-flow analysis \r
+ * to distinguish local variable entries.\r
+ */\r
+ public void testDynamicBinding2() {\r
+ C c = new D(0); // def1 \r
+ c.x(0); // use1\r
+ c = new G(); // def2\r
+ c.x(1); // use2\r
+ }\r
+ \r
+ public void testDynamicBinding3() {\r
+ D d1 = new D(0); // def1 \r
+ d1.y(1); // use1 -- this invokes C.y() because D does not override C.y().\r
+ C d2 = new D(0); // def2 \r
+ d2.y(1); // use2\r
+ }\r
+\r
+ public void testDynamicBinding4(C c) {\r
+ if (c == null) {\r
+ c = new D(0);\r
+ }\r
+ testDynamicBinding5(c);\r
+ c.x(0);\r
+ }\r
+\r
+ public void testDynamicBinding5(C c) {\r
+ if (c == null) {\r
+ c = new G();\r
+ }\r
+ testDynamicBinding4(c);\r
+ c.x(1);\r
+ }\r
+ \r
+ public void testDynamicBinding6(L l) {\r
+ l.getC().x(0); // There are no implementation of getC()\r
+ }\r
+\r
+ public void testDynamicBinding7(boolean b) {\r
+ List<String> list;\r
+ if (b) {\r
+ list = new ArrayList<>();\r
+ } else {\r
+ list = new LinkedList<>();\r
+ }\r
+ int size =list.size();\r
+ }\r
+}\r
--- /dev/null
+package soba.testdata.inheritance2;\r
+\r
+import soba.testdata.inheritance1.C;\r
+\r
+public class F extends C {\r
+\r
+ public F() {\r
+ super(0);\r
+ }\r
+ \r
+ /**\r
+ * This method declaration does not override C.n()\r
+ * because C.n() is package-private.\r
+ */\r
+ void n() {\r
+ System.err.println("F.n()");\r
+ }\r
+ \r
+ public void o() {\r
+ System.err.println("F.o()");\r
+ }\r
+ \r
+ public void k() {\r
+ String[][][] array = new String[10][20][30];\r
+ System.err.println(array.toString());\r
+ String[] another = new String[10];\r
+ System.err.println(another.toString());\r
+ }\r
+}\r
--- /dev/null
+package soba.testdata.inheritance2;\r
+\r
+import soba.testdata.inheritance1.D;\r
+\r
+public class H extends D {\r
+\r
+ protected int x;\r
+ \r
+ public H() {\r
+ p(1);\r
+ q(0.1);\r
+ }\r
+ \r
+ @Override\r
+ public void n() {\r
+ System.err.println("H.n()");\r
+ }\r
+ \r
+ protected void p(int x) {\r
+ System.out.println("C.p(int)");\r
+ }\r
+ \r
+ private void q(double d) {\r
+ System.out.println("C.q(double)");\r
+ }\r
+\r
+}\r
--- /dev/null
+package soba.testdata.inheritance2;\r
+\r
+import soba.testdata.inheritance1.C;\r
+\r
+public abstract class L {\r
+\r
+ public abstract C getC();\r
+ \r
+}\r
--- /dev/null
+package demo.soba;\r
+\r
+import soba.core.ClassHierarchy;\r
+import soba.core.ClassInfo;\r
+import soba.core.JavaProgram;\r
+import soba.core.MethodInfo;\r
+import soba.core.method.CallSite;\r
+import soba.util.files.ClasspathUtil;\r
+\r
+public class ClassHierarchyPerformance {\r
+\r
+ public static void main(String[] args) {\r
+ JavaProgram program = new JavaProgram(ClasspathUtil.getClassList(args));\r
+ ClassHierarchy ch = program.getClassHierarchy();\r
+ \r
+ for (ClassInfo c: program.getClasses()) {\r
+ for (MethodInfo m: c.getMethods()) {\r
+ System.out.println(m.toLongString());\r
+ for (CallSite cs: m.getCallSites()) {\r
+ MethodInfo[] callees = ch.resolveCall(cs);\r
+ if (callees.length > 0) {\r
+ for (MethodInfo callee: callees) {\r
+ System.out.println(" [inside] " + callee.toLongString());\r
+ }\r
+ } else {\r
+ System.out.println(" [outside] " + cs.toString());\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+}\r
--- /dev/null
+package demo.soba;\r
+\r
+import soba.core.ClassInfo;\r
+import soba.core.JavaProgram;\r
+import soba.core.MethodInfo;\r
+import soba.util.IntPairProc;\r
+import soba.util.files.ClasspathUtil;\r
+import soba.util.graph.DirectedGraph;\r
+\r
+public class ControlDependencePerformance {\r
+\r
+ public static void main(String[] args) {\r
+ JavaProgram program = new JavaProgram(ClasspathUtil.getClassList(args));\r
+ for (ClassInfo c: program.getClasses()) {\r
+ for (MethodInfo m: c.getMethods()) {\r
+ DirectedGraph cd = m.getControlDependence();\r
+ cd.forEachEdge(new IntPairProc() {\r
+ @Override\r
+ public boolean execute(int elem1, int elem2) {\r
+ System.out.println("[Control] " + elem1 + " -> " + elem2);\r
+ return true;\r
+ }\r
+ });\r
+ }\r
+ }\r
+ }\r
+\r
+}\r
--- /dev/null
+package demo.soba;\r
+\r
+import soba.core.ClassInfo;\r
+import soba.core.JavaProgram;\r
+import soba.core.MethodInfo;\r
+import soba.core.method.DataDependence;\r
+import soba.core.method.DataFlowEdge;\r
+import soba.util.files.ClasspathUtil;\r
+\r
+public class DataDependencePerformance {\r
+\r
+ public static void main(String[] args) {\r
+ JavaProgram program = new JavaProgram(ClasspathUtil.getClassList(args));\r
+ for (ClassInfo c: program.getClasses()) {\r
+ for (MethodInfo m: c.getMethods()) {\r
+ DataDependence dd = m.getDataDependence();\r
+ for (DataFlowEdge e: dd.getEdges()) {\r
+ System.out.println(e.toString());\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+}\r
--- /dev/null
+package demo.wala;\r
+\r
+import java.io.File;\r
+import java.util.HashSet;\r
+import java.util.Set;\r
+\r
+import com.ibm.wala.classLoader.IMethod;\r
+import com.ibm.wala.core.tests.callGraph.CallGraphTestUtil;\r
+import com.ibm.wala.ipa.callgraph.AnalysisCache;\r
+import com.ibm.wala.ipa.callgraph.AnalysisOptions;\r
+import com.ibm.wala.ipa.callgraph.AnalysisScope;\r
+import com.ibm.wala.ipa.callgraph.CGNode;\r
+import com.ibm.wala.ipa.callgraph.CallGraph;\r
+import com.ibm.wala.ipa.callgraph.CallGraphStats;\r
+import com.ibm.wala.ipa.callgraph.Entrypoint;\r
+import com.ibm.wala.ipa.callgraph.impl.Util;\r
+import com.ibm.wala.ipa.cha.ClassHierarchy;\r
+import com.ibm.wala.types.MethodReference;\r
+import com.ibm.wala.util.config.AnalysisScopeReader;\r
+\r
+public class ClassHierarchyPerformance {\r
+\r
+ public static void main(String[] args) {\r
+ try {\r
+ String appJar = "sample.jar";\r
+ AnalysisScope scope = AnalysisScopeReader.makeJavaBinaryAnalysisScope(appJar, new File(CallGraphTestUtil.REGRESSION_EXCLUSIONS));\r
+\r
+ ClassHierarchy cha = ClassHierarchy.make(scope);\r
+\r
+ Iterable<Entrypoint> entrypoints = com.ibm.wala.ipa.callgraph.impl.Util.makeMainEntrypoints(scope, cha);\r
+ AnalysisOptions options = new AnalysisOptions(scope, entrypoints);\r
+ com.ibm.wala.ipa.callgraph.CallGraphBuilder builder = Util.makeZeroCFABuilder(options, new AnalysisCache(), cha, scope);\r
+ CallGraph cg = builder.makeCallGraph(options, null);\r
+\r
+ System.out.println(CallGraphStats.getStats(cg));\r
+\r
+ Set<MethodReference> methods = new HashSet<>();\r
+ for(int i = 0; i < cg.getMaxNumber(); i++) {\r
+ CGNode node = cg.getNode(i);\r
+ IMethod method = node.getMethod();\r
+ methods.add(method.getReference());\r
+ }\r
+ \r
+ for (MethodReference method: methods) {\r
+ System.out.println(method.toString());\r
+ Set<CGNode> nodes = cg.getNodes(method);\r
+ for (CGNode node: nodes) {\r
+ System.out.println(" " + node.getMethod().getReference().toString());\r
+ }\r
+ }\r
+ \r
+ } catch (Exception e) {\r
+ e.printStackTrace();\r
+ }\r
+ }\r
+ \r
+// public static void main(String[] args) {\r
+// try {\r
+// String appJar = "sample.jar";\r
+// AnalysisScope scope = AnalysisScopeReader.makeJavaBinaryAnalysisScope(appJar, new File(CallGraphTestUtil.REGRESSION_EXCLUSIONS));\r
+//\r
+// ClassHierarchy cha = ClassHierarchy.make(scope);\r
+//\r
+// Iterable<Entrypoint> entrypoints = com.ibm.wala.ipa.callgraph.impl.Util.makeMainEntrypoints(scope, cha);\r
+// AnalysisOptions options = new AnalysisOptions(scope, entrypoints);\r
+//\r
+// com.ibm.wala.ipa.callgraph.CallGraphBuilder builder = Util.makeZeroCFABuilder(options, new AnalysisCache(), cha, scope);\r
+// CallGraph cg = builder.makeCallGraph(options, null);\r
+//\r
+// System.out.println(CallGraphStats.getStats(cg));\r
+// \r
+// cg.getEntrypointNodes().forEach(node -> {\r
+// System.out.println(node.getMethod().getName().toString());\r
+// });\r
+// } catch (Exception e) {\r
+// e.printStackTrace();\r
+// }\r
+// }\r
+\r
+}\r
--- /dev/null
+package demo.wala;\r
+\r
+import java.util.Iterator;\r
+\r
+import com.ibm.wala.cfg.cdg.ControlDependenceGraph;\r
+import com.ibm.wala.classLoader.IMethod;\r
+import com.ibm.wala.core.tests.callGraph.CallGraphTestUtil;\r
+import com.ibm.wala.ipa.callgraph.AnalysisCache;\r
+import com.ibm.wala.ipa.callgraph.AnalysisOptions;\r
+import com.ibm.wala.ipa.callgraph.AnalysisScope;\r
+import com.ibm.wala.ipa.callgraph.impl.Everywhere;\r
+import com.ibm.wala.ipa.cha.ClassHierarchy;\r
+import com.ibm.wala.ssa.IR;\r
+import com.ibm.wala.ssa.ISSABasicBlock;\r
+import com.ibm.wala.ssa.SSAInstruction;\r
+import com.ibm.wala.ssa.SSAOptions;\r
+import com.ibm.wala.types.MethodReference;\r
+import com.ibm.wala.util.config.AnalysisScopeReader;\r
+import com.ibm.wala.util.debug.Assertions;\r
+import com.ibm.wala.util.io.FileProvider;\r
+import com.ibm.wala.util.strings.StringStuff;\r
+\r
+public class ControlDependencePeformance {\r
+\r
+ public static void main(String[] args) {\r
+ try {\r
+ String appJar = "sample.jar";\r
+ String methodSig = "demo.sample.Sample.main([Ljava/lang/String;)V";\r
+ \r
+ AnalysisScope scope = AnalysisScopeReader.makeJavaBinaryAnalysisScope(appJar, (new FileProvider()).getFile(CallGraphTestUtil.REGRESSION_EXCLUSIONS));\r
+\r
+ ClassHierarchy cha = ClassHierarchy.make(scope);\r
+\r
+ MethodReference mr = StringStuff.makeMethodReference(methodSig);\r
+\r
+ IMethod m = cha.resolveMethod(mr);\r
+ if (m == null) {\r
+ System.err.println("could not resolve " + mr);\r
+ throw new RuntimeException();\r
+ }\r
+ AnalysisOptions options = new AnalysisOptions();\r
+ options.getSSAOptions().setPiNodePolicy(SSAOptions.getAllBuiltInPiNodes());\r
+ AnalysisCache cache = new AnalysisCache();\r
+ IR ir = cache.getSSACache().findOrCreateIR(m, Everywhere.EVERYWHERE, options.getSSAOptions() );\r
+\r
+ if (ir == null) {\r
+ Assertions.UNREACHABLE("Null IR for " + m);\r
+ }\r
+\r
+ System.err.println(ir.toString());\r
+ ControlDependenceGraph<SSAInstruction, ISSABasicBlock> cdg = new ControlDependenceGraph<>(ir.getControlFlowGraph());\r
+ System.out.println(cdg.toString());\r
+ } catch (Exception e) {\r
+ e.printStackTrace();\r
+ }\r
+ }\r
+\r
+}\r
--- /dev/null
+package demo.wala;\r
+\r
+import java.io.File;\r
+import java.io.IOException;\r
+import java.util.Collection;\r
+import java.util.Iterator;\r
+\r
+import com.ibm.wala.classLoader.ShrikeBTMethod;\r
+import com.ibm.wala.core.tests.callGraph.CallGraphTestUtil;\r
+import com.ibm.wala.ipa.callgraph.AnalysisCache;\r
+import com.ibm.wala.ipa.callgraph.AnalysisOptions;\r
+import com.ibm.wala.ipa.callgraph.AnalysisScope;\r
+import com.ibm.wala.ipa.callgraph.CGNode;\r
+import com.ibm.wala.ipa.callgraph.CallGraph;\r
+import com.ibm.wala.ipa.callgraph.CallGraphBuilder;\r
+import com.ibm.wala.ipa.callgraph.CallGraphBuilderCancelException;\r
+import com.ibm.wala.ipa.callgraph.Entrypoint;\r
+import com.ibm.wala.ipa.callgraph.impl.Util;\r
+import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;\r
+import com.ibm.wala.ipa.cha.ClassHierarchy;\r
+import com.ibm.wala.ipa.slicer.NormalStatement;\r
+import com.ibm.wala.ipa.slicer.Slicer;\r
+import com.ibm.wala.ipa.slicer.Statement;\r
+import com.ibm.wala.ssa.IR;\r
+import com.ibm.wala.ssa.SSAInstruction;\r
+import com.ibm.wala.types.Descriptor;\r
+import com.ibm.wala.util.CancelException;\r
+import com.ibm.wala.util.WalaException;\r
+import com.ibm.wala.util.config.AnalysisScopeReader;\r
+import com.ibm.wala.util.debug.Assertions;\r
+import com.ibm.wala.util.strings.Atom;\r
+\r
+public class SlicerMain {\r
+\r
+ public static void main(String[] args) {\r
+ try {\r
+ if (args.length > 0) {\r
+ doSlicing(args[0]);\r
+ }\r
+ } catch (Exception e) {\r
+ e.printStackTrace();\r
+ }\r
+ }\r
+\r
+ public static void doSlicing(String appJar) throws WalaException, IOException, IllegalArgumentException, CancelException {\r
+ // create an analysis scope representing the appJar as a J2SE application\r
+// AnalysisScope scope = AnalysisScopeReader.makeJavaBinaryAnalysisScope(appJar,CallGraphTestUtil.REGRESSION_EXCLUSIONS);\r
+// AnalysisScope scope = AnalysisScopeReader.makeJavaBinaryAnalysisScope(appJar, null);\r
+ AnalysisScope scope = AnalysisScopeReader.makeJavaBinaryAnalysisScope(appJar,new File(CallGraphTestUtil.REGRESSION_EXCLUSIONS));\r
+ ClassHierarchy cha = ClassHierarchy.make(scope);\r
+\r
+ Iterable<Entrypoint> entrypoints = com.ibm.wala.ipa.callgraph.impl.Util.makeMainEntrypoints(scope, cha);\r
+ AnalysisOptions options = new AnalysisOptions(scope, entrypoints);\r
+\r
+ // build the call graph\r
+ com.ibm.wala.ipa.callgraph.CallGraphBuilder cgb = Util.makeZeroCFABuilder(options, new AnalysisCache(),cha, scope, null, null);\r
+// CallGraph cg = cgb.makeCallGraph(options);\r
+ CallGraph cg = cgb.makeCallGraph(options, null);\r
+ PointerAnalysis pa = cgb.getPointerAnalysis();\r
+\r
+ // find seed statement\r
+ Statement statement = findCallTo(findMainMethod(cg), "println");\r
+\r
+ Collection<Statement> slice;\r
+\r
+ // context-sensitive traditional slice\r
+ slice = Slicer.computeBackwardSlice ( statement, cg, pa );\r
+ dumpSlice(slice);\r
+\r
+ slice.stream()\r
+ .mapToInt(s -> getLineNumber(s))\r
+ .filter(line -> line != -1)\r
+ .mapToObj(line -> "line = " + line)\r
+ .forEach(System.out::println);\r
+ \r
+ // context-sensitive thin slice\r
+ // slice = Slicer.computeBackwardSlice(statement, cg, pa, DataDependenceOptions.NO_BASE_PTRS,\r
+ // ControlDependenceOptions.NONE);\r
+ // dumpSlice(slice);\r
+ //\r
+ // // context-insensitive slice\r
+ // ThinSlicer ts = new ThinSlicer(cg,pa);\r
+ // Collection<Statement> slice = ts.computeBackwardThinSlice ( statement );\r
+ // dumpSlice(slice);\r
+ }\r
+\r
+ public static int getLineNumber(Statement s) {\r
+ if (s.getKind() == Statement.Kind.NORMAL) { // ignore special kinds of statements\r
+ int bcIndex, instructionIndex = ((NormalStatement) s).getInstructionIndex();\r
+ try {\r
+ bcIndex = ((ShrikeBTMethod) s.getNode().getMethod()).getBytecodeIndex(instructionIndex);\r
+ try {\r
+ int src_line_number = s.getNode().getMethod().getLineNumber(bcIndex);\r
+ return src_line_number;\r
+// System.err.println ( "Source line number = " + src_line_number );\r
+ } catch (Exception e) {\r
+// System.err.println("Bytecode index no good");\r
+// System.err.println(e.getMessage());\r
+ return -1;\r
+ }\r
+ } catch (Exception e ) {\r
+ return -1;\r
+// System.err.println("it's probably not a BT method (e.g. it's a fakeroot method)");\r
+// System.err.println(e.getMessage());\r
+ }\r
+ }\r
+ return -1;\r
+ }\r
+ \r
+ public static CGNode findMainMethod(CallGraph cg) {\r
+ Descriptor d = Descriptor.findOrCreateUTF8("([Ljava/lang/String;)V");\r
+ Atom name = Atom.findOrCreateUnicodeAtom("main");\r
+ for (Iterator<? extends CGNode> it = cg.getSuccNodes(cg.getFakeRootNode()); it.hasNext();) {\r
+ CGNode n = it.next();\r
+ if (n.getMethod().getName().equals(name) && n.getMethod().getDescriptor().equals(d)) {\r
+ return n;\r
+ }\r
+ }\r
+ Assertions.UNREACHABLE("failed to find main() method");\r
+ return null;\r
+ }\r
+\r
+ public static Statement findCallTo(CGNode n, String methodName) {\r
+ IR ir = n.getIR();\r
+ for (Iterator<SSAInstruction> it = ir.iterateAllInstructions(); it.hasNext();) {\r
+ SSAInstruction s = it.next();\r
+ if (s instanceof com.ibm.wala.ssa.SSAAbstractInvokeInstruction) {\r
+ com.ibm.wala.ssa.SSAAbstractInvokeInstruction call = (com.ibm.wala.ssa.SSAAbstractInvokeInstruction) s;\r
+ if (call.getCallSite().getDeclaredTarget().getName().toString().equals(methodName)) {\r
+ com.ibm.wala.util.intset.IntSet indices = ir.getCallInstructionIndices(call.getCallSite());\r
+ com.ibm.wala.util.debug.Assertions.productionAssertion(indices.size() == 1, "expected 1 but got " + indices.size());\r
+ return new com.ibm.wala.ipa.slicer.NormalStatement(n, indices.intIterator().next());\r
+ }\r
+ }\r
+ }\r
+ Assertions.UNREACHABLE("failed to find call to " + methodName + " in " + n);\r
+ return null;\r
+ }\r
+\r
+ public static void dumpSlice(Collection<Statement> slice) {\r
+ for (Statement s : slice) {\r
+// System.err.println(s);\r
+ System.out.println(s);\r
+ }\r
+ }\r
+\r
+}\r