C和C++是非常不安全且容易出错的编程语言,Address Sanitizer是由Google开发的一种工具,用于检测内存访问错误,如使用后释放(use-after-free)和内存泄漏。它已集成到GCC版本>= 4.8中,可用于C和C++代码。Address Sanitizer使用运行时插桩来跟踪内存分配,这意味着您必须使用AddressSanitizer构建代码,以充分利用其功能。
Use after free (dangling pointer dereference)
Heap buffer overflow
Stack buffer overflow
Global buffer overflow
Use after return
Use after scope
Initialization order bugs
Memory leaks
本文将会以上面8种场景来介绍内存检测工具AddressSanitizer。
注:本文已更新于星球,感兴趣的可以加入星球一起交流。
1.Use after free
以下面代码为例。首先,通过new
关键字分配了一个整数的内存空间,并将其地址赋给指针 ptr
。然后,使用 delete
关键字释放了这块内存。但是,在释放后,程序仍然尝试通过指针 ptr
访问已经释放的内存,并将值 10 赋给该内存位置,这就是使用后释放错误。
#include <iostream>int main() {int* ptr = new int;delete ptr;*ptr = 10; // Use after freereturn 0;
}
在编译时添加下面选项。
-fsanitize=address
运行生成的bin文件,得到如下结果。