全部配置 / KN-BINARY-SANITIZER

-Xbinary=sanitizer

Xbinary=sanitizer · KN-BINARY-SANITIZER · 编译器参数(Native)

重要:高 · 影响大 默认:默认关 场合:场景可配 来源:CPF-KMP-CMP社区有改

默认值:默认关。未指定则不启用 sanitizer。使用场合:场景可配。Debug 排障。

它是做什么的

用途。启用 Address/Thread 等 sanitizer,放大内存类错误以便排障。社区侧按产物形态(static library / static framework)与目标 supportedSanitizers 校验;勿带入 Release 性能基线。示例取值:`sanitizer=address`(address / thread 等;勿进 Release)。

影响。性能/包体开销;静态库等可能不支持(KonanConfig警告)。

适用场景。Debug 排障:怀疑内存破坏 / 数据竞争时临时开启;确认后关闭,勿写入 Release 默认模板。

约束与联动。相对上游:放宽了 sanitizer 种类限制。上游曾对非 thread 种类直接警告「not supported yet」并忽略;社区侧改为主要按产物形态(static library / static framework)以及目标是否在 supportedSanitizers 中来校验。 静态库等产物形态可能不支持;排障用完即关,勿进 Release 默认配置。

取值说明

枚举

可写取值含义使用场景
addressAddress Sanitizer(ASan),放大非法内存访问以便排障Debug 排查 use-after-free / 越界等;勿作 Release 默认;部分产物形态可能不支持
threadThread Sanitizer(TSan),检测数据竞争等线程问题并发问题排障;开销大,用完关闭
hwaddressHardware Address Sanitizer(HWASan)目标/工具链支持 HWASan 时的内存排障;需确认平台可用性

含义/场景依据:SanitizerKind.ADDRESS;upstream-modified 说明 / sanitizer 详情约定; SanitizerKind.THREAD; SanitizerKind.HWADDRESS

定义依据:konan/BinaryOptions.kt 在仓库中打开target/Sanitizer.kt 在仓库中打开

怎么用

  1. 配置入口:build.gradle.kts → ohosArm64.binaries.all { freeCompilerArgs += "-Xbinary=sanitizer=address" }
  2. 示例
// 文件:build.gradle.kts(应用的 Kotlin 模块,例如 composeApp)
kotlin {
  ohosArm64 {  // 按实际 native target 调整
    binaries.all {
      freeCompilerArgs += "-Xbinary=sanitizer=address"  // address / thread 等;勿进 Release
    }
  }
}
  1. 生效:Sync 后执行该目标的 compile/link。
  2. 验证:日志出现 `-Xbinary=sanitizer=address`;再按场景做一次运行/体积/可调试性冒烟。
  3. 回滚:从 binaries.all 的 freeCompilerArgs 中删除该项后 Clean 并重编。
  4. 注意:勿进Release;目标不支持会忽略

默认行为 默认关

不写这个配置时,编译器会怎么处理?

此选项默认关闭,不设置时不生效。需要时显式开启。

未指定则不启用 sanitizer。

相关文档

以下摘抄原文中与本配置最相关的段落,便于速读;完整上下文请点原文。

溯源与对照

状态
实验(-X,兼容性不保证)
版本基线
2.2.21-1.0.0
定义位置类型
Native 二进制选项(BinaryOptions / -Xbinary)
源码路径
kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/BinaryOptions.kt 在仓库中打开
相对上游的改动
相对上游:放宽了 sanitizer 种类限制。上游曾对非 thread 种类直接警告「not supported yet」并忽略;社区侧改为主要按产物形态(static library / static framework)以及目标是否在 supportedSanitizers 中来校验。