Sanitizers 是 LLVM/Clang 和 GCC 提供的运行时检测工具,通过插桩实时捕获内存、线程和未定义行为错误;包括 ASan(内存错误)、TSan(数据竞争)、UBSan(未定义行为),需正确编译链接并配置选项以确保精准高效。

Sanitizers 是 LLVM/Clang 和 GCC 提供的一组运行时检测工具,能高效捕获 C++ 中常见且隐蔽的内存、线程和未定义行为错误。它们不是静态分析器,而是在程序运行时插桩(instrumentation),通过轻量级内存/指令监控实时报告问题,精度高、开销可控(通常 2–3 倍 slowdown),是现代 C++ 工程调试与 CI 质量门禁的关键手段。
AddressSanitizer(ASan)专用于检测堆栈缓冲区溢出、use-after-free、use-after-return、内存泄漏(需额外开启)等。
detect_leaks=1 启用内存泄漏检测(仅对 main 返回后存活的堆内存有效)ThreadSanitizer(TSan)在多线程环境下动态追踪内存访问的同步关系,精准识别无锁并发中的竞态条件——这类 bug 往往偶发、难复现,TSan 是目前最实用的解决方案。
__tsan_acquire/__tsan_release 手动标注同步点UndefinedBehaviorSanitizer(UBSan)检查整数溢出、空指针解引用、类型不匹配(如 signed/unsigned shift)、违反 strict aliasing 等 C++ 标准明确定义为“未定义”的操作。
立即学习“C++免费学习笔记(深入)”;
vptr 检测虚表指针损坏(对象析构后调用虚函数),shift 捕获非法位移(如右移负数)UBSAN_OPTIONS=print_stacktrace=1:halt_on_error=0 收集多次违规后退出float-cast-overflow)可能影响浮点性能,生产构建慎用Sanitizers 强大但需正确集成,否则易失效或干扰调试流程。
ASAN_OPTIONS=handle_sigill=1:handle_sigbus=1 捕获更多信号异常-fno-omit-frame-pointer(部分旧版需要)以上就是如何使用Sanitizers(ASan, TSan, UBSan)检测c++++运行时错误【高级调试】的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号