2012-10-03 75 views
1

我想用Soot做一个Java程序的静态分析,包括例如控制流图。是否可以在不调用soot.Main.main(...)的情况下使用Soot分析?

各种tutorials说的“标准方式”使用煤烟是要创造一个一个添加自定义的转换到烟尘管道,然后调用soot.Main.main(...)主要方法:

public static void main(String[] args) {   
    PackManager.v().getPack("jtp").add(
     new Transform("jtp.gotoinstrumenter", GotoInstrumenter.v())); 
    soot.Main.main(args); 
} 

当然,这如果您想在除命令行工具之外的其他位置使用Soot,则会有一些严重的限制。例如,我不清楚在程序中多次调用Soot的主要方法是否合法。

那么是否有人知道可以通过一个更复杂一点的API直接使用烟灰分析工具?

回答

7

答案是肯定的。在你的主,你可以设置你一起工作的类:

configure("../yourClasspath/"); 
SootClass sootClass = Scene.v().loadClassAndSupport("className"); 
sootClass.setApplicationClass(); 

// Retrieve the method and its body 
SootMethod m = c.getMethodByName("methodName"); 
Body b = m.retrieveActiveBody(); 

// Instruments bytecode 
new YourTransform().transform(b); 

之后,你可能会建立CFG并运行一些分析。

它遵循的配置方法:

public static void configure(String classpath) { 

     Options.v().set_verbose(false); 
     Options.v().set_keep_line_number(true); 
     Options.v().set_src_prec(Options.src_prec_class); 
     Options.v().set_soot_classpath(classpath); 
     Options.v().set_prepend_classpath(true); 

     PhaseOptions.v().setPhaseOption("bb", "off"); 
     PhaseOptions.v().setPhaseOption("tag.ln", "on"); 
     PhaseOptions.v().setPhaseOption("jj.a", "on"); 
     PhaseOptions.v().setPhaseOption("jj.ule", "on"); 

     Options.v().set_whole_program(true); 
    } 
+2

谢谢。自从我问这个问题以来,我学到了很多关于Soot的知识。我发现'G.reset()'对于单元测试非常有用。 – rolve

+0

好的@rolve。 –

相关问题