Sanitizer:Address、Thread、UB Sanitizer
使用 Sanitizer 家族发现内存、线程和未定义行为错误
Sanitizer:Address、Thread、UB Sanitizer 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。
运行时检测器
运行时检测器是在编译时插入检测代码的运行时检查工具,内置于 Clang 和 GCC 中。它们可以发现类型系统无法发现的错误。
AddressSanitizer(ASan)
检测内存错误:缓冲区溢出、释放后使用、重复释放和内存泄漏。运行速度约降低 2 倍。
g++ -fsanitize=address -g -O1 main.cpp
./a.outASan 输出示例
当 ASan 检测到错误时,它会打印包含确切行号和错误类型的堆栈跟踪。
==ERROR: AddressSanitizer: heap-buffer-overflow
READ of size 4 at 0x60200000001c
#0 0x... in main main.cpp:12ThreadSanitizer(TSan)
检测数据竞争和其他并发错误。运行速度约降低 5 至 15 倍。
g++ -fsanitize=thread -g main.cpp
./a.out
# Reports concurrent unprotected accesses未定义行为检测器(UBSan)
可以捕获有符号整数溢出、空指针解引用、未对齐访问、除以零等错误。
g++ -fsanitize=undefined -g main.cppMemorySanitizer(MSan)
检测对未初始化内存的读取。仅支持 Clang。要求整个程序(包括库)都在 MSan 下构建。
LeakSanitizer
在 Linux 上与 ASan 一起捆绑提供。报告程序退出时仍处于分配状态的内存。
ASAN_OPTIONS=detect_leaks=1 ./a.out运行时检测器并非免费
所有运行时检测器都会降低程序速度并增加内存使用量。请在开发和 CI 中使用它们,而不要用于生产发布版本。
无法全部组合使用
ASan、TSan 和 MSan 彼此不兼容,因为它们使用不同方式插入内存检测代码。UBSan 可以与其他检测器组合使用。
编译器支持
GCC 支持 ASan、TSan 和 UBSan。Clang 支持上述所有检测器以及 MSan。不同编译器使用的选项相同。
CI 集成
在 CI 中让每个运行时检测器分别运行您的测试套件。在发布前捕获竞争条件和内存错误。结合模糊测试可以获得最佳覆盖率。
提示:使用 -O1 构建
为运行时检测器构建程序时,至少使用 -O1 进行优化。-O0 也可以工作,但内联较少,因此堆栈跟踪提供的信息较少。
抑制文件
对于已知的误报或第三方问题,请编写抑制文件,并告诉运行时检测器忽略这些问题。
ASAN_OPTIONS="suppressions=asan.supp" ./a.out快速检查
哪个运行时检测器可以捕获线程之间的数据竞争?
回顾
运行时检测器可以捕获真实的运行时错误:AddressSanitizer 用于检测内存错误,ThreadSanitizer 用于检测竞争,UBSan 用于检测未定义行为,MSan 用于检测未初始化读取。在 CI 中将它们与测试套件结合使用,可以显著提高安全性。
常见问题解答
「Sanitizer:Address、Thread、UB Sanitizer」课时是免费的吗?
是的 — 「Sanitizer:Address、Thread、UB Sanitizer」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。
「Sanitizer:Address、Thread、UB Sanitizer」这节课中我会学到什么?
使用 Sanitizer 家族发现内存、线程和未定义行为错误 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C++ Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「Sanitizer:Address、Thread、UB Sanitizer」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C++ Academy 课中编写并运行代码吗?
能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 静态分析工具:clang-tidy、cppcheck
- Sanitizer:Address、Thread、UB Sanitizer
- 使用 libFuzzer 进行模糊测试
- C++ 项目的持续集成