Sanitizer 内存检测
AddressSanitizer 检测越界/UAF、UndefinedSanitizer、LeakSanitizer
Sanitizer 内存检测
Sanitizer 是编译器内置的运行时检测工具——能发现越界、use-after-free、数据竞争等隐藏 bug。
学完本章你将: 掌握 AddressSanitizer、UndefinedSanitizer、LeakSanitizer。
AddressSanitizer(ASan)
bash
# 编译时加上 -fsanitize=address
g++ -fsanitize=address -g main.cpp -o main
./main
cpp
int main() {
int* p = new int[10];
p[10] = 42; // ❌ 越界——ASan 立即报告!
delete[] p;
int* q = new int(42);
delete q;
*q = 100; // ❌ use-after-free——ASan 捕获!
}
UndefinedBehaviorSanitizer(UBSan)
bash
g++ -fsanitize=undefined main.cpp
cpp
int main() {
int x = INT_MAX;
x += 1; // ❌ 有符号整数溢出——UB!
// UBSan: runtime error: signed integer overflow
int* p = nullptr;
*p = 42; // ❌ 解引用空指针
}
LeakSanitizer(LSan)
bash
# 检测内存泄漏(通常随 ASan 一起启用)
g++ -fsanitize=address main.cpp
ASAN_OPTIONS=detect_leaks=1 ./main
cpp
void leak() {
int* p = new int[100]; // ❌ 忘记 delete——LSan 报告
}
int main() {
leak();
return 0;
}
// 输出: Direct leak of 400 byte(s)
💡 开发/测试阶段始终开启 Sanitizer。发布版本去掉(性能开销 ~2x)。