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

Sanitizer子选项默认启用情况及多Sanitizer最优命令行配置咨询

LLVM Sanitizer文档指出:使用clang编译并链接程序时添加-fsanitize=undefined标志,确保用clang而非ld作为链接器以链接正确的UBSan运行时库;编译链接C代码可使用clang替代clang++。……可仅启用UBSan提供的部分检查项,并定义每种检查的预期行为:……

关于LLVM/GCC Sanitizer的配置疑问解答

一、UBSan子检查项的默认包含情况

-fsanitize=undefined 会默认启用绝大多数常用的未定义行为检查项,比如你提到的alignment、shift、integer-divide-by-zero、unreachable、null、return等均属于默认覆盖范围,因此-fsanitize=undefined,alignment中的alignment确实是冗余配置。

唯一例外是signed-integer-overflow:该检查默认未包含在undefined组中,若需要检测有符号整数溢出,必须显式添加此子项(如-fsanitize=undefined,signed-integer-overflow)。

GCC的UBSan规则与LLVM基本一致,-fsanitize=undefined同样包含大部分默认检查,特殊项需单独指定。

二、最大化启用Sanitizer的最优命令行

若要覆盖尽可能多的检测场景且避免冗余选项,直接使用以下配置即可:

LLVM环境

# C++项目
clang++ -fsanitize=address,undefined -g -O1 your_code.cpp -o your_program
# C项目
clang -fsanitize=address,undefined -g -O1 your_code.c -o your_program

GCC环境

# C++项目
g++ -fsanitize=address,undefined -g -O1 your_code.cpp -o your_program
# C项目
gcc -fsanitize=address,undefined -g -O1 your_code.c -o your_program

配置说明

  • -fsanitize=address:默认包含leak(内存泄漏检测)、pointer-compare、pointer-subtract等子项,无需额外添加;
  • -fsanitize=undefined:覆盖UBSan的默认未定义行为检查;
  • -g:生成调试符号,确保Sanitizer输出精准的错误位置;
  • -O1:推荐的优化级别,平衡运行速度与问题检测能力(无优化会导致程序过慢,高优化可能掩盖部分问题)。

注:部分旧版本GCC中,leak检测未包含在address组内,若需启用可显式添加-fsanitize=leak,但GCC 10+版本已默认包含。

三、ASAN_OPTIONS参数的必要性

你设置的参数中,与默认行为一致的选项完全无需显式配置:

  • check_initialization_order、detect_container_overflow、detect_odr_violation、allow_addr2line、strict_init_order等在LLVM ASAN中默认已启用,写不写效果相同;
  • 仅当你需要修改默认行为时,才需要显式设置对应参数。例如detect_stack_use_after_return默认关闭,若你需要开启才需设为true;若保持默认关闭,无需添加该参数。

总结:只保留那些与默认值不同的参数即可,无需为默认启用的选项额外声明。


内容的提问来源于stack exchange,提问作者alfC

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 12:31:06