Visual C++中Address Sanitizer如何忽略读溢出仍捕获写缓冲区溢出
可以通过两种方式实现该需求,优先排查危险性更高的堆缓冲区写溢出错误,暂时忽略读溢出报错:
方案1:编译期配置仅检测非法写访问
使用Clang或GCC 12+编译时,添加额外的LLVM后端参数,指定ASAN仅检测无效写操作,完全忽略所有无效读操作的检测:
# Clang 编译示例 clang++ -fsanitize=address -mllvm -asan-detect-invalid-access=write your_code.cpp -o test_bin
该方案的优势是编译时就剔除了读溢出检测逻辑,运行时性能开销更低,不需要额外的运行时配置。
方案2:运行时通过抑制文件过滤读溢出报错
如果不需要修改现有编译流程,可以通过ASAN的运行时抑制规则过滤堆读溢出报错:
- 新建抑制规则文件
asan_suppress.txt,写入如下规则:
heap-buffer-overflow:READ
- 运行程序时指定加载该抑制文件即可:
ASAN_OPTIONS="suppressions=./asan_suppress.txt" ./test_bin
如果需要同时过滤栈、全局变量等其他区域的读溢出报错,在抑制文件中补充对应规则即可:
stack-buffer-overflow:READ global-buffer-overflow:READ use-after-free:READ
注意:建议完成所有写溢出问题修复后,及时恢复读溢出检测,避免遗漏潜在的逻辑错误。
内容的提问来源于stack exchange,提问作者Alex Guteniev
相关产品推荐
相关产品推荐

