我想使用 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。如果我像他们在某些教程中所做的那样更改为,soot 会找到我的课程,但它并不完整Scene.v().getSootClass("TestClass")。Scene.v().loadClassAndSupport("TestClass")它打印出类方法的签名,但找不到它们的主体,activeBody字段为空。
TestClass
<TestClass: void <init>()>
<TestClass: void main(java.lang.String[])>
<TestClass: void f1()>