我想使用Soot库从* .java文件构建SSA。但我发现的所有示例都使用Soot作为独立工具,而不是库。任何人都可以在程序中给我一些热点吗?
首先,我只是尝试从源文件加载我的类并打印它(TestClass.class在目录A/home/abdullin/workspace/test
中):
import soot.G
import soot.Scene
import soot.options.Options
fun main(args: Array<String>) {
G.reset();
Options.v().set_whole_program(true)
Scene.v().loadBasicClasses()
Scene.v().sootClassPath = "${Scene.v().defaultClassPath()}:/home/abdullin/workspace/test"
val sc = Scene.v().getSootClass("TestClass")
Scene.v().loadNecessaryClasses()
sc.setApplicationClass()
println(sc.name)
sc.methods.forEach {
println(it)
}
}
但是当我运行它时,我得到运行时异常Aborting: can't find classfile TestClass
。如果我将Scene.v().getSootClass("TestClass")
更改为Scene.v().loadClassAndSupport("TestClass")
,就像他们在某些教程中所做的那样,那么soot会找到我的课程,但它并不完整。它打印出类方法的签名,但找不到它们的主体,activeBody
字段为空。
TestClass
<TestClass: void <init>()>
<TestClass: void main(java.lang.String[])>
<TestClass: void f1()>
答案 0 :(得分:1)
首先,确保Soot jar在类路径中。
然后,使用类soot.G
和soot.options.Options
(G.reset()
和Options.v().parse()
设置Soot是您感兴趣的方法,另请参阅command line options)。
使用soot.Scene.v().setSootClassPath()
and similar,您可以告诉Soot在哪里可以找到您要分析的代码的类文件。
然后,您可以使用Scene.v().getSootClass()
来获取SootClass对象。确保在将要分析的类设置为主类后,Soot加载所有类:
mySootClass.setApplicationClass();
Scene.v().loadNecessaryClasses();
在此之后,您可以使用Soot获取各种类型的图表并运行分析,如Survivor's guide
中所述答案 1 :(得分:0)
您可以阅读这篇文章(https://o2lab.github.io/710/p/a1.html)。但是,如果您尝试分析jar文件,则应将其解压缩并获得一组类文件。然后,应将您的classes目录添加到soot_class_path中。
演示:
public static void main(String[] args) {
//spotbugs -- testing
String classesDir = "D:\\wkspace\\seed8\\dir\\spotbugs";
String mainClass = "edu.umd.cs.findbugs.LaunchAppropriateUI";
//set classpath
String jreDir = System.getProperty("java.home") + "\\lib\\jce.jar";
String jceDir = System.getProperty("java.home") + "\\lib\\rt.jar";
String path = jreDir + File.pathSeparator + jceDir + File.pathSeparator + classesDir;
Scene.v().setSootClassPath(path);
//add an intra-procedural analysis phase to Soot
TestCallGraphSootJar_3 analysis = new TestCallGraphSootJar_3();
PackManager.v().getPack("wjtp").add(new Transform("wjtp.TestSootCallGraph", analysis));
excludeJDKLibrary();
Options.v().set_process_dir(Arrays.asList(classesDir));
Options.v().set_whole_program(true);
//Options.v().set_app(true);
SootClass appClass = Scene.v().loadClassAndSupport(mainClass);
Scene.v().setMainClass(appClass);
Scene.v().loadNecessaryClasses();
//enableCHACallGraph();
enableSparkCallGraph();
PackManager.v().runPacks();
}
如果您更换
SootClass appclass = Scene.v().loadClassAndSupport(mainclass);
Scene.v().setMainClass(appclass);
Scene.v().loadNecessaryClasses();
作者
Scene.v().loadNecessaryClasses();
SootClass appclass = Scene.v().getSootClass(mainclass);
Scene.v().setMainClass(appclass);
,该程序也可以工作。