0

0

c++怎么使用AddressSanitizer之外的其他Sanitizer_C++内存和线程错误检测工具介绍

尼克

尼克

发布时间:2025-11-14 16:15:02

|

178人浏览过

|

来源于php中文网

原创

UBSan检测未定义行为,如整数溢出;2. MSan发现未初始化内存读取;3. TSan捕捉数据竞争;4. LSan查找内存泄漏。各Sanitizer需编译时启用,依赖插桩与调试信息,运行时开销可控,适用于不同错误类型的排查。

c++怎么使用addresssanitizer之外的其他sanitizer_c++内存和线程错误检测工具介绍

AddressSanitizer(ASan)是C++开发中广泛使用的内存错误检测工具,但它并非唯一选择。根据不同的错误类型和运行环境,还有多个其他Sanitizer可以辅助排查问题。以下是几种常用的Sanitizer及其使用方法。

1. UndefinedBehaviorSanitizer (UBSan) —— 检测未定义行为

UBSan用于捕获C++中常见的未定义行为,例如整数溢出、空指针解引用、移位操作越界、类型双关等。这类错误在不同编译器或平台上可能表现不一,容易引发难以追踪的bug。

使用方式:

  • 编译时加入:-fsanitize=undefined
  • 示例命令:g++ -fsanitize=undefined -g -O1 main.cpp -o main
  • 运行程序,若触发未定义行为,会立即报错并打印堆

可选细化选项如 -fsanitize=signed-integer-overflow 只检测有符号整数溢出,减少性能开销。

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

2. MemorySanitizer (MSan) —— 检测未初始化内存读取

MSan专门用于发现使用了未初始化内存的问题,常见于局部变量或动态分配的内存未赋值就直接读取。

注意:MSan要求所有代码(包括依赖库)都用clang且启用-fsanitize=memory编译,否则可能误报。

Timely
Timely

一款AI时间跟踪管理工具!

下载
  • 编译:clang++ -fsanitize=memory -g -O2 main.cpp -o main
  • 运行后会提示哪一行读取了未初始化内存
  • 建议搭配静态链接或使用支持MSan的系统库

3. ThreadSanitizer (TSan) —— 检测数据竞争和线程安全问题

多线程程序中,共享数据未正确同步会导致数据竞争,TSan能有效捕捉这类问题。

  • 编译:g++ -fsanitize=thread -g -O1 main.cpp -o main (需使用clang或支持TSan的gcc)
  • 只能用于单个可执行文件,不能同时启用ASan或MSan
  • 输出包含竞争的两个访问位置及调用栈,帮助定位同步缺失点

适合调试std::thread、pthread等并发场景下的读写冲突。

4. LeakSanitizer (LSan) —— 检测内存泄漏

LSan通常集成在ASan中,但也可独立运行。它在程序退出时扫描堆内存,报告未释放的块。

  • 启用方式:g++ -fsanitize=leak -g main.cpp -o main
  • 或与ASan一起使用:-fsanitize=address,leak
  • 运行结束自动输出泄漏摘要,包含分配位置

无需额外API调用,适合常规内存泄漏筛查。

基本上就这些常用Sanitizer。每种都有特定用途,可根据问题类型选择启用。它们都依赖编译器插桩,因此需重新编译代码,并尽量保留调试信息(-g)。虽然带来一定运行时开销,但在调试阶段非常值得使用。

相关专题

更多
堆和栈的区别
堆和栈的区别

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

374

2023.07.18

堆和栈区别
堆和栈区别

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

564

2023.08.10

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

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

374

2023.07.18

堆和栈区别
堆和栈区别

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

564

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

473

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

131

2025.12.24

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

54

2025.12.01

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

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

20

2025.11.16

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

150

2025.12.31

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 3.2万人学习

Pandas 教程
Pandas 教程

共15课时 | 0.9万人学习

ASP 教程
ASP 教程

共34课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号