Skip to content

Soot frontend crashes on large projects due to missing optional dependencies on library classes #217

@wuerror

Description

@wuerror

📝 Overall Description

我尝试基于tai-e 0.5.2创建一个静态分析工具,在实际使用的时候发现在扫描中大型项目时,构建world非常容易失败,即便我设置了-ap(allow_phantom_refs=true)。

🎯 Expected Behavior

我预期是可以完成world构建,进行分析

🐛 Current Behavior

经典的报错如下:
java.lang.RuntimeException: Failed to apply jb to
<com.zaxxer.hikari.metrics.dropwizard.CodaHaleMetricsTracker: void (...)>

Caused by: This operation requires resolving level HIERARCHY
but com.codahale.metrics.Gauge is at resolving level DANGLING

at soot.FastHierarchy.canStoreClass(FastHierarchy.java:384)
at soot.jimple.toolkits.typing.fast.TypeResolver.insertCasts(TypeResolver.java:369)
at soot.jimple.toolkits.typing.fast.TypeAssigner.internalTransform(TypeAssigner.java:129)
at soot.asm.AsmMethodSource.getBody(AsmMethodSource.java:2279)
at soot.SootMethod.retrieveActiveBody(SootMethod.java:447)
at soot.jimple.toolkits.annotation.LineNumberAdder.internalTransform(LineNumberAdder.java:63)
at soot.PackManager.runPacksNormally(PackManager.java:496)
at pascal.taie.frontend.soot.SootWorldBuilder.runSoot(SootWorldBuilder.java:253)

ai分析:
分析

HikariCP 包含一个 Dropwizard Metrics 适配器类,引用了 com.codahale.metrics.Gauge。这是可选依赖,大多数项目不会引入 metrics-core。

Soot 的 PackManager.runPacksNormally() 对所有 application class 执行 jb pack,LineNumberAdder 遍历所有方法调用 retrieveActiveBody(),触发 TypeAssigner →
FastHierarchy.canStoreClass(),要求引用类至少达到 HIERARCHY 解析级别。但 phantom class 只有 DANGLING 级别。

即使设置了 -ap(allow_phantom_refs=true),FastHierarchy 的类型检查仍然不尊重这个设置,直接抛异常。

这不是个例——真实企业项目中大量库存在可选依赖(HikariCP→Metrics、Spring→AspectJ weaver、MyBatis→Ehcache 等),只要 classpath 上有任何一个库引用了不存在的类,整个 World
构建就失败。

Tai-e 侧的限制

SootWorldBuilder.initSoot() 中排除列表硬编码为 List.of("jdk.", "apple.laf."),且未调用 set_no_bodies_for_excluded(true)。initSoot() 和 runSoot() 均为 private
static,下游无法通过继承注入配置。

目前只能通过反射调用这两个 private 方法,在中间注入 Soot 排除选项来 workaround,非常脆弱。

🔄 Reproducible Example

No response

⚙️ Tai-e Arguments

javaVersion: 17
prependJVM: true # -pp
allowPhantom: true # -ap
worldBuilderClass: pascal.taie.frontend.soot.SootWorldBuilder
analyses:
pta: "cs:ci;only-app:true;taint-config:/taint-config.yml;implicit-entries:true"

classpath 规模

appClassPath: 231 entries # --app-class-path(业务 JAR)
classPath: 296 entries # --class-path(库 JAR)

共计 527 个 JAR/目录

📜 Tai-e Log

Writing log to D:\collect_code\xxx-crm\app-server\alljar.jbytescanner\tai-e.log

ℹ️ Additional Information

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions