OSDN Git Service

initial commit
[soba/JavaAnalysisToolsDemo.git] / JavaAnalysisToolsDemo / src / demo / wala / SlicerMain.java
1 package demo.wala;\r
2 \r
3 import java.io.File;\r
4 import java.io.IOException;\r
5 import java.util.Collection;\r
6 import java.util.Iterator;\r
7 \r
8 import com.ibm.wala.classLoader.ShrikeBTMethod;\r
9 import com.ibm.wala.core.tests.callGraph.CallGraphTestUtil;\r
10 import com.ibm.wala.ipa.callgraph.AnalysisCache;\r
11 import com.ibm.wala.ipa.callgraph.AnalysisOptions;\r
12 import com.ibm.wala.ipa.callgraph.AnalysisScope;\r
13 import com.ibm.wala.ipa.callgraph.CGNode;\r
14 import com.ibm.wala.ipa.callgraph.CallGraph;\r
15 import com.ibm.wala.ipa.callgraph.CallGraphBuilder;\r
16 import com.ibm.wala.ipa.callgraph.CallGraphBuilderCancelException;\r
17 import com.ibm.wala.ipa.callgraph.Entrypoint;\r
18 import com.ibm.wala.ipa.callgraph.impl.Util;\r
19 import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;\r
20 import com.ibm.wala.ipa.cha.ClassHierarchy;\r
21 import com.ibm.wala.ipa.slicer.NormalStatement;\r
22 import com.ibm.wala.ipa.slicer.Slicer;\r
23 import com.ibm.wala.ipa.slicer.Statement;\r
24 import com.ibm.wala.ssa.IR;\r
25 import com.ibm.wala.ssa.SSAInstruction;\r
26 import com.ibm.wala.types.Descriptor;\r
27 import com.ibm.wala.util.CancelException;\r
28 import com.ibm.wala.util.WalaException;\r
29 import com.ibm.wala.util.config.AnalysisScopeReader;\r
30 import com.ibm.wala.util.debug.Assertions;\r
31 import com.ibm.wala.util.strings.Atom;\r
32 \r
33 public class SlicerMain {\r
34 \r
35         public static void main(String[] args) {\r
36                 try {\r
37                         if (args.length > 0) {\r
38                                 doSlicing(args[0]);\r
39                         }\r
40                 } catch (Exception e) {\r
41                         e.printStackTrace();\r
42                 }\r
43         }\r
44 \r
45         public static void doSlicing(String appJar) throws WalaException, IOException, IllegalArgumentException, CancelException {\r
46                 // create an analysis scope representing the appJar as a J2SE application\r
47 //              AnalysisScope scope = AnalysisScopeReader.makeJavaBinaryAnalysisScope(appJar,CallGraphTestUtil.REGRESSION_EXCLUSIONS);\r
48 //              AnalysisScope scope = AnalysisScopeReader.makeJavaBinaryAnalysisScope(appJar, null);\r
49                 AnalysisScope scope = AnalysisScopeReader.makeJavaBinaryAnalysisScope(appJar,new File(CallGraphTestUtil.REGRESSION_EXCLUSIONS));\r
50                 ClassHierarchy cha = ClassHierarchy.make(scope);\r
51 \r
52                 Iterable<Entrypoint> entrypoints = com.ibm.wala.ipa.callgraph.impl.Util.makeMainEntrypoints(scope, cha);\r
53                 AnalysisOptions options = new AnalysisOptions(scope, entrypoints);\r
54 \r
55                 // build the call graph\r
56                 com.ibm.wala.ipa.callgraph.CallGraphBuilder cgb = Util.makeZeroCFABuilder(options, new AnalysisCache(),cha, scope, null, null);\r
57 //              CallGraph cg = cgb.makeCallGraph(options);\r
58                 CallGraph cg = cgb.makeCallGraph(options, null);\r
59                 PointerAnalysis pa = cgb.getPointerAnalysis();\r
60 \r
61                 // find seed statement\r
62                 Statement statement = findCallTo(findMainMethod(cg), "println");\r
63 \r
64                 Collection<Statement> slice;\r
65 \r
66                 // context-sensitive traditional slice\r
67                 slice = Slicer.computeBackwardSlice ( statement, cg, pa );\r
68                 dumpSlice(slice);\r
69 \r
70                 slice.stream()\r
71                         .mapToInt(s -> getLineNumber(s))\r
72                         .filter(line -> line != -1)\r
73                         .mapToObj(line -> "line = " + line)\r
74                         .forEach(System.out::println);\r
75                 \r
76                 // context-sensitive thin slice\r
77                 //          slice = Slicer.computeBackwardSlice(statement, cg, pa, DataDependenceOptions.NO_BASE_PTRS,\r
78                 //              ControlDependenceOptions.NONE);\r
79                 //          dumpSlice(slice);\r
80                 //\r
81                 //          // context-insensitive slice\r
82                 //          ThinSlicer ts = new ThinSlicer(cg,pa);\r
83                 //          Collection<Statement> slice = ts.computeBackwardThinSlice ( statement );\r
84                 //          dumpSlice(slice);\r
85         }\r
86 \r
87         public static int getLineNumber(Statement s) {\r
88                 if (s.getKind() == Statement.Kind.NORMAL) { // ignore special kinds of statements\r
89                         int bcIndex, instructionIndex = ((NormalStatement) s).getInstructionIndex();\r
90                         try {\r
91                                 bcIndex = ((ShrikeBTMethod) s.getNode().getMethod()).getBytecodeIndex(instructionIndex);\r
92                                 try {\r
93                                         int src_line_number = s.getNode().getMethod().getLineNumber(bcIndex);\r
94                                         return src_line_number;\r
95 //                                      System.err.println ( "Source line number = " + src_line_number );\r
96                                 } catch (Exception e) {\r
97 //                                      System.err.println("Bytecode index no good");\r
98 //                                      System.err.println(e.getMessage());\r
99                                         return -1;\r
100                                 }\r
101                         } catch (Exception e ) {\r
102                                 return -1;\r
103 //                              System.err.println("it's probably not a BT method (e.g. it's a fakeroot method)");\r
104 //                              System.err.println(e.getMessage());\r
105                         }\r
106                 }\r
107                 return -1;\r
108         }\r
109         \r
110         public static CGNode findMainMethod(CallGraph cg) {\r
111                 Descriptor d = Descriptor.findOrCreateUTF8("([Ljava/lang/String;)V");\r
112                 Atom name = Atom.findOrCreateUnicodeAtom("main");\r
113                 for (Iterator<? extends CGNode> it = cg.getSuccNodes(cg.getFakeRootNode()); it.hasNext();) {\r
114                         CGNode n = it.next();\r
115                         if (n.getMethod().getName().equals(name) && n.getMethod().getDescriptor().equals(d)) {\r
116                                 return n;\r
117                         }\r
118                 }\r
119                 Assertions.UNREACHABLE("failed to find main() method");\r
120                 return null;\r
121         }\r
122 \r
123         public static Statement findCallTo(CGNode n, String methodName) {\r
124                 IR ir = n.getIR();\r
125                 for (Iterator<SSAInstruction> it = ir.iterateAllInstructions(); it.hasNext();) {\r
126                         SSAInstruction s = it.next();\r
127                         if (s instanceof com.ibm.wala.ssa.SSAAbstractInvokeInstruction) {\r
128                                 com.ibm.wala.ssa.SSAAbstractInvokeInstruction call = (com.ibm.wala.ssa.SSAAbstractInvokeInstruction) s;\r
129                                 if (call.getCallSite().getDeclaredTarget().getName().toString().equals(methodName)) {\r
130                                         com.ibm.wala.util.intset.IntSet indices = ir.getCallInstructionIndices(call.getCallSite());\r
131                                         com.ibm.wala.util.debug.Assertions.productionAssertion(indices.size() == 1, "expected 1 but got " + indices.size());\r
132                                         return new com.ibm.wala.ipa.slicer.NormalStatement(n, indices.intIterator().next());\r
133                                 }\r
134                         }\r
135                 }\r
136                 Assertions.UNREACHABLE("failed to find call to " + methodName + " in " + n);\r
137                 return null;\r
138         }\r
139 \r
140         public static void dumpSlice(Collection<Statement> slice) {\r
141                 for (Statement s : slice) {\r
142 //                      System.err.println(s);\r
143                         System.out.println(s);\r
144                 }\r
145         }\r
146 \r
147 }\r