只需要添加几行编译选项即可启用内存泄漏/越界检查工具。
注意:目前仅支持GCC 4.8版本以上编译工具,建议使用GCC 4.9版本以上。
0x01 编译选项
- 开启内存泄露检查功能:
-fsanitize=leak
- 开启地址越界检查功能:
-fsanitize=address
- 开启越界详细错误信息:
-fno-omit-frame-pointer
0x02 以Qt工程为例子
.pro
项目文件:
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
文件:
#include <stdlib.h>
int main(int argc, char *argv[])
{
/* 内存泄露 */
malloc(10); /* 行6 */
/* 内存越界 */
int a[10] = {0};
int b = a[11]; /* 行10 */
return -1;
}
- 运行输出(省略部分编译输出):
/* 发现一处内存越界,位于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/