Address Sanitizer:
ASAN最早可以追溯到 LLVM 的 sanitizers项目(https://github.com/google/sanitizers),这个项目包含了AddressSanitizer,MemorySanitizer,ThreadSanitizer 和 LeakSanitizer等工具。这些工具可以检测用户空间的内存问题。通过在编译时加入指定的选项,就可以给用户程序加入 Address Sanitizer 功能。
其中Address Sanitizer(ASAN)工具是一个内存错误检测器,可以检测以下问题:
1)Out-of-bounds accesses to heap, stack and globals 堆、栈以及全局变量越界
2)Use-after-free 即访问dangling pointer,已经free的指针
3)Use-after-return (to some extent)
4)Double-free, invalid free
5)Memory leaks (experimental)
ASan基于shadow memory实现,目前已经集成到Clang 3.1和GCC 4.8以上版本。
编译选项
-fsanitize=address 使能Address Sanitizer工具
-fsanitize=leak 只使能Leak Sanitizer,检测内存泄漏问题
-fno-omit-frame-pointer 检测到内存错误时打印函数调用栈
-O1 代码优化选项,可以打印更清晰的函数调用栈
参考资料:https://github.com/google/sanitizers/wiki/AddressSanitizer
(1) 编译时添加编译选项
-fsanitize=leak -fsanitize=address -fno-omit-frame-pointer,其中leak是可选项。
(2) 链接时添加链接选项:
-fsanitize=leak -fsanitize=address -fno-omit-frame-pointer,其中leak是可选项。
(3) 运行时添加配置选项:
export LD_PRELOAD="/lib/libasan.so"
export ASAN_OPTIONS=halt_on_error=0:log_path=/home/asan.log:quarantine_size_mb=64 3
Thread Sanitizer:
参考资料:https: //github.com/google/sanitizers/wiki/ThreadSanitizerFlags
CFLAGS += -fno-omit-frame-pointer
CFLAGS +=-fsanitize=thread
LDFLAGS += -fsanitize=thread
export LD_PRELOAD="/lib/libtsan.so"
export TSAN_OPTIONS=log_path=/home/tsan.log:io_sync=2:external_symbolizer_path=llvm-symbolizer:memory_limit_mb=1600