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

你可能感兴趣的:(C/C++)