我正在尝试使用 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();