将Soot用作库时,如何设置Soot?

时间:2018-02-05 10:15:14

标签: java soot

我想使用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()>

2 个答案:

答案 0 :(得分:1)

首先,确保Soot jar在类路径中。

然后,使用类soot.Gsoot.options.OptionsG.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);

,该程序也可以工作。