讲师中心 微信公众号
AI工具推荐 视频效率加速

c++ asan使用方法 c++如何用AddressSanitizer检测内存错误

大枫酱_8892

大枫酱_8892

发布时间:2026-03-21 20:57:11

|

210人浏览过

|

来源于php中文网

原创

加 -fsanitize=address 即可启用 ASan,需编译和链接阶段均添加,推荐搭配 -fno-omit-frame-pointer -g -O1;不支持与 TSan/MSan 混用,Windows 下需 Clang+MSVC;报错含地址、访问类型、调用栈,堆内存释放后仍可检测;ASAN_OPTIONS 需重启程序生效。

c++ asan使用方法 c++如何用addresssanitizer检测内存错误

编译时加 -fsanitize=address 就能用 ASan

ASan 不是独立工具,而是 GCC/Clang 内置的编译器插件。只要编译器支持(GCC 4.8+、Clang 3.1+),加一个 flag 就激活:-fsanitize=address。必须同时加在编译和链接阶段,否则会链接失败或漏检测。

常见错误现象:只在 g++ -c 时加,链接时不加 → 报 undefined reference 到 __asan_init 等符号;或者用了 -O2 但没关 -fomit-frame-pointer → 堆栈回溯不全,定位困难。

  • 推荐命令:g++ -fsanitize=address -fno-omit-frame-pointer -g -O1(-O1 是平衡点,-O2 可能优化掉部分检测逻辑)
  • 不能和 -fsanitize=thread 或 -fsanitize=memory 混用(冲突)
  • Windows 下需用 Clang + MSVC 工具链,MinGW 不支持 ASan

运行时报 ERROR: AddressSanitizer: heap-use-after-free 怎么看

ASan 报错信息本身已包含关键线索:出错地址、访问类型(read/write)、大小、调用栈(含源码行号)。重点不是“它报错了”,而是“它为什么能报出来”——ASan 在堆内存释放后,并不立刻归还给系统,而是标记为“已释放但可检测”,后续访问就会触发中断。

典型场景:对象被 delete 后继续调用成员函数、std::vector::data() 返回指针在 vector 重分配后仍被使用、lambda 捕获了局部变量地址但局部变量已退出作用域。

立即学习“C++免费学习笔记(深入)”;

  • 堆栈里如果看到 operator delete 和 operator new 的调用位置,说明问题大概率在那两行之间
  • 若调用栈末尾是 __asan_report_load_n 或 __asan_report_store_n,n 表示访问字节数,可反推是 int* 还是 char[256] 类型越界
  • 默认只检测堆/栈/全局区,不检测 mmap 分配的内存(除非加 -fsanitize-address-use-after-scope)

ASAN_OPTIONS 环境变量怎么调才有效

ASan 运行时行为由环境变量控制,最常用的是 ASAN_OPTIONS。它不是启动时读一次就完事,而是在每次检测到错误前动态检查——所以改了环境变量必须重启程序,且不能在代码里用 putenv 临时修改(无效)。

C++ Code Review Master
C++ Code Review Master

组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。

下载

几个真正有用的配置项:

  • abort_on_error=1:遇到错误直接 abort,避免程序继续跑歪导致二次崩溃掩盖原问题
  • detect_stack_use_after_return=1:检测栈上变量返回后被访问(默认关闭,开销大)
  • detect_invalid_pointer_pair=1:检测两个指针是否指向同一对象(用于 p1 类比较,C++20 要求定义行为)
  • log_path=./asan.log:把输出重定向到文件(注意路径需有写权限,且不会自动加后缀或轮转)

别设 allocator_mmap_threshold_mb 之类底层参数,除非你真在调优内存占用。

为什么开了 ASan 还没报出已知的野指针

ASan 不是万能的。它只拦截特定内存操作:堆分配/释放、栈帧进出、全局变量访问。对以下情况无能为力:

  • 未初始化的栈变量读取(用 -Wuninitialized 或 -fsanitize=undefined)
  • 函数指针乱跳、虚表篡改、reinterpret_cast 强转后的非法访问(ASan 不管指针值本身是否合法,只管它指向的内存是否可访问)
  • 多线程竞争导致的逻辑错误(如 data race,得用 -fsanitize=thread)
  • 释放后重用的指针恰好落在 ASan 的“隔离区”外(极小概率,但存在)

更隐蔽的是:某些 STL 容器(如 std::string 的 small string optimization)把数据存栈上,释放后访问可能不触发 ASan,因为根本没走堆分配路径。

所以,ASan 是内存安全的第一道筛子,不是最后一道。它报错,基本可信;它不报,不代表没问题。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

5739

2023.08.02

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

929

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2640

2023.10.25

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

4105

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

1690

2025.09.18

c++ 全局变量
c++ 全局变量

本专题整合了c++全局变量的使用、定义、作用域等等内容,阅读专题下面的文章了解更多详细内容。

199

2026.03.17

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

5739

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2845

2024.08.29

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

100

2026.09.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn