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

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++代码评审方案,融合静态分析、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 不管(这是标准库抛异常),只有原生数组或指针算术越界才会被捕获
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










