AddressSanitizer(ASan)
簡介
AddressSanitizer(ASan),該工具爲gcc自帶,4.8以上版本都可以使用,支持Linux、OS、Android等多種平臺,不止可以檢測內存泄漏,它其實是一個內存錯誤檢測工具,可以檢測的問題有:
- 內存泄漏
- 堆棧和全局內存越界訪問
- free後繼續使用
- 局部內存被外層使用
- Initialization order bugs(中文不知道怎麼翻譯纔好,後面有代碼舉例,重要)
官方文檔
https://github.com/google/sanitizers/wiki/AddressSanitizer
Code
單文件
g++ -fsanitize=address -g testmem.cpp && ./a.out
多文件
ASAN_OPTIONS=check_initialization_order=true:strict_init_order=true
g++ -fsanitize=address -g testmem1.cpp testmem2.cpp
ASAN_OPTIONS=check_initialization_order=true:strict_init_order=true ./a.out
補充
- 用-fsanitize=address選項編譯和鏈接你的程序。
- 用-fno-omit-frame-pointer編譯,以得到更容易理解stack trace。
- 可選擇-O1或者更高的優化級別編譯
錯誤類型
- (heap) use after free 釋放後使用
- heap buffer overflow 堆緩存訪問溢出
- stack buffer overflow 棧緩存訪問溢出
- global buffer overflow 全局緩衝訪問溢出
- use after return
- use after scope
- initializations order bugs
- memory leaks 內存泄露
LeakSanitizer: detected memory leaks
工作原理
https://www.jianshu.com/p/3a2df9b7c353
參考文獻
[1] http://www.cppblog.com/markqian86/archive/2018/06/14/215728.html