Sanitizer子选项默认启用情况及多Sanitizer最优命令行配置咨询
LLVM Sanitizer文档指出:使用clang编译并链接程序时添加-fsanitize=undefined标志,确保用clang而非ld作为链接器以链接正确的UBSan运行时库;编译链接C代码可使用clang替代clang++。……可仅启用UBSan提供的部分检查项,并定义每种检查的预期行为:……
一、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

