ASan內存泄漏檢測

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

[2] https://www.jianshu.com/p/3a2df9b7c353

[3] https://mp.weixin.qq.com/s?__biz=MzU2MTkwMTE4Nw==&mid=2247489292&idx=1&sn=a77388b3d40b9ea98d3d232319233e22&chksm=fc70ece0cb0765f6df56bc03f9ce732a448a260661d515370aa4b952b6d001edc1ba593480eb&mpshare=1&scene=1&srcid=&sharer_sharetime=1590392864836&sharer_shareid=ee07a75c2df1c2479c621a3d53371aa9&key=f2ef8f9151f25d77534eb806c05d30ee66205aeee4d4d2e75dcf6af3423805f669a14d2d77c47acdff28a273cdb195c9c33e087b7b25e877f86f8fb2a315013a88f2e8f175a7450275af7c87f1d4da2a&ascene=1&uin=Mjk1NzQ2MzYxMA%3D%3D&devicetype=Windows+10+x64&version=6209007b&lang=zh_CN&exportkey=A1gg6KK%2FhBtqh9ID2nN6nl8%3D&pass_ticket=D6p%2F6MSaLseUgovOx0IELEd4la7OS91l8T%2F51%2F03sXEFq7%2BIA%2BVIsflQkezNbONX

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章