4 import java.io.IOException;
\r
5 import java.util.Collection;
\r
6 import java.util.Iterator;
\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
33 public class SlicerMain {
\r
35 public static void main(String[] args) {
\r
37 if (args.length > 0) {
\r
40 } catch (Exception e) {
\r
41 e.printStackTrace();
\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
52 Iterable<Entrypoint> entrypoints = com.ibm.wala.ipa.callgraph.impl.Util.makeMainEntrypoints(scope, cha);
\r
53 AnalysisOptions options = new AnalysisOptions(scope, entrypoints);
\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
61 // find seed statement
\r
62 Statement statement = findCallTo(findMainMethod(cg), "println");
\r
64 Collection<Statement> slice;
\r
66 // context-sensitive traditional slice
\r
67 slice = Slicer.computeBackwardSlice ( statement, cg, pa );
\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
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
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
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
91 bcIndex = ((ShrikeBTMethod) s.getNode().getMethod()).getBytecodeIndex(instructionIndex);
\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
101 } catch (Exception e ) {
\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
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
119 Assertions.UNREACHABLE("failed to find main() method");
\r
123 public static Statement findCallTo(CGNode n, String methodName) {
\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
136 Assertions.UNREACHABLE("failed to find call to " + methodName + " in " + n);
\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