0

我正在尝试使用 Soot 的桨框架对具有 20KLOC-50KLOC 的 Java 代码的 Android 应用程序进行上下文敏感的“指向”分析。我已修改 soot 以具有多个入口点,因为应用程序没有 main 方法。当我运行分析时,它会引发以下异常

Exception in thread "main" java.lang.RuntimeException: Value 65543 was too large in      domain soot.jimple.paddle.bdddomains.MethodDomain!
at jedd.internal.Domain.setBits(Domain.java:62)
at jedd.internal.Jedd.literal(Jedd.java:158)

我在 paddle 源代码中的 SigDomain.jedd 文件中增加了 SigDomain(14) 中的值 14,这导致分析运行时间更长,但最终仍然失败,给出了相同的异常。(我还将 jvm 的堆栈大小和堆大小增加到 1 GB 和 4 GB)。如果我将此值 SigDomain(14) 设置得太大,例如 ~20000,则桨分析甚至不会开始。

我有以下桨叶选项:

    opt.put("verbose","true");
    opt.put("bdd","true");
    opt.put("backend","javabdd");
    opt.put("context","kcfa");
    opt.put("k","2");
    opt.put("propagator","auto");
    opt.put("conf","ofcg");
    opt.put("order","32");
    opt.put("q","auto");
    opt.put("set-impl","double");
    opt.put("double-set-old","hybrid");
    opt.put("double-set-new","hybrid");
    opt.put("pre-jimplify","false");


    PaddleTransformer pt = new PaddleTransformer();
    PaddleOptions paddle_opt = new PaddleOptions(opt);
    pt.setup(paddle_opt);
    pt.solve(paddle_opt);
    soot.jimple.paddle.Results.v().makeStandardSootResults();
4

1 回答 1

0

作为 Soot 的维护者之一,我建议您通常会在 Soot 邮件列表上获得更快的帮助,因为并非所有人都可能在关注 StackOverflow。Ondrej Lhotak 或许能帮上忙……

上下文相关的分析通常非常昂贵。可能的解决方案是(1)进行需求驱动的上下文相关分析(Soot 也支持;检查命令行选项),(2)构建您自己的手工指针抽象,或(3)排除一些运行时来自分析的库(这将是不合理的)。希望有帮助...

于 2013-02-04T07:58:53.473 回答