启用内存泄漏/越界检查工具

2020-07-16 13:03:04 浏览数 (1)

只需要添加几行编译选项即可启用内存泄漏/越界检查工具。

注意:目前仅支持GCC 4.8版本以上编译工具,建议使用GCC 4.9版本以上。

0x01 编译选项

  1. 开启内存泄露检查功能:-fsanitize=leak
  2. 开启地址越界检查功能:-fsanitize=address
  3. 开启越界详细错误信息:-fno-omit-frame-pointer

0x02 以Qt工程为例子

  • .pro项目文件:
代码语言:javascript复制
SOURCES  = main.cpp

# -fsanitize=leak意思为开启内存泄露检查
QMAKE_CXXFLAGS  = "-fsanitize=leak"
QMAKE_CFLAGS    = "-fsanitize=leak"
QMAKE_LFLAGS    = "-fsanitize=leak"

# -fsanitize=address意思为开启内存越界检查
# -fno-omit-frame-pointer意思为显示更详细的信息
QMAKE_CXXFLAGS  = "-fsanitize=address -fno-omit-frame-pointer"
QMAKE_CFLAGS    = "-fsanitize=address -fno-omit-frame-pointer"
QMAKE_LFLAGS    = "-fsanitize=address"
  • main.cpp文件:
代码语言:javascript复制
#include <stdlib.h>

int main(int argc, char *argv[])
{
    /* 内存泄露 */
    malloc(10); /* 行6 */

    /* 内存越界 */
    int a[10] = {0};
    int b = a[11]; /* 行10 */

    return -1;
}
  • 运行输出(省略部分编译输出):
代码语言:javascript复制
/* 发现一处内存越界,位于main.cpp行10 */
==4495==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7ffc816edd5c 
#0 0x400998 in main ../Detector/main.cpp:10

/* 发现一处内存泄漏位于,main.cpp行6 */
Direct leak of 10 byte(s) in 1 object(s) allocated from:
#0 0x7ff56bbba602 in malloc (/usr/lib/x86_64-linux-gnu/libasan.so.2 0x98602)
#1 0x40071e in main ../Detector/main.cpp:6

0x03 命令行例子

代码语言:javascript复制
gcc -fsanitize=leak -fsanitize=address -fno-omit-frame-pointer -llsan main.cpp

0x04 关于更多

  • 上述开启的编译选项工具来源于sanitizers工具集: https://github.com/google/sanitizers/wiki
  • GCC编译器在线文档: https://gcc.gnu.org/onlinedocs/

0 人点赞