如何通过Sanitizer特殊案例列表禁用ASan对BadASan::get_memory的检查?
如何通过Sanitizer忽略列表禁用特定方法的ASan检查
问题场景
我需要在项目中禁用BadASan::get_memory方法的ASan(AddressSanitizer)检查,尝试使用LLVM提供的Sanitizer特殊案例列表(ignorelist)配置,但多次尝试后ASan仍会触发报错。
触发错误的示例代码
#include <cstdlib> #include <memory> class BadASan { public: void get_memory() { int *a = reinterpret_cast<int *>(malloc(40)); a[10] = 1; // 越界写操作,触发ASan报错 } }; int main() { auto bad_asan = std::make_unique<BadASan>(); // 修正原代码的类名拼写错误 bad_asan->get_memory(); return 0; }
未生效的ignorelist配置
创建了ignorelist.txt,尝试以下三种匹配规则均无效:
[address] fun:BadASan::get_memory # 全限定成员函数名 fun:*get_memory # 通配符匹配方法名 fun:__ZN3BadASan7get_memoryEv # 手动指定的mangled符号
使用的编译命令
clang++ -std=c++17 -fsanitize=address -fsanitize-ignorelist=ignorelist.txt bad_asan.cxx
注:已修正原命令中
-fsanitze的拼写错误为-fsanitize
编译运行后ASan依旧报越界错误,请问正确的ignorelist配置方式是什么?
解决方法
确认符号的准确性
先通过工具获取编译后二进制中目标方法的真实符号,避免手动输入错误:# 先编译出带符号的二进制 clang++ -std=c++17 -fsanitize=address bad_asan.cxx -o bad_asan # 查看demangled后的符号 nm -C bad_asan | grep get_memory # 查看mangled后的符号 nm bad_asan | grep get_memory将工具输出的符号完全复制到ignorelist中,确保匹配无误。
添加源码路径限定(提升匹配精准度)
在规则中加上源码文件路径,避免匹配到其他同名方法:[address] src:./bad_asan.cxx=fun:BadASan::get_memory检查编译选项顺序与范围
- 确保
-fsanitize-ignorelist放在-fsanitize=address之后,LLVM的选项顺序会影响生效逻辑; - 如果是多文件项目,所有包含该方法的编译单元都要带上
-fsanitize-ignorelist选项,不能只加在链接阶段。
- 确保
验证Clang版本兼容性
旧版本Clang对ignorelist的支持存在缺陷,建议使用Clang 9及以上版本,确保规则能被正确解析。
内容的提问来源于stack exchange,提问作者ByteNudger
相关产品推荐
相关产品推荐

