我正试图使用Soot的paddle框架对具有20KLOC-50KLOC Java代码的android应用程序进行上下文敏感的"点对点"分析。由于应用程序没有主方法,我修改了烟灰,使其具有多个入口点。当我运行分析时,它抛出以下异常
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)
我在桨板源代码中的SigDomain.jedd文件中增加了SigDomain(14)中的值14,这导致分析运行的时间更长,但最终还是失败了,出现了同样的异常。(我还将jvm的堆栈大小和堆大小分别增加到1和4GB)。如果我将这个值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();
作为Soot的维护者之一,我建议您,您通常会在Soot邮件列表上获得更快的帮助,因为并非所有人都在观看StackOverflow。Ondrej Lhotak也许能帮上忙。。。
上下文敏感分析通常非常昂贵。可能的解决方案是(1)进行需求驱动的上下文敏感分析(Soot也支持这种分析;检查命令行选项),(2)构建自己手工制作的指针抽象,或者(3)从分析中排除一些运行库(这将是不可靠的)。希望能有所帮助。。。