c++ ubsan使用方法 c++如何用UndefinedBehaviorSanitizer检测未定义行为

大晨吖_4838

大晨吖_4838

2026-03-21

941人浏览

原创

c++oding="utf-8" ?>

ubsan需编译和链接阶段均启用-fsanitize=undefined,clang还需-fno-omit-frame-pointer;gcc 9.1+需额外加-fno-sanitize-recover=all;cmake中须同步配置编译与链接标志,静态链接libc++时libubsan也需静态链接。

c++ ubsan使用方法 c++如何用undefinedbehaviorsanitizer检测未定义行为

UBSan 编译时怎么加参数才真正生效

UBSan 不是链接期或运行期开关,必须在编译和链接两个阶段都显式启用,否则 clang++ 或 g++ 会静默忽略检测逻辑。

  • Clang 下必须同时加 -fsanitize=undefined 和 -fno-omit-frame-pointer(后者让栈回溯可用,否则崩溃时看不到调用链)
  • GCC 9.1+ 支持 UBSan,但部分检查项(如 signed-integer-overflow)默认关闭,需手动补全:-fsanitize=undefined -fno-sanitize-recover=all 才能中断执行而非仅报错继续
  • 如果项目用 CMake,别只在 CXX_FLAGS 里加,还要确保 CMAKE_EXE_LINKER_FLAGS 同步追加相同 -fsanitize=undefined,否则链接器可能丢掉 sanitizer 运行时库
  • 静态链接 libc++ 时(-static-libc++),UBSan 运行时(libubsan)也得静态链接,否则运行时报 undefined symbol: __ubsan_handle_add_overflow

哪些未定义行为能被 UBSan 实际捕获

UBSan 不是万能的,它只覆盖编译器插桩可识别的、运行时有明确“越界点”的行为。像 use-after-free 或 data race 属于 ASan / TSan 范畴,UBSan 完全不碰。

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

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

下载
  • 典型能抓到的:整数溢出(int a = INT_MAX + 1;)、空指针解引用(*nullptr)、数组越界(arr[5] 当大小为 5)、移位超长(1 )、违反严格别名(<code>reinterpret_cast<float>(&i)</float> 读 int 变量)
  • 典型抓不到的:未初始化变量读取(UB 但无插桩点)、返回局部变量地址(编译器可能优化掉访问)、跨函数的指针失效(如函数返回栈地址后在外层解引用)
  • -fsanitize=undefined 默认不开 float-divide-by-zero,要检测除零得显式加 -fsanitize=float-divide-by-zero

运行时报错信息怎么看懂并定位到源码

UBSan 错误输出不是堆栈,而是带文件/行号的触发点 + 检查类型描述,但容易误读成“问题在这行”,其实那只是 UB 表现出来的第一现场。

  • 典型错误格式:main.cpp:12:15: runtime error: signed integer overflow: 2147483647 + 1 cannot be represented in type 'int' —— 这里 main.cpp:12 是溢出发生行,但根源可能是上游传入了错误值
  • 若没符号信息(比如 strip 过的二进制),会显示 ???:0,此时必须重新编译带 -g 且不 strip
  • 多线程下错误可能乱序打印,用 UBSAN_OPTIONS=halt_on_error=1 让首次 UB 就终止,避免干扰
  • 对模板实例化导致的错误,路径里会出现 .h:45:22 这种,注意看是不是头文件里内联函数出的问题,而非调用处

和 ASan / TSan 一起用要注意什么

可以共存,但不是简单叠加参数就完事,运行时冲突和性能开销会指数级上升。

  • Clang 下三者可同时启用:-fsanitize=address,undefined,thread,但 GCC 不支持 UBSan+TSan 共存(会链接失败)
  • ASan 和 UBSan 都会重写内存访问,开启全部检查时,UBSAN_OPTIONS=detect_stack_use_after_return=1 会导致 ASan 的类似功能重复触发,建议关掉 UBSan 的栈相关检查
  • 混合使用时,优先跑 ASan(内存问题更基础),再跑 UBSan(逻辑类 UB),最后跑 TSan(并发)。一次开全三个,单测可能慢 20 倍以上,CI 中慎用
  • 若用 std::vector::at() 触发越界,UBSan 不管(这是标准库抛异常),只有原生数组或指针算术越界才会被捕获
UBSan 的真实价值不在“发现所有 UB”,而在于把那些编译器能静态推断、运行时又有明确陷阱点的行为,变成可复现、可打断、带位置信息的信号——但前提是编译参数没漏,运行环境没动过手脚,而且得接受它对某些 UB 类型根本无感。

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

相关文章

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

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

下载

相关标签:

c++

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

相关专题

更多
string转int
string转int

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

2023.08.02

5819

3

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

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

2024.08.29

2885

6

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

2025.08.29

3648

10

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

2025.08.29

2565

10

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

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

2026.04.23

339

31

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

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

2023.07.18

5267

5

堆和栈区别
堆和栈区别

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

2023.08.10

2328

6

空指针异常处理
空指针异常处理

本专题整合了空指针异常解决方法,阅读专题下面的文章了解更多详细内容。

2025.11.16

179

10

undefined是什么
undefined是什么

undefined是代表一个值或变量不存在或未定义的状态。它可以作为默认值来判断一个变量是否已经被赋值,也可以用于设置默认参数值。尽管在不同的编程语言中,undefined可能具有不同的含义和用法,但理解undefined的概念可以帮助我们更好地理解和编写程序。本专题为大家提供undefined相关的各种文章、以及下载和课程。

2023.07.31

11605

4

热门下载

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

精品课程

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

共0课时 | 0人学习

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

共0课时 | 0人学习

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

共0课时 | 0人学习