ASAN(AddressSanitizer)使用技巧
ASAN(AddressSanitizer)是一种强大的内存错误检测工具,它可以帮助开发者在编译和运行时捕获和调试内存相关的错误。以下是一些使用ASAN的技巧,可以帮助你更有效地利用这一工具。
1. 开启ASAN功能
要在GCC中使用ASAN,你需要在编译时添加-fsanitize=address选项。例如,如果你正在使用GCC 4.8或更高版本,你可以这样编译你的代码:
gcc -fsanitize=address your_code.c -o your_program
2. 设置ASAN选项
ASAN提供了许多运行时选项,可以通过设置ASAN_OPTIONS环境变量来控制。例如,如果你想在检测到内存错误后继续运行程序,可以设置halt_on_error=0:
export ASAN_OPTIONS=halt_on_error=0
3. 内存泄漏检测
ASAN还集成了内存泄漏检测功能。要启用内存泄漏检测,你可以设置detect_leaks=1:
export ASAN_OPTIONS=detect_leaks=1
4. 屏蔽特定内存错误
如果你有一些内存错误是预期的或者不希望ASAN报告,你可以通过设置suppressions选项来屏蔽这些错误。你需要创建一个抑制文件(suppression file),其中列出你不希望ASAN报告的错误模式,然后在ASAN_OPTIONS中引用这个文件:
export ASAN_OPTIONS=suppressions=/path/to/suppressions.txt
5. 日志记录
你可以通过设置log_path选项来指定ASAN的日志文件路径。这样,ASAN的输出将会被记录到指定的文件中,方便后续分析:
export ASAN_OPTIONS=log_path=/path/to/asan.log
6. 使用LD_PRELOAD
在某些情况下,你可能需要使用LD_PRELOAD环境变量来预加载libasan.so 库。这通常在你使用的是一个较旧的GCC版本,或者你的程序已经静态链接了其他内存操作库时有用:
export LD_PRELOAD=/path/to/libasan.so
7. 结合其他工具使用
ASAN可以与其他内存分析工具结合使用,以提供更全面的内存错误检测。例如,你可以结合Valgrind的Massif工具来进行内存使用分析。
通过上述技巧,你可以更加高效地使用ASAN来检测和调试内存错误,从而提高代码的质量和可靠性。
例子
#include<stdio.h>
#include<stdlib.h>
int get_info(int* data, int n)
{int i = 0;while(i<n) data[i++] = 0x12345678;return 0;
}int main()
{int x = 0;int i = 8;int a[8] = {1,2,3,4,5,6,7,8};int *p = (int*)malloc(4);get_info(&x,9);//越界get_info(&a[0],9);//数组越界get_info(p,9);//内存越界printf("%p %p %p-%p\n",&x,&i,&a[0],&a[7]);while(i) printf("a[%#x] = %#x\n",i, a[--i]);return 0;
}
gcc test_asan.c -O2 -g -fsanitize=address -fno-omit-frame-pointer -lasan -o asan.exe