前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >启用内存泄漏/越界检查工具

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

作者头像
Qt君
发布2020-07-16 13:03:04
4.3K0
发布2020-07-16 13:03:04
举报
文章被收录于专栏:跟Qt君学编程

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

注意:目前仅支持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/
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Qt君 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x01 编译选项
  • 0x02 以Qt工程为例子
  • 0x03 命令行例子
  • 0x04 关于更多
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档