more dalvik tests
This commit is contained in:
parent
97920a4ab9
commit
4bc7d12191
|
@ -0,0 +1,4 @@
|
|||
java\/awt\/.*
|
||||
javax\/swing\/.*
|
||||
java\/io\/ObjectStreamClass*
|
||||
org\/apache\/xerces\/.*
|
|
@ -3,16 +3,28 @@ package com.ibm.wala.dalvik.drivers;
|
|||
import java.io.File;
|
||||
import java.io.FilenameFilter;
|
||||
import java.io.IOException;
|
||||
import java.util.Set;
|
||||
|
||||
import com.ibm.wala.classLoader.IMethod;
|
||||
import com.ibm.wala.dalvik.test.callGraph.DalvikCallGraphTestBase;
|
||||
import com.ibm.wala.ipa.callgraph.CGNode;
|
||||
import com.ibm.wala.ipa.callgraph.CallGraph;
|
||||
import com.ibm.wala.ipa.cha.ClassHierarchyException;
|
||||
import com.ibm.wala.util.CancelException;
|
||||
import com.ibm.wala.util.MonitorUtil.IProgressMonitor;
|
||||
import com.ibm.wala.util.collections.HashSetFactory;
|
||||
|
||||
public class APKCallGraphDriver {
|
||||
private static int timeout = -1;
|
||||
|
||||
public static void main(String[] args) throws ClassHierarchyException, IllegalArgumentException, IOException, CancelException {
|
||||
File apk = new File(args[0]);
|
||||
try {
|
||||
timeout = Integer.parseInt(args[1]);
|
||||
System.err.println("timeout is " + timeout);
|
||||
} catch (Throwable e) {
|
||||
// no timeout specified
|
||||
}
|
||||
recurseApks(apk);
|
||||
}
|
||||
|
||||
|
@ -37,18 +49,66 @@ public class APKCallGraphDriver {
|
|||
System.err.println("Analyzing " + apk + "...");
|
||||
try {
|
||||
long time = System.currentTimeMillis();
|
||||
CallGraph CG = DalvikCallGraphTestBase.makeAPKCallGraph(apk.getAbsolutePath()).fst;
|
||||
CallGraph CG;
|
||||
if (timeout == -1) {
|
||||
CG = DalvikCallGraphTestBase.makeAPKCallGraph(apk.getAbsolutePath()).fst;
|
||||
} else {
|
||||
final long startTime = System.currentTimeMillis();
|
||||
IProgressMonitor pm = new IProgressMonitor() {
|
||||
private boolean cancelled = false;
|
||||
|
||||
@Override
|
||||
public void beginTask(String task, int totalWork) {
|
||||
// TODO Auto-generated method stub
|
||||
}
|
||||
|
||||
@Override
|
||||
public void subTask(String subTask) {
|
||||
// TODO Auto-generated method stub
|
||||
}
|
||||
|
||||
@Override
|
||||
public void cancel() {
|
||||
cancelled = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCanceled() {
|
||||
if (System.currentTimeMillis() - startTime > timeout) {
|
||||
cancelled = true;
|
||||
}
|
||||
return cancelled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void done() {
|
||||
// TODO Auto-generated method stub
|
||||
}
|
||||
|
||||
@Override
|
||||
public void worked(int units) {
|
||||
// TODO Auto-generated method stub
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCancelMessage() {
|
||||
return "timeout";
|
||||
}
|
||||
};
|
||||
CG = DalvikCallGraphTestBase.makeAPKCallGraph(apk.getAbsolutePath(), pm).fst;
|
||||
}
|
||||
System.err.println("Analyzed " + apk + " in " + (System.currentTimeMillis() - time));
|
||||
System.err.println(CG);
|
||||
|
||||
Set<IMethod> code = HashSetFactory.make();
|
||||
for(CGNode n : CG) {
|
||||
code.add(n.getMethod());
|
||||
}
|
||||
for(IMethod m : code) {
|
||||
System.err.println(m);
|
||||
}
|
||||
} catch (Throwable e) {
|
||||
e.printStackTrace(System.err);
|
||||
}
|
||||
/*
|
||||
for(CGNode n : CG) {
|
||||
System.err.println(n);
|
||||
System.err.println(n.getIR());
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -16,8 +16,11 @@ import static com.ibm.wala.properties.WalaProperties.ANDROID_RT_JAR;
|
|||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FilenameFilter;
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.net.URI;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
import java.util.Set;
|
||||
|
@ -37,6 +40,7 @@ import com.ibm.wala.ipa.callgraph.AnalysisScope;
|
|||
import com.ibm.wala.ipa.callgraph.CGNode;
|
||||
import com.ibm.wala.ipa.callgraph.CallGraph;
|
||||
import com.ibm.wala.ipa.callgraph.Entrypoint;
|
||||
import com.ibm.wala.ipa.callgraph.AnalysisOptions.ReflectionOptions;
|
||||
import com.ibm.wala.ipa.callgraph.impl.Util;
|
||||
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
|
||||
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
|
||||
|
@ -51,6 +55,8 @@ import com.ibm.wala.types.ClassLoaderReference;
|
|||
import com.ibm.wala.types.MethodReference;
|
||||
import com.ibm.wala.types.TypeReference;
|
||||
import com.ibm.wala.util.CancelException;
|
||||
import com.ibm.wala.util.MonitorUtil.IProgressMonitor;
|
||||
import com.ibm.wala.util.NullProgressMonitor;
|
||||
import com.ibm.wala.util.Predicate;
|
||||
import com.ibm.wala.util.WalaException;
|
||||
import com.ibm.wala.util.collections.HashSetFactory;
|
||||
|
@ -112,7 +118,7 @@ public class DalvikCallGraphTestBase extends DynamicCallGraphTestBase {
|
|||
return f;
|
||||
}
|
||||
|
||||
public void dynamicCG(File javaJarPath, String mainClass, String... args) throws FileNotFoundException, IOException, ClassNotFoundException, InvalidClassFileException, FailureException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
|
||||
public void dynamicCG(File javaJarPath, String mainClass, String... args) throws FileNotFoundException, IOException, ClassNotFoundException, InvalidClassFileException, FailureException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, InterruptedException {
|
||||
File F = TemporaryFile.streamToFile(new File("test_jar.jar"), new FileInputStream(javaJarPath));
|
||||
F.deleteOnExit();
|
||||
instrument(F.getAbsolutePath());
|
||||
|
@ -120,11 +126,15 @@ public class DalvikCallGraphTestBase extends DynamicCallGraphTestBase {
|
|||
}
|
||||
|
||||
public static Pair<CallGraph, PointerAnalysis<InstanceKey>> makeAPKCallGraph(String apkFileName) throws IOException, ClassHierarchyException, IllegalArgumentException, CancelException {
|
||||
return makeAPKCallGraph(apkFileName, new NullProgressMonitor());
|
||||
}
|
||||
|
||||
public static Pair<CallGraph, PointerAnalysis<InstanceKey>> makeAPKCallGraph(String apkFileName, IProgressMonitor monitor) throws IOException, ClassHierarchyException, IllegalArgumentException, CancelException {
|
||||
AnalysisScope scope =
|
||||
AndroidAnalysisScope.setUpAndroidAnalysisScope(
|
||||
walaProperties.getProperty(ANDROID_RT_JAR),
|
||||
apkFileName,
|
||||
CallGraphTestUtil.REGRESSION_EXCLUSIONS);
|
||||
new File(apkFileName).toURI(),
|
||||
"AndroidRegressionExclusions.txt",
|
||||
androidLibs());
|
||||
|
||||
final IClassHierarchy cha = ClassHierarchy.make(scope);
|
||||
|
||||
|
@ -140,23 +150,39 @@ public class DalvikCallGraphTestBase extends DynamicCallGraphTestBase {
|
|||
assert ! es.isEmpty();
|
||||
|
||||
AnalysisOptions options = new AnalysisOptions(scope, es);
|
||||
|
||||
options.setReflectionOptions(ReflectionOptions.ONE_FLOW_TO_CASTS_APPLICATION_GET_METHOD);
|
||||
|
||||
SSAPropagationCallGraphBuilder cgb = Util.makeZeroCFABuilder(options, cache, cha, scope);
|
||||
|
||||
CallGraph callGraph = cgb.makeCallGraph(options);
|
||||
CallGraph callGraph = cgb.makeCallGraph(options, monitor);
|
||||
|
||||
PointerAnalysis<InstanceKey> ptrAnalysis = cgb.getPointerAnalysis();
|
||||
|
||||
return Pair.make(callGraph, ptrAnalysis);
|
||||
}
|
||||
|
||||
public static URI[] androidLibs() {
|
||||
List<URI> libs = new ArrayList<URI>();
|
||||
for(File lib : new File(walaProperties.getProperty(ANDROID_RT_JAR)).listFiles(new FilenameFilter() {
|
||||
@Override
|
||||
public boolean accept(File dir, String name) {
|
||||
return name.endsWith("dex");
|
||||
}
|
||||
})) {
|
||||
libs.add(lib.toURI());
|
||||
}
|
||||
return libs.toArray(new URI[ libs.size() ]);
|
||||
}
|
||||
|
||||
public static Pair<CallGraph, PointerAnalysis<InstanceKey>> makeDalvikCallGraph(boolean useAndroidLib, String mainClassName, String dexFileName) throws IOException, ClassHierarchyException, IllegalArgumentException, CancelException {
|
||||
AnalysisScope scope =
|
||||
useAndroidLib?
|
||||
AndroidAnalysisScope.setUpAndroidAnalysisScope(
|
||||
useAndroidLib?
|
||||
walaProperties.getProperty(ANDROID_RT_JAR):
|
||||
null,
|
||||
dexFileName,
|
||||
new File(dexFileName).toURI(),
|
||||
CallGraphTestUtil.REGRESSION_EXCLUSIONS,
|
||||
androidLibs()):
|
||||
AndroidAnalysisScope.setUpAndroidAnalysisScope(
|
||||
new File(dexFileName).toURI(),
|
||||
CallGraphTestUtil.REGRESSION_EXCLUSIONS);
|
||||
|
||||
final IClassHierarchy cha = ClassHierarchy.make(scope);
|
||||
|
|
|
@ -13,7 +13,6 @@ package com.ibm.wala.dalvik.test.callGraph;
|
|||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.util.Set;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
|
@ -26,6 +25,7 @@ import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
|
|||
import com.ibm.wala.ipa.cha.ClassHierarchyException;
|
||||
import com.ibm.wala.shrikeBT.analysis.Analyzer.FailureException;
|
||||
import com.ibm.wala.shrikeCT.InvalidClassFileException;
|
||||
import com.ibm.wala.types.ClassLoaderReference;
|
||||
import com.ibm.wala.types.MethodReference;
|
||||
import com.ibm.wala.util.CancelException;
|
||||
import com.ibm.wala.util.Predicate;
|
||||
|
@ -39,28 +39,39 @@ public class DynamicDalvikComparison extends DalvikCallGraphTestBase {
|
|||
String javaJarPath = getJavaJar(javaScope);
|
||||
File androidDex = convertJarToDex(new File(javaJarPath));
|
||||
Pair<CallGraph,PointerAnalysis<InstanceKey>> android = makeDalvikCallGraph(useAndroidLib, mainClass, androidDex.getAbsolutePath());
|
||||
final Set<MethodReference> androidMethods = applicationMethods(android.fst);
|
||||
|
||||
dynamicCG(new File(javaJarPath), mainClass, args);
|
||||
|
||||
checkEdges(android.fst, new Predicate<MethodReference>() {
|
||||
@Override
|
||||
public boolean test(MethodReference t) {
|
||||
return androidMethods.contains(t);
|
||||
return t.getDeclaringClass().getClassLoader().equals(ClassLoaderReference.Application);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testJLex() throws ClassHierarchyException, IllegalArgumentException, IOException, CancelException, InterruptedException, ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InvalidClassFileException, FailureException {
|
||||
public void testJLexJavaLib() throws ClassHierarchyException, IllegalArgumentException, IOException, CancelException, InterruptedException, ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InvalidClassFileException, FailureException {
|
||||
File inputFile = TemporaryFile.urlToFile("sample.lex", getClass().getClassLoader().getResource("sample.lex"));
|
||||
test(false, TestConstants.JLEX_MAIN, TestConstants.JLEX, inputFile.getAbsolutePath());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testJavaCup() throws ClassHierarchyException, IllegalArgumentException, IOException, CancelException, InterruptedException, ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InvalidClassFileException, FailureException {
|
||||
public void testJLexDexLib() throws ClassHierarchyException, IllegalArgumentException, IOException, CancelException, InterruptedException, ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InvalidClassFileException, FailureException {
|
||||
File inputFile = TemporaryFile.urlToFile("sample.lex", getClass().getClassLoader().getResource("sample.lex"));
|
||||
test(true, TestConstants.JLEX_MAIN, TestConstants.JLEX, inputFile.getAbsolutePath());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testJavaCupJavaLib() throws ClassHierarchyException, IllegalArgumentException, IOException, CancelException, InterruptedException, ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InvalidClassFileException, FailureException {
|
||||
File inputFile = TemporaryFile.urlToFile("troff2html.cup", getClass().getClassLoader().getResource("troff2html.cup"));
|
||||
test(false, TestConstants.JAVA_CUP_MAIN, TestConstants.JAVA_CUP, inputFile.getAbsolutePath());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testJavaCupDexLib() throws ClassHierarchyException, IllegalArgumentException, IOException, CancelException, InterruptedException, ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InvalidClassFileException, FailureException {
|
||||
File inputFile = TemporaryFile.urlToFile("troff2html.cup", getClass().getClassLoader().getResource("troff2html.cup"));
|
||||
test(true, TestConstants.JAVA_CUP_MAIN, TestConstants.JAVA_CUP, inputFile.getAbsolutePath());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -12,6 +12,7 @@ package com.ibm.wala.dalvik.test.callGraph;
|
|||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.Iterator;
|
||||
import java.util.Set;
|
||||
|
||||
import org.junit.Assert;
|
||||
|
@ -34,9 +35,13 @@ import com.ibm.wala.ipa.callgraph.propagation.SSAPropagationCallGraphBuilder;
|
|||
import com.ibm.wala.ipa.callgraph.propagation.cfa.ExceptionReturnValueKey;
|
||||
import com.ibm.wala.ipa.cha.ClassHierarchy;
|
||||
import com.ibm.wala.ipa.cha.ClassHierarchyException;
|
||||
import com.ibm.wala.types.ClassLoaderReference;
|
||||
import com.ibm.wala.types.MethodReference;
|
||||
import com.ibm.wala.util.CancelException;
|
||||
import com.ibm.wala.util.collections.Filter;
|
||||
import com.ibm.wala.util.collections.FilterIterator;
|
||||
import com.ibm.wala.util.collections.HashSetFactory;
|
||||
import com.ibm.wala.util.collections.Iterator2Collection;
|
||||
import com.ibm.wala.util.collections.Pair;
|
||||
import com.ibm.wala.util.intset.OrdinalSet;
|
||||
|
||||
|
@ -86,13 +91,25 @@ public class JVMLDalvikComparison extends DalvikCallGraphTestBase {
|
|||
Set<MethodReference> androidMethods = applicationMethods(android.fst);
|
||||
Set<MethodReference> javaMethods = applicationMethods(java.fst);
|
||||
|
||||
Set<Pair<CGNode, CGNode>> javaExtraEdges = edgeDiff(java.fst, android.fst);
|
||||
|
||||
if (!javaExtraEdges.isEmpty()) {
|
||||
Iterator<Pair<CGNode, CGNode>> javaExtraEdges = edgeDiff(java.fst, android.fst).iterator();
|
||||
if (useAndroidLib) {
|
||||
javaExtraEdges = new FilterIterator<Pair<CGNode, CGNode>>(javaExtraEdges, new Filter<Pair<CGNode, CGNode>>() {
|
||||
private boolean userCode(CGNode n) {
|
||||
return n.getMethod().getDeclaringClass().getClassLoader().getReference().equals(ClassLoaderReference.Application);
|
||||
}
|
||||
@Override
|
||||
public boolean accepts(Pair<CGNode, CGNode> o) {
|
||||
return userCode(o.fst) && userCode(o.snd);
|
||||
}
|
||||
});
|
||||
}
|
||||
boolean fail = false;
|
||||
if (javaExtraEdges.hasNext()) {
|
||||
fail = true;
|
||||
Set<MethodReference> javaExtraNodes = HashSetFactory.make(javaMethods);
|
||||
javaExtraNodes.removeAll(androidMethods);
|
||||
|
||||
System.err.println(javaExtraEdges);
|
||||
System.err.println(Iterator2Collection.toSet(javaExtraEdges));
|
||||
System.err.println(javaExtraNodes);
|
||||
|
||||
System.err.println(android.fst);
|
||||
|
@ -115,7 +132,7 @@ public class JVMLDalvikComparison extends DalvikCallGraphTestBase {
|
|||
}
|
||||
}
|
||||
|
||||
Assert.assertTrue(javaExtraEdges.isEmpty());
|
||||
Assert.assertTrue(!fail);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
Loading…
Reference in New Issue