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

c++ sanitizers用法 c++如何使用asan/tsan/ubsan保证代码质量

夏萱大大_7499

夏萱大大_7499

发布时间:2026-03-17 21:19:28

|

285人浏览过

|

来源于php中文网

原创

启用ASan需-fsanitize=address -fno-omit-frame-pointer,TSan需-fsanitize=thread -fno-omit-frame-pointer(不可与ASan/MSan共用),UBSan需-fsanitize=undefined(可叠加子项),且Clang更推荐。

c++ sanitizers用法 c++如何使用asan/tsan/ubsan保证代码质量

编译时加什么 flag 才能用上 ASan/TSan/UBSan

不改代码,只靠编译器开关就能启用 sanitizer —— 但必须确保链接阶段也一致。Clang 和 GCC 都支持,但行为略有差异,GCC 11+ 对 TSan 支持仍不稳定,建议优先用 Clang。

  • ASan(内存越界、UAF、栈缓冲区溢出):-fsanitize=address -fno-omit-frame-pointer,-fno-omit-frame-pointer 是必须的,否则堆栈追踪会断
  • TSan(数据竞争):-fsanitize=thread -fno-omit-frame-pointer,注意:不能和 ASan/MSan 同时用,会冲突
  • UBSan(未定义行为:整数溢出、空指针解引用、类型别名违规等):-fsanitize=undefined,可叠加子项如 -fsanitize=signed-integer-overflow,null,alignment
  • 所有 sanitizer 默认开启运行时检查开销;若要关掉某类(比如跳过浮点异常),得显式禁用:-fno-sanitize=float-divide-by-zero

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

ASan 报错自带完整调用栈,但前提是没被 strip 或优化干扰。Release 模式下 -O2 可能内联关键函数,导致栈帧丢失 —— 所以开发阶段务必用 -O1 或 -O0 配合 ASan。

  • 报错里出现 freed by thread T0 here: 和 previously allocated by thread T0 here: 是关键线索,对应 malloc 和 free 的位置
  • 如果看到 Shadow bytes around the buggy address: 下面全是 fa 或 fd,说明是 heap use-after-free;cb 通常表示 stack buffer overflow
  • 多线程下 UAF 可能跨线程触发,ASan 能捕获但不会告诉你哪条线程“真正”释放了内存,得结合 ThreadSanitizer 交叉验证
  • 避免误判:全局对象析构顺序问题有时也表现为 UAF,尤其在 atexit 注册的清理函数中访问已销毁单例

TSan 报 Data race on variable 'g_counter' 却没锁,怎么修

TSan 不关心你“觉得”有没有竞争,只看内存地址是否被多个线程无同步地读写。哪怕变量是 int、看似原子,只要没加同步原语,就报。

C++ 算法竞赛自动化测试数据生成与校验框架
C++ 算法竞赛自动化测试数据生成与校验框架

根据原题生成新题面、验证器及完整测试数据,自动套用 testlib 模板,用于用户要求生成测试数据时。

下载
  • 最简修复是加 std::atomic<int>,但注意:不是所有操作都默认序,load()/store() 默认是 memory_order_seq_cst,够用;若手动指定弱序,TSan 仍可能报(它只认同步动作,不推理语义)
  • 用 std::mutex 保护时,确保所有访问路径都走同一把锁 —— 常见坑是忘了某个分支或 lambda 捕获里偷偷读写
  • TSan 会忽略 std::atomic_thread_fence,除非配合原子操作;单纯打个 fence 不算同步点
  • 第三方库(如某些日志模块)内部有静态变量初始化竞争,TSan 会报但你改不了源码,可用 __tsan_ignore_reads_begin() 临时屏蔽(慎用,仅限确认无害)

UBSan 报 signed integer overflow 但逻辑上不可能发生

UBSan 在编译期插桩检测运行时行为,不分析控制流。所谓“逻辑上不可能”,往往是常量传播或符号执行没覆盖到的边界分支,或者你低估了输入范围。

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

  • 典型场景:循环里 i * 1000 累加,输入 i 来自文件或网络,UBSan 发现某次乘法溢出,而你测试时只用了小值
  • -fsanitize=undefined 默认不捕获浮点异常,如需检查除零或 NaN,得加 float-divide-by-zero 或 float-cast-overflow
  • 有些头文件(如 <algorithm>)里模板实例化可能引入隐式转换,UBSan 会报 implicit-conversion,这时加 -fno-sanitize=implicit-conversion 更合理,而不是硬改算法
  • Release 构建里关掉 UBSan 很常见,但要注意:某些 UB(如移位超界)在不同架构下表现不同,x86 可能静默截断,ARM 可能 trap —— 开发期不暴露,上线后才崩

sanitizer 不是银弹:它们依赖插桩,会拖慢 2–5 倍,且无法覆盖 fork 后子进程、dlopen 动态加载的代码、或 signal handler 里的逻辑。真要压测或线上灰度,得搭配静态分析(如 clang-tidy)和 fuzzing 才算兜住底。

相关文章

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

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

下载

相关标签:

c++

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

热门AI工具

更多
音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

切问学术

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

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

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

DeepSeek

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

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

豆包大模型

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

Seko
Seko Hot

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

相关专题

更多
css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

5407

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

584

2025.10.23

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

509

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1658

2024.03.01

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

5764

2023.10.24

scripterror怎么解决
scripterror怎么解决

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

889

2023.10.18

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

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

2360

2023.10.25

string转int
string转int

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

5199

2023.08.02

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

20

2026.09.23

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
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