OSDN Git Service

initial commit
authort-hatano <tnotawa@gmail.com>
Wed, 20 Jan 2016 15:05:18 +0000 (00:05 +0900)
committert-hatano <tnotawa@gmail.com>
Wed, 20 Jan 2016 15:05:18 +0000 (00:05 +0900)
22 files changed:
JavaAnalysisToolsDemo/.classpath [new file with mode: 0644]
JavaAnalysisToolsDemo/.gitignore [new file with mode: 0644]
JavaAnalysisToolsDemo/.project [new file with mode: 0644]
JavaAnalysisToolsDemo/.settings/org.eclipse.jdt.core.prefs [new file with mode: 0644]
JavaAnalysisToolsDemo/Java60RegressionExclusions.txt [new file with mode: 0644]
JavaAnalysisToolsDemo/sample/soba/testdata/inheritance1/C.java [new file with mode: 0644]
JavaAnalysisToolsDemo/sample/soba/testdata/inheritance1/D.java [new file with mode: 0644]
JavaAnalysisToolsDemo/sample/soba/testdata/inheritance1/G.java [new file with mode: 0644]
JavaAnalysisToolsDemo/sample/soba/testdata/inheritance1/I.java [new file with mode: 0644]
JavaAnalysisToolsDemo/sample/soba/testdata/inheritance1/J.java [new file with mode: 0644]
JavaAnalysisToolsDemo/sample/soba/testdata/inheritance1/K.java [new file with mode: 0644]
JavaAnalysisToolsDemo/sample/soba/testdata/inheritance2/E.java [new file with mode: 0644]
JavaAnalysisToolsDemo/sample/soba/testdata/inheritance2/F.java [new file with mode: 0644]
JavaAnalysisToolsDemo/sample/soba/testdata/inheritance2/H.java [new file with mode: 0644]
JavaAnalysisToolsDemo/sample/soba/testdata/inheritance2/L.java [new file with mode: 0644]
JavaAnalysisToolsDemo/src/demo/soba/ClassHierarchyPerformance.java [new file with mode: 0644]
JavaAnalysisToolsDemo/src/demo/soba/ControlDependencePerformance.java [new file with mode: 0644]
JavaAnalysisToolsDemo/src/demo/soba/DataDependencePerformance.java [new file with mode: 0644]
JavaAnalysisToolsDemo/src/demo/wala/ClassHierarchyPerformance.java [new file with mode: 0644]
JavaAnalysisToolsDemo/src/demo/wala/ControlDependencePeformance.java [new file with mode: 0644]
JavaAnalysisToolsDemo/src/demo/wala/SlicerMain.java [new file with mode: 0644]
JavaAnalysisToolsDemo/testdata.jar [new file with mode: 0644]

diff --git a/JavaAnalysisToolsDemo/.classpath b/JavaAnalysisToolsDemo/.classpath
new file mode 100644 (file)
index 0000000..5dc1e2c
--- /dev/null
@@ -0,0 +1,12 @@
+<?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
diff --git a/JavaAnalysisToolsDemo/.gitignore b/JavaAnalysisToolsDemo/.gitignore
new file mode 100644 (file)
index 0000000..ae3c172
--- /dev/null
@@ -0,0 +1 @@
+/bin/
diff --git a/JavaAnalysisToolsDemo/.project b/JavaAnalysisToolsDemo/.project
new file mode 100644 (file)
index 0000000..7726d62
--- /dev/null
@@ -0,0 +1,17 @@
+<?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
diff --git a/JavaAnalysisToolsDemo/.settings/org.eclipse.jdt.core.prefs b/JavaAnalysisToolsDemo/.settings/org.eclipse.jdt.core.prefs
new file mode 100644 (file)
index 0000000..bb35fa0
--- /dev/null
@@ -0,0 +1,11 @@
+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
diff --git a/JavaAnalysisToolsDemo/Java60RegressionExclusions.txt b/JavaAnalysisToolsDemo/Java60RegressionExclusions.txt
new file mode 100644 (file)
index 0000000..0a868f5
--- /dev/null
@@ -0,0 +1,18 @@
+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\/.*
diff --git a/JavaAnalysisToolsDemo/sample/soba/testdata/inheritance1/C.java b/JavaAnalysisToolsDemo/sample/soba/testdata/inheritance1/C.java
new file mode 100644 (file)
index 0000000..6b5301a
--- /dev/null
@@ -0,0 +1,58 @@
+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
diff --git a/JavaAnalysisToolsDemo/sample/soba/testdata/inheritance1/D.java b/JavaAnalysisToolsDemo/sample/soba/testdata/inheritance1/D.java
new file mode 100644 (file)
index 0000000..be6d70d
--- /dev/null
@@ -0,0 +1,60 @@
+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
diff --git a/JavaAnalysisToolsDemo/sample/soba/testdata/inheritance1/G.java b/JavaAnalysisToolsDemo/sample/soba/testdata/inheritance1/G.java
new file mode 100644 (file)
index 0000000..1b34a8e
--- /dev/null
@@ -0,0 +1,43 @@
+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
diff --git a/JavaAnalysisToolsDemo/sample/soba/testdata/inheritance1/I.java b/JavaAnalysisToolsDemo/sample/soba/testdata/inheritance1/I.java
new file mode 100644 (file)
index 0000000..e7e476f
--- /dev/null
@@ -0,0 +1,7 @@
+package soba.testdata.inheritance1;\r
+\r
+public interface I {\r
+\r
+       public static final int x = 2;\r
+       public void m();\r
+}\r
diff --git a/JavaAnalysisToolsDemo/sample/soba/testdata/inheritance1/J.java b/JavaAnalysisToolsDemo/sample/soba/testdata/inheritance1/J.java
new file mode 100644 (file)
index 0000000..45b558b
--- /dev/null
@@ -0,0 +1,6 @@
+package soba.testdata.inheritance1;\r
+\r
+public interface J {\r
+\r
+       public static final int x = 1;\r
+}\r
diff --git a/JavaAnalysisToolsDemo/sample/soba/testdata/inheritance1/K.java b/JavaAnalysisToolsDemo/sample/soba/testdata/inheritance1/K.java
new file mode 100644 (file)
index 0000000..854e324
--- /dev/null
@@ -0,0 +1,5 @@
+package soba.testdata.inheritance1;\r
+\r
+public interface K extends I {\r
+\r
+}\r
diff --git a/JavaAnalysisToolsDemo/sample/soba/testdata/inheritance2/E.java b/JavaAnalysisToolsDemo/sample/soba/testdata/inheritance2/E.java
new file mode 100644 (file)
index 0000000..93273ba
--- /dev/null
@@ -0,0 +1,105 @@
+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
diff --git a/JavaAnalysisToolsDemo/sample/soba/testdata/inheritance2/F.java b/JavaAnalysisToolsDemo/sample/soba/testdata/inheritance2/F.java
new file mode 100644 (file)
index 0000000..5c0dbf1
--- /dev/null
@@ -0,0 +1,29 @@
+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
diff --git a/JavaAnalysisToolsDemo/sample/soba/testdata/inheritance2/H.java b/JavaAnalysisToolsDemo/sample/soba/testdata/inheritance2/H.java
new file mode 100644 (file)
index 0000000..9e3b0d3
--- /dev/null
@@ -0,0 +1,27 @@
+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
diff --git a/JavaAnalysisToolsDemo/sample/soba/testdata/inheritance2/L.java b/JavaAnalysisToolsDemo/sample/soba/testdata/inheritance2/L.java
new file mode 100644 (file)
index 0000000..180c6a8
--- /dev/null
@@ -0,0 +1,9 @@
+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
diff --git a/JavaAnalysisToolsDemo/src/demo/soba/ClassHierarchyPerformance.java b/JavaAnalysisToolsDemo/src/demo/soba/ClassHierarchyPerformance.java
new file mode 100644 (file)
index 0000000..31a0ff1
--- /dev/null
@@ -0,0 +1,33 @@
+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
diff --git a/JavaAnalysisToolsDemo/src/demo/soba/ControlDependencePerformance.java b/JavaAnalysisToolsDemo/src/demo/soba/ControlDependencePerformance.java
new file mode 100644 (file)
index 0000000..5bb8d52
--- /dev/null
@@ -0,0 +1,28 @@
+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
diff --git a/JavaAnalysisToolsDemo/src/demo/soba/DataDependencePerformance.java b/JavaAnalysisToolsDemo/src/demo/soba/DataDependencePerformance.java
new file mode 100644 (file)
index 0000000..bf5ff9a
--- /dev/null
@@ -0,0 +1,24 @@
+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
diff --git a/JavaAnalysisToolsDemo/src/demo/wala/ClassHierarchyPerformance.java b/JavaAnalysisToolsDemo/src/demo/wala/ClassHierarchyPerformance.java
new file mode 100644 (file)
index 0000000..1811f10
--- /dev/null
@@ -0,0 +1,80 @@
+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
diff --git a/JavaAnalysisToolsDemo/src/demo/wala/ControlDependencePeformance.java b/JavaAnalysisToolsDemo/src/demo/wala/ControlDependencePeformance.java
new file mode 100644 (file)
index 0000000..235cfe9
--- /dev/null
@@ -0,0 +1,58 @@
+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
diff --git a/JavaAnalysisToolsDemo/src/demo/wala/SlicerMain.java b/JavaAnalysisToolsDemo/src/demo/wala/SlicerMain.java
new file mode 100644 (file)
index 0000000..398cf74
--- /dev/null
@@ -0,0 +1,147 @@
+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
diff --git a/JavaAnalysisToolsDemo/testdata.jar b/JavaAnalysisToolsDemo/testdata.jar
new file mode 100644 (file)
index 0000000..520c43f
Binary files /dev/null and b/JavaAnalysisToolsDemo/testdata.jar differ