首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Soot:如何分析包中的java文件?

Soot:如何分析包中的java文件?
EN

Stack Overflow用户
提问于 2022-10-23 15:28:34
回答 1查看 26关注 0票数 0

我在tests目录下有两个java文件。我使用下面的代码来设置Soot以进行进一步的分析(即构造一个调用图),但是遇到了are the packages set properly?的一个错误。

Main.java

代码语言:javascript
复制
public class Main {
    static void setupSoot() {
        Options.v().set_prepend_classpath(true);
        Options.v().set_process_dir(Collections.singletonList("./tests"));
        Options.v().set_whole_program(true);
        Scene.v().loadNecessaryClasses();
    }

    // Following function also doesn't work and has a similar error message
    //static void setupSoot() {
    //    Options.v().set_prepend_classpath(true);
    //    Options.v().set_process_dir(Collections.singletonList("./tests"));
    //    Scene.v().loadClassAndSupport("FooBar");
    //}

    public static void main(String[] args) {
        setupSoot();
        // ....
    }
}

我得到以下错误消息:

代码语言:javascript
复制
Exception in thread "main" java.lang.RuntimeException: Error: couldn't find class: FooBar are the packages set properly?
    at soot.JastAddInitialResolver.resolveFromJavaFile(JastAddInitialResolver.java:119)
    at soot.JavaClassSource.resolve(JavaClassSource.java:69)
    at soot.SootResolver.bringToHierarchyUnchecked(SootResolver.java:253)
    at soot.SootResolver.bringToHierarchy(SootResolver.java:221)
    at soot.SootResolver.bringToSignatures(SootResolver.java:292)
    at soot.SootResolver.bringToBodies(SootResolver.java:332)
    at soot.SootResolver.processResolveWorklist(SootResolver.java:171)
    at soot.SootResolver.resolveClass(SootResolver.java:141)
    at soot.Scene.loadClass(Scene.java:1009)
    at soot.Scene.loadClassAndSupport(Scene.java:994)
    at soot.Scene.loadNecessaryClasses(Scene.java:1822)
    at Main.setupSoot(Main.java:18)
    at Main.main(Main.java:21)

如果我将两个测试文件复杂为.class文件,那么我将得到以下错误消息:

代码语言:javascript
复制
Exception in thread "main" soot.SootResolver$SootClassNotFoundException: couldn't find class: tests.FooBar (is your soot-class-path set properly?)
    at soot.SootResolver.bringToHierarchyUnchecked(SootResolver.java:245)
    at soot.SootResolver.bringToHierarchy(SootResolver.java:221)
    at soot.SootResolver.bringToSignatures(SootResolver.java:292)
    at soot.SootResolver.bringToBodies(SootResolver.java:332)
    at soot.SootResolver.processResolveWorklist(SootResolver.java:171)
    at soot.SootResolver.resolveClass(SootResolver.java:141)
    at soot.Scene.loadClass(Scene.java:1009)
    at soot.Scene.loadClassAndSupport(Scene.java:994)
    at soot.Scene.loadNecessaryClasses(Scene.java:1822)
    at Main.setupSoot(Main.java:18)
    at Main.main(Main.java:21)

我认为soot prepend_classpath是正确的,因为当包中没有两个测试文件(即从两个文件中删除package tests )时,它工作得很好。

tests目录中的两个文件如下:

Pack.java

代码语言:javascript
复制
package tests;
public class Pack {
    public static void main(String[] args) {
        int s = 10;
    }
}

FooBar.java

代码语言:javascript
复制
package tests;

public class FooBar {
    public static void main(String[] args) {
        FooBar callFooBar = new FooBar();
        callFooBar.foo(10);
    }

    void foo(int a) {
        bar(a);
    }

    void bar(int a) {
        for (int i = 0; i < a; i++) {
            i += a;
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-25 10:00:19

我解决了这个问题。问题是测试文件的path是错误的。现在我的项目结构如下:

代码语言:javascript
复制
-ProjectRoot
|--src
    |--Main.java
|--testers
    |--easycase
        |--FooBar.java
        |--Pack.java

还有我的Main.java

代码语言:javascript
复制
public class Main {
    static void setupSoot() {
        Options.v().set_prepend_classpath(true);
        // Options.v().set_soot_classpath("xxxxx:xxxxx/xxxxx.jar") // For external packages
        Options.v().set_process_dir(Collections.singletonList("./testers"));
        Options.v().set_whole_program(true);
        Scene.v().loadNecessaryClasses();
    }

    public static void main(String[] args) {
        setupSoot();
        Scene.v().loadAndSupport("esaycase.FooBar");
        // Do something here
    }
}

请注意,对于这两个测试文件,第一行是package easycase;

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74172390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档