使用烟灰+桨进行大型程序分析

时间:2013-02-03 17:57:50

标签: java soot

我正在尝试使用Soot的paddle框架对具有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和4 GB)。 如果我将此值设置为SigDomain(14)太大,如~20000,那么桨分析甚至不会启动。

我有以下paddle选项:

    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();

1 个答案:

答案 0 :(得分:0)

作为Soot的维护者之一,让我告诉您,您通常会在Soot邮件列表上获得更快的帮助,因为我们并非所有人都在关注StackOverflow。 Ondrej Lhotak也许可以帮助解决这个问题......

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