Soot のパドル フレームワークを使用して、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 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();