转载https://mp.weixin.qq.com/s/A3p3n6OG4Yc_NihIW3lUcg
Google sanitizers。它带有三个子功能,分别是:ASAN、TSAN、UBSAN。开发过程中最常使用 ASAN,用于检查内存问题。
内存检查
ASAN 基本是开发新特性时必备的检查工具,可以在单元测试、端到端测试以及压力测试环节,暴露代码潜在的内存 BUG。
常用检查项
Use after free
Heap buffer overflow
Stack buffer overflow
Global buffer overflow
Use after return
Use after scope
Initialization order bugs
Memory leaks
使能内存检查
某些 ASAN 功能默认是关闭的。若需要启用,需要单独设置环境变量 ASAN_OPTIONS。
g++ -fsanitize=address -fno-omit-frame-pointer -O1 -g xxx.cc -o xxx
拓展阅读
https://github.com/google/sanitizers/wiki/AddressSanitizer
多线程检查
使用 TSAN,内存开销大约是 5-10x,执行时间开销大约是 2-20x。
常用检查项
simple-race
thread-hostile-reference-counting
race-on-a-complex-object
notification
publishing-objects-without-synchronization
reader-lock-during-a-write
race-on-bit-field
race-during-destruction
data-race-on-vptr
data-race-on-vptr-during-construction
race-on-free
race-during-exit
race-on-a-mutex
race-on-a-file-descriptor
使能多线程检查
g++ -fsanitize=thread -fno-omit-frame-pointer -O1 -g xxx.cc -o xxx
拓展阅读
https://github.com/google/sanitizers/wiki/ThreadSanitizerCppManual
未定义行为检查
未定义行为(UB,Undefined Behavior)可能最容易被开发人员忽视。如果触发 UB,程序行为是未可知的,
常用检查项
alignment
bounds、array-bounds、local-bounds
float-cast-overflow、float-divide-by-zero
integer-divide-by-zero、implicit-integer-conversion、signed-integer-overflow
pointer-overflow
nonnull-attribute、null、nullability-arg、nullability-assign、nullability-return
使能未定义行为检查
g++ -fsanitize=undefined -fno-omit-frame-pointer -O1 -g xxx.cc -o xxx
扩展阅读
https://en.cppreference.com/w/cpp/language/ub https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html