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

使用Clang++ AddressSanitizer检测无泄漏程序却报系统库内存泄漏

macOS上AddressSanitizer误报系统库内存泄漏的解决办法

在macOS 13.0.1使用Homebrew版Clang++ 15.0.6时,用AddressSanitizer检测内存泄漏常遇到这种情况:明明代码没有内存泄漏(比如你的测试代码),LeakSanitizer却报出libobjc.A.dylib、dyld等系统库存在泄漏。这是ASAN在macOS环境下的典型误报——系统库初始化阶段分配的内存,ASAN无法追踪到其释放流程,因此被误判为泄漏。

测试代码

int main() {
    auto *p = new int;
    delete p; // 无内存泄漏
    return 0;
}

编译运行命令

clang++ -fsanitize=address main.cpp -g
export ASAN_OPTIONS=detect_leaks=1
export MallocNanoZone=0
./a.out

解决方案

1. 用抑制文件过滤系统库误报

创建一个抑制规则文件(例如asan_suppressions.txt),添加以下内容:

leak:libobjc.A.dylib
leak:dyld

运行程序时指定该抑制文件:

export ASAN_OPTIONS=detect_leaks=1:suppressions=asan_suppressions.txt
export MallocNanoZone=0
./a.out

这样LeakSanitizer会忽略指定系统库的泄漏报告,只聚焦你自己代码的内存问题。

2. 调整泄漏检测时机(可选)

如果不需要在程序退出时检测泄漏,可以关闭退出时的泄漏检查(但会关闭所有退出阶段的泄漏检测,仅适合只关注运行时内存错误的场景):

export ASAN_OPTIONS=detect_leaks=1:leak_check_at_exit=false
export MallocNanoZone=0
./a.out

3. 升级工具或系统

部分新版本的Clang或macOS系统优化了ASAN对系统库的处理,能减少这类误报。如果条件允许,可以尝试升级Homebrew的Clang到最新版本,或者更新macOS系统。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 07:15:56