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

如何通过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配置方式是什么?


解决方法

  1. 确认符号的准确性
    先通过工具获取编译后二进制中目标方法的真实符号,避免手动输入错误:

    # 先编译出带符号的二进制
    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中,确保匹配无误。

  2. 添加源码路径限定(提升匹配精准度)
    在规则中加上源码文件路径,避免匹配到其他同名方法:

    [address]
    src:./bad_asan.cxx=fun:BadASan::get_memory
    
  3. 检查编译选项顺序与范围

    • 确保-fsanitize-ignorelist放在-fsanitize=address之后,LLVM的选项顺序会影响生效逻辑;
    • 如果是多文件项目,所有包含该方法的编译单元都要带上-fsanitize-ignorelist选项,不能只加在链接阶段。
  4. 验证Clang版本兼容性
    旧版本Clang对ignorelist的支持存在缺陷,建议使用Clang 9及以上版本,确保规则能被正确解析。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 19:01:21