c++ address sanitizer continue_on_error c++ asan报错后如何继续执行

月夜之吻

月夜之吻

2026-03-21

868人浏览

原创

asan报错后无法安全继续运行,唯一可控方式是启动前设置asan_options="abort_on_error=0",但程序逻辑仍可能因内存破坏而崩溃,仅适用于调试;生产环境禁用,应优先修复首个错误。

c++ address sanitizer continue_on_error c++ asan报错后如何继续执行

ASan 报错后程序直接退出,怎么让它继续跑?

默认情况下,AddressSanitizer(ASan)检测到内存错误(如 use-after-freeheap-buffer-overflow)会调用 abort(),进程立刻终止。你没法靠 try/catch 捕获——ASan 的错误不是 C++ 异常,是信号(通常是 SIGABRTSIGSEGV),且默认不提供继续执行的入口。

abort_on_error=0 是唯一可控开关,但有硬限制

必须在 ASan 启动前通过环境变量控制,运行时无法修改。关键点是:它只让 ASan **打印错误后不 abort**,但**不保证程序逻辑安全继续**——踩了堆溢出还往下跑,极大概率触发二次崩溃或未定义行为。

  • 启用方式:ASAN_OPTIONS="abort_on_error=0" ./your_program
  • 注意:continue_on_error 不是合法选项名,ASan 官方文档和源码中只有 abort_on_error=0 有效
  • 它不会跳过错误检查,每次再触发同类问题仍会重复报告
  • 仅适用于调试场景(比如想看一连串越界位置),生产环境禁用

为什么不能靠 signal handler + longjmp 续命?

有人试过捕获 SIGABRTlongjmp 回主循环——这非常危险:

C函数速查手册(CHM版)
C函数速查手册(CHM版)

C函数速查手册(CHM版)

下载
  • ASan 内部可能已破坏栈帧或寄存器状态,longjmp 会跳进不可信上下文
  • 报错点之后的代码若依赖被破坏的内存(如指针已被 free),继续执行等于主动触发新 UB
  • Clang/LLVM 的 ASan 实现明确不保证信号处理后的可恢复性,属于未定义行为
  • 即使“看起来”跑下去了,结果不可信,日志也难追溯真实源头

真要观察多处错误,正确做法是分段隔离

与其强行续命,不如把可疑逻辑拆开,逐个验证:

  • __asan_report_explicit() 手动触发检查(需包含 <sanitizer></sanitizer>),配合条件编译定位范围
  • 对高风险模块(如解析器、序列化)单独编译链接 ASan,其他模块关掉,避免干扰
  • 结合 detect_stack_use_after_return=1strict_string_checks=1 提前暴露隐性问题
  • 错误集中爆发时,优先看第一个 ASan 报告——后续报错往往是前一个破坏的连锁反应

ASan 的设计哲学就是“错即停”,强行绕过它最核心的安全边界,相当于关掉安全气囊还猛踩油门。真正该花时间的,是让第一个错误不发生。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

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

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

下载

相关标签:

c++

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

相关专题

更多
C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

2026.04.23

114

31

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

2317

5

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.10

1166

6

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

2317

5

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.10

1166

6

overflow什么意思
overflow什么意思

overflow是一个用于控制元素溢出内容的属性,当元素的内容超出其指定的尺寸时,overflow属性可以决定如何处理这些溢出的内容。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.08.15

2970

3

Qt Creator编译运行使用教程
Qt Creator编译运行使用教程

围绕 Qt Creator 编译、运行、构建错误、断点调试、变量查看、调用栈、Debug与Release切换、编译输出和运行日志展开,帮助用户处理程序无法运行、断点不生效、找不到库文件、构建失败等问题。

2026.08.05

0

10

Qt Creator按钮响应设置方法
Qt Creator按钮响应设置方法

信号槽是 Qt 开发的核心机制。本专题整理 Qt Creator 中按钮点击、菜单触发、输入变化、窗口事件、自定义信号、自动连接槽函数和手动 connect 写法,帮助用户理解界面控件如何和 C++ 代码联动。

2026.08.05

0

10

Qt Creator新建项目使用教程
Qt Creator新建项目使用教程

本专题整理 Qt Creator 新建项目、打开已有工程、项目模板选择、目录结构、源文件管理、构建目录、运行配置和项目迁移方法,重点解决新手不知道选 qmake 还是 CMake、项目打不开、文件不参与编译等常见问题。

2026.08.05

0

10

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
RabbitMQ 教程手册
RabbitMQ 教程手册

共0课时 | 0人学习

Linux man-pages 项目
Linux man-pages 项目

共0课时 | 0人学习

C# 教程
C# 教程

共94课时 | 20.2万人学习