You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者杨国强

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 05:10:42