Soot能否处理无法编译的Java文件?求解决方案或替代工具
处理未定义方法时让Soot继续分析的方案
问题场景
给定如下Java代码CallGraphs.java,其中doStuff1()方法未定义,直接编译会失败:
public class CallGraphs { public static void main(String[] args) { doStuff1(); } public static void doStuff() { new A().foo(); } } class A { public void foo() { bar(); } public void bar() { } }
执行Soot分析命令:
java -cp soot.jar soot.Main -cp .:soot.jar -pp -allow-phantom-refs -allow-phantom-elms -src-prec java CallGraphs
此时抛出soot.CompilationDeathException,无法完成分析。需要解决:能否让Soot忽略该异常继续分析?如果不行,有什么替代工具?
解决方案
调整Soot参数实现分析
你已经用到了-allow-phantom-refs和-allow-phantom-elms,但还需要补充几个参数来强制Soot跳过编译错误继续执行:
-ignore-resolution-errors:让Soot忽略方法、类的解析错误-no-bodies-for-excluded:不对无法解析的方法生成方法体,仅保留phantom引用-allow-phantom-methods:显式允许phantom方法(即未定义的方法)存在
调整后的完整命令:
java -cp soot.jar soot.Main -cp .:soot.jar -pp -allow-phantom-refs -allow-phantom-elms -allow-phantom-methods -ignore-resolution-errors -no-bodies-for-excluded -src-prec java CallGraphs
这些参数组合后,Soot会将未定义的doStuff1()视为phantom方法,不会因编译错误终止流程,而是继续完成对其他可解析代码部分的分析。
替代工具
如果上述参数仍无法满足需求,可以考虑以下工具:
- WALA:支持对存在未定义符号的Java代码做分析,通过配置类路径和忽略缺失类/方法的规则,能正常执行数据流、调用图分析。
- CodeQL:可直接处理未编译通过的Java源代码,通过其查询语言分析代码结构,无需完整编译。
- SpotBugs:虽主打静态Bug检测,但能容忍部分未定义符号,通过配置可跳过无法解析的方法,继续扫描其他代码。
内容的提问来源于stack exchange,提问作者杨国强
相关产品推荐
相关产品推荐

