错误分析

编译报错日志:

[OHOS ERROR] ERROR at //build/config/sanitizers/sanitizers.gni:393:7: Assertion failed.
​
[OHOS ERROR]       assert(
​
[OHOS ERROR]       ^-----
​
[OHOS ERROR] Enable CFI can't configure 'debug=true'. Please check this target wpa_sys in wpa_supplicant. For local debug, try to build with '--gn-args allow_sanitize_debug=true' to bypass sanitize check.
​
[OHOS ERROR] See //build/config/sanitizers/sanitizers.gni:394:11:
​
[OHOS ERROR]           sanitize.debug == false,
​
[OHOS ERROR]           ^----------------------
​
[OHOS ERROR] This is where it was set.
​
[OHOS ERROR] See //build/templates/cxx/cxx.gni:656:5: whence it was called.
​
[OHOS ERROR]     ohos_sanitizer_check("${target_name}_sanitizer_check") {
​
[OHOS ERROR]     ^-------------------------------------------------------
​
[OHOS ERROR] See //third_party/wpa_supplicant/wpa_supplicant-2.9_standard/BUILD.gn:485:1: whence it was called.
​
[OHOS ERROR] ohos_shared_library("wpa_sys") {
​
[OHOS ERROR] ^-------------------------------
​
[OHOS ERROR] See //build/ohos/ohos_part.gni:25:16: which caused the file to be included.
​
[OHOS ERROR]     _deps += [ get_label_info(module_label, "label_with_toolchain") ]

根本原因:

  • 目标 wpa_syswpa_supplicant 中启用了 CFI sanitizer

  • 但同时配置了 debug = true

  • CFI 与调试模式存在冲突,不能同时启用

 

解决方案

方案1:临时绕过检查(推荐用于本地调试)

添加编译参数--gn-args allow_sanitize_debug=true

./build.sh --product-name 产品名 --gn-args allow_sanitize_debug=true

 

方案2:修改构建配置(永久解决)

//third_party/wpa_supplicant/wpa_supplicant-2.9_standard/BUILD.gn 中找到 wpa_sys 目标:

gn

ohos_shared_library("wpa_sys") {
  # 移除或修改以下配置:
  # 选项1:关闭调试
  debug = false
  
  # 选项2:关闭 CFI
  sanitize = {
    cfi = false
    # 或者完全移除 sanitize 配置
  }
}

方案3:条件性配置

ohos_shared_library("wpa_sys") {
  ...
  if (is_debug) {
    debug = true
    # 在调试模式下禁用 CFI
    sanitize = {
      cfi = false
    }
  } else {
    debug = false
    sanitize = {
      cfi = true
    }
  }
}

sanitize 选项的主要作用

在 OpenHarmony 的 GN 构建系统中,sanitize 选项用于配置代码 sanitizer,这是一系列用于检测代码中各种问题的编译时和运行时工具。

1. 安全检测

gn

sanitize = {
  cfi = true           # 控制流完整性检测
  scs = true           # 影子调用栈
  integer_overflow = true  # 整数溢出检测
}

2. 内存错误检测

gn

sanitize = {
  address = true       # 地址 sanitizer (ASan)
  leak = true          # 内存泄漏检测 (LSan)
  hardware_address = true  # 硬件辅助地址检测 (HWASan)
}

3. 未定义行为检测

gn

sanitize = {
  undefined_behavior = true  # 未定义行为检测 (UBSan)
  signed_integer_overflow = true  # 有符号整数溢出
}

4. 线程安全检测

gn

sanitize = {
  thread = true        # 线程 sanitizer (TSan)
}

常用配置示例

基础安全配置

gn

sanitize = {
  cfi = true
  scs = true
  integer_overflow = true
}

完整检测配置

gn

sanitize = {
  cfi = true
  address = true
  leak = true
  undefined_behavior = true
  debug = false  # 注意:通常与 release 模式配合
}

条件配置

gn

if (is_debug) {
  sanitize = {
    address = true
    leak = true
    debug = true
  }
} else {
  sanitize = {
    cfi = true
    scs = true
  }
}

主要 sanitizer 类型详解

CFI (Control Flow Integrity)

  • 作用:防止控制流劫持攻击

  • 检测内容:间接函数调用、虚函数调用

  • 性能影响:中等

  • 使用场景:安全敏感的核心组件

ASan (AddressSanitizer)

  • 作用:检测内存访问错误

  • 检测内容:缓冲区溢出、使用后释放、重复释放

  • 性能影响:较大(2-3倍慢)

  • 内存开销:较大

UBSan (UndefinedBehaviorSanitizer)

  • 作用:检测未定义行为

  • 检测内容:整数溢出、空指针解引用、类型混淆

  • 性能影响:较小

TSan (ThreadSanitizer)

  • 作用:检测数据竞争

  • 检测内容:多线程同步问题

  • 性能影响:较大

  • 内存开销:很大

配置注意事项

1. 调试模式冲突

gn

# 错误配置 - 会导致构建失败
sanitize = {
  cfi = true
  debug = true  # 与 CFI 冲突
}
​
# 正确配置
sanitize = {
  cfi = true
  debug = false
}

 

2. 性能考虑

gn

# 开发阶段 - 全面检测
sanitize = {
  address = true
  leak = true
  undefined_behavior = true
}
​
# 发布阶段 - 仅关键安全检测
sanitize = {
  cfi = true
  scs = true
}

 

3. 依赖关系

某些 sanitizer 不能同时启用:

  • ASan 和 TSan 通常不能同时使用

  • HWASan 需要特定的硬件支持

实际应用场景

系统核心组件

gn

ohos_shared_library("security_component") {
  sanitize = {
    cfi = true
    scs = true
    integer_overflow = true
  }
}

 

测试版本

gn

if (build_phase == "test") {
  sanitize = {
    address = true
    leak = true
    undefined_behavior = true
  }
}

 

用户态应用

gn

ohos_executable("user_app") {
  # 通常使用较轻量的检测
  sanitize = {
    integer_overflow = true
    signed_integer_overflow = true
  }
}

 

总结

sanitize 选项在 OpenHarmony 中主要用于:

  • 提升代码安全性 - 通过 CFI 等机制防止攻击

  • 发现潜在缺陷 - 检测内存、线程等问题

  • 提高代码质量 - 在开发阶段发现未定义行为

合理配置 sanitizer 可以在安全、性能和开发效率之间取得平衡。

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐