more dalvik tests

This commit is contained in:
Julian Dolby 2014-11-18 22:36:01 -05:00
parent 97920a4ab9
commit 4bc7d12191
5 changed files with 146 additions and 28 deletions

View File

@ -0,0 +1,4 @@
java\/awt\/.*
javax\/swing\/.*
java\/io\/ObjectStreamClass*
org\/apache\/xerces\/.*

View File

@ -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());
}
*/
}
}

View File

@ -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);

View File

@ -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());
}
}

View File

@ -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