Openharmony cfi编译报错分析及sanitize配置说明
·
错误分析
编译报错日志:
[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_sys在wpa_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 可以在安全、性能和开发效率之间取得平衡。
更多推荐

所有评论(0)