Last active
February 16, 2020 01:16
-
-
Save ufarooq/6c9937fbdc20706a749c2b556cf52482 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package android.wala.test; | |
import android.wala.CallGraphSearchUtil; | |
import android.wala.ExampleUtil; | |
import com.ibm.wala.cast.ir.ssa.AstIRFactory; | |
import com.ibm.wala.cast.java.client.impl.ZeroOneContainerCFABuilderFactory; | |
import com.ibm.wala.cast.java.ipa.callgraph.JavaSourceAnalysisScope; | |
import com.ibm.wala.cast.java.ipa.modref.AstJavaModRef; | |
import com.ibm.wala.cast.java.ipa.slicer.AstJavaSlicer; | |
import com.ibm.wala.cast.java.translator.jdt.ecj.ECJClassLoaderFactory; | |
import com.ibm.wala.classLoader.SourceDirectoryTreeModule; | |
import com.ibm.wala.ipa.callgraph.*; | |
import com.ibm.wala.ipa.callgraph.impl.Util; | |
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey; | |
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis; | |
import com.ibm.wala.ipa.cha.ClassHierarchyException; | |
import com.ibm.wala.ipa.cha.ClassHierarchyFactory; | |
import com.ibm.wala.ipa.cha.IClassHierarchy; | |
import com.ibm.wala.ipa.slicer.SDG; | |
import com.ibm.wala.ipa.slicer.Slicer; | |
import com.ibm.wala.ipa.slicer.Statement; | |
import com.ibm.wala.ipa.slicer.thin.ThinSlicer; | |
import com.ibm.wala.properties.WalaProperties; | |
import com.ibm.wala.ssa.IR; | |
import com.ibm.wala.ssa.SSAInstruction; | |
import com.ibm.wala.types.ClassLoaderReference; | |
import com.ibm.wala.util.CancelException; | |
import com.ibm.wala.util.debug.Assertions; | |
import com.ibm.wala.util.graph.GraphIntegrity; | |
import com.ibm.wala.util.io.CommandLine; | |
import com.ibm.wala.util.warnings.Warnings; | |
import java.io.File; | |
import java.io.IOException; | |
import java.util.Collection; | |
import java.util.Iterator; | |
import java.util.Properties; | |
import java.util.jar.JarFile; | |
public class AnalyzeJava { | |
public static void main(String[] args) throws IOException, ClassHierarchyException, IllegalArgumentException, | |
CancelException { | |
long start = System.currentTimeMillis(); | |
Properties p = CommandLine.parse(args); | |
String mainClass = p.getProperty("mainClass"); | |
String sourceDir = p.getProperty("sourceDir"); | |
AnalysisScope scope = new JavaSourceAnalysisScope(); | |
// set exclusions. we use these exclusions as standard for handling JDK 8 | |
String[] stdlibs = WalaProperties.getJ2SEJarFiles(); | |
for (int i = 0; i < stdlibs.length; i++) { | |
scope.addToScope(ClassLoaderReference.Primordial, new JarFile(stdlibs[i])); | |
} | |
// add the source directory | |
scope.addToScope(JavaSourceAnalysisScope.SOURCE, new SourceDirectoryTreeModule(new File(sourceDir))); | |
ExampleUtil.addDefaultExclusions(scope); | |
IClassHierarchy cha = ClassHierarchyFactory.make(scope, new ECJClassLoaderFactory(scope.getExclusions())); | |
System.out.println(cha.getNumberOfClasses() + " classes"); | |
System.out.println(Warnings.asString()); | |
Warnings.clear(); | |
AnalysisOptions options = new AnalysisOptions(); | |
Iterable<Entrypoint> entrypoints = Util.makeMainEntrypoints(JavaSourceAnalysisScope.SOURCE, cha, new String[]{mainClass}); | |
options.setEntrypoints(entrypoints); | |
// you can dial down reflection handling if you like | |
IAnalysisCacheView cache = new AnalysisCacheImpl(AstIRFactory.makeDefaultFactory()); | |
// other builders can be constructed with different Util methods | |
CallGraphBuilder<?> builder = new ZeroOneContainerCFABuilderFactory().make(options, cache, cha, scope); | |
System.out.println("building call graph..."); | |
CallGraph cg = builder.makeCallGraph(options, null); | |
long end = System.currentTimeMillis(); | |
System.out.println("done"); | |
System.out.println("took " + (end - start) + "ms"); | |
System.out.println(CallGraphStats.getStats(cg)); | |
PointerAnalysis pa = builder.getPointerAnalysis(); | |
//PointerAnalysis<InstanceKey> ptr = builder.getPointerAnalysis(); | |
Slicer.DataDependenceOptions data = Slicer.DataDependenceOptions.NO_HEAP; | |
Slicer.ControlDependenceOptions control = Slicer.ControlDependenceOptions.FULL; | |
SDG<InstanceKey> sdg = new SDG<InstanceKey>(cg, pa, new AstJavaModRef<InstanceKey>(), data, control); | |
CGNode mainMethod = CallGraphSearchUtil.findMainMethod(cg); | |
CGNode clickHandler = CallGraphSearchUtil.findMethod(cg, "test"); | |
System.out.println(clickHandler.getMethod().getName()); | |
// find seed statement | |
Statement statement = findCallTo(clickHandler, "setName"); | |
Collection<Statement> slice; | |
// context-sensitive traditional slice | |
System.err.println(" context-sensitive traditional slice"); | |
slice = AstJavaSlicer.computeBackwardSlice(sdg, statement); | |
dumpSlice(slice); | |
// context-sensitive thin slice | |
System.err.println("context-sensitive thin slice"); | |
slice = AstJavaSlicer.computeBackwardSlice(statement, cg, pa, Slicer.DataDependenceOptions.NO_BASE_PTRS, | |
Slicer.ControlDependenceOptions.NONE); | |
dumpSlice(slice); | |
// context-insensitive slice | |
System.err.println("context-insensitive slice"); | |
ThinSlicer ts = new ThinSlicer(cg, pa); | |
slice = ts.computeBackwardThinSlice(statement); | |
dumpSlice(slice); | |
} | |
public static void dumpSlice(Collection<Statement> statements) { | |
for (Statement statement : statements) { | |
System.out.println(statement); | |
} | |
} | |
public static Statement findCallTo(CGNode n, String methodName) { | |
IR ir = n.getIR(); | |
for (Iterator<SSAInstruction> it = ir.iterateAllInstructions(); it.hasNext(); ) { | |
SSAInstruction s = it.next(); | |
if (s instanceof com.ibm.wala.ssa.SSAAbstractInvokeInstruction) { | |
com.ibm.wala.ssa.SSAAbstractInvokeInstruction call = (com.ibm.wala.ssa.SSAAbstractInvokeInstruction) s; | |
if (call.getCallSite().getDeclaredTarget().getName().toString().equals(methodName)) { | |
com.ibm.wala.util.intset.IntSet indices = ir.getCallInstructionIndices(call.getCallSite()); | |
com.ibm.wala.util.debug.Assertions.productionAssertion(indices.size() == 1, "expected 1 but got " + indices.size()); | |
return new com.ibm.wala.ipa.slicer.NormalStatement(n, indices.intIterator().next()); | |
} | |
} | |
} | |
Assertions.UNREACHABLE("failed to find call to " + methodName + " in " + n); | |
return null; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.test; | |
public class MainTest { | |
//private String name; | |
private ObjectA a, b; | |
public static void main(String[] agrs) { | |
MainTest mainTest = new MainTest(); | |
mainTest.test(); | |
} | |
void test() { | |
a = new ObjectA(); | |
a.setName("test111"); | |
a.number2 = 111; | |
if (b == null) { | |
a.setName("ABC"); | |
} | |
} | |
public class ObjectA { | |
private int number; | |
public int number2; | |
private String name; | |
public int getNumber() { | |
return number; | |
} | |
public void setNumber(int number) { | |
this.number = number; | |
} | |
public String getName() { | |
return name; | |
} | |
public void setName(String name) { | |
this.name = name; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment