Z
ZHANK
编程在线教程C++ 教程Sanitizer 内存检测
内存管理进阶

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)。