C/C++内存问题检查利器—Purify (二)

原创 2003年12月11日 11:37:00

 

三、           示例

假设我们现在有这样一段程序:hello.c

#include <stdio.h>

#include <malloc.h>

 

static char *helloWorld = "Hello, World";

 

main()

{

   char *mystr = malloc(strlen(helloWorld));

 

   strncpy(mystr, helloWorld, 12);

   printf("%s/n", mystr);

}

 

很明显,这段程序中有内存上的错误,假设我们疏忽了这些错误,当我们使用Purify进行测试时,我们会发现这段程序中的内存错误在Purify下很容易就被找出来了。首先,我们要做的是使用Purify编译这段程序:

 

> purify gcc -g -o hello hello.c

Purify 2003.06.00 Solaris 2 (32-bit) Copyright (C) 1992-2002 Rational Software Corp. 
All rights reserved. 

Instrumenting: cckc6pUD.o  Linking

 

记得加上“-g”的选项,不然,purify不能显示源程序。好了,现在在当前目录下产生了可执行文件——hello,在运行hello之前,我们还得注意,执行被Purify编译过的程序,有可能会出现X-Windows,所以请注意设置DISPLAY环境,如果你是在WindowsTelnet客户端下执行,那么你可以在Windows下装一个叫做Exceed的工具软件,它可以方便地把X-Window显示在你的Windows桌面上)

 

好了,我们现在执行hello程序,就可以看到下面的一个窗口:

 

 

我们可以看到Purify的报告中有两个内存错误,一个是ABRArray Bounds Read)——数组越界读,一个是12个字节的Memory Leaked,展开小三角符号,我们可以看到更为详细报告:

 


展开
ABR错误后,我们可以看到,ABR错误的产生是由printf产生的,而产生错误的内存是mystr。通过观察,我们马上可以发现为会什么会出现ABR错误,原因是C/C++中的字符串都是以“/0”结尾的,而我们分配字符串时,应该要比实际长度多一,以存放结束符,而我们以后面调用的strncpy只拷贝了字符串的有效内容,并没有在字符串最后加上一个结束符。而系统调用printf输出字符串内容直至遇到结束符,所以当其访问到12个长度时,还没有发现结束,于是继续向下访问,于是就出现了ABR错误。

 

 

好了,让我们再来看看Memory Leaked的报告信息:


 

我们可以看到,Purify指出了那块内存出现了内存泄露,泄露了多少个字节。通过Purify的报告,再加上我们对C/C++基础的了解,我们立马知道mystr是在堆上分配的内存,所以必须要我们自己手动释放,查看程序,我们发现我们忘了free ( mystr )

 

好了,现在我们可以根据Purify报告修改我们的程序了:

 

#include <stdio.h>

#include <malloc.h>

 

static char *helloWorld = "Hello, World";

 

main()

{

       char *mystr = malloc(strlen(helloWorld)+1);

 

   strncpy(mystr, helloWorld, 12);

   mystr[12]=”/0”;

 

   printf("%s/n", mystr);

   free(mystr);

}

 

现在,我们再用Purify重新编译我们的程序,然后运行,我们可以看到Purify会报告没有任何的内存问题。其实,使用Purify很简单,在后面,我将对Purify的各种常用特性做比较全面的阐述。

 

四、           内存问题一览

下面是Purify所能检测到的内存信息表:

 

内存信息

描述

错误等级

ABR

Array Bounds Read 数组越界读

3

ABW

Array Bounds Write 数组越界写

2

BSR

Beyond Stack Read 越栈读

3

BSW

Beyond Stack Write 越栈写

3

COR

Core Dump Imminent 非法操作

1

FIU

File Descriptors In Use 文件描述符被使用

4

FMM

Freeing Mismatched Memory 释放错误内存

2

FMR

Free Memory Read 对已释放内存读

3

FMW

Free Memory Write 对已释放内存写

2

FNH

Freeing Non Heap Memory 释放非堆内存

2

FUM

Freeing Unallocated Memory 释放了没有分配的内存

2

IPR

Invalid Pointer Read 非法指针读

1

IPW

Invalid Pointer Write 非法指针写

1

MAF

Malloc Failure 分配内存失败

4

MIU

Memory In-Use 内存正在使用

4

MLK

Memory Leak 内存泄露

3

MRE

Malloc Reentrancy Error remalloc错

2

MSE

Memory Segment Error 内存段错

3

NPR

Null Pointer Read 空指针读

1

NPW

Null Pointer Write 空指针写

1

PAR

Bad Parameter 错误的参数

3

PLK

Potential Leak 潜在的内存泄露

3

SBR

Stack Array Bounds Read 栈数组越界读

3

SBW

Stack Array Bounds Write 栈数级越界写

2

SIG

Signal 信号

4

SOF

Stack Overflow 栈溢出

3

UMC

Uninitialized Memory Copy 对未初始化的内存进行拷贝

3

UMR

Uninitialized Memory Read 对未初始化的内存读

3

WPF

Watchpoint Free 释放被监控的内存

4

WPM

Watchpoint Malloc 被监控的内存分配

4

WPN

Watchpoint Entry 被监控的内存

4

WPR

Watchpoint Read 被监控的内存读

4

WPW

Watchpoint Write 被监控的内存写

4

WPX

Watchpoint Exit 退出被监控的内存

4

ZPR

Zero Page Read 零页面读

1

ZPW

Zero Page Write 零页面写

1

 

1级:致命错误。   2级:危险错误。    3级:警告信息     4级:提示信息(非错误)


<-上一页  下一页->

 

(版权所有,转载时请注明作者和出处)

 

使用purify检查内存泄漏

使用purify检查内存泄漏   1.        下载并安装IBM Rational Purifyplus 下载地址:http://www.ibm.com/developerworks/cn...
  • nianhuo5678
  • nianhuo5678
  • 2014年05月23日 11:07
  • 1006

C/C++内存问题检查利器——Purify

C/C++内存问题检查利器——Purify   陈皓 一、           引言   我们都知道软件的测试(在以产品为主的软件公司中叫做QA—Quality Assessment)占了整...
  • zb872676223
  • zb872676223
  • 2014年07月17日 15:40
  • 990

使用Purify检查内存泄漏

  • 2016年01月03日 13:03
  • 1.42MB
  • 下载

C/C++内存问题检查利器—Purify (一)

C/C++内存问题检查利器——Purify 陈皓一、           引言 我们都知道软件的测试(在以产品为主的软件公司中叫做QA—Quality Assessment)占了整个软件工程的30% ...
  • haoel
  • haoel
  • 2003年12月11日 11:34
  • 24610

opencv调试有未经处理的异常内存溢出的解决办法(opencv调试出错:x7c812afb处有未经处理的异常:MicrosoftC++异常:内存位置0x0011f408处的cv::Exceptio)

一,opencv异常显示(我的opencv2.4.9+vs2013) opencv调试出错:x7c812afb处有未经处理的异常:MicrosoftC++异常:内存位置0x0011f408处...
  • Edison_03
  • Edison_03
  • 2017年01月08日 22:52
  • 3851

mfc连接ACCESS2010及以上版本,部分“MicrosoftC++异常”处理

解决mfc连接access2010异常提示
  • xuyandcsdn
  • xuyandcsdn
  • 2016年05月21日 08:05
  • 402

C/C++内存问题检查利器—Purify (三)

五、             文件描述符问题在上面的内存问题表中,对于大多数的内存问题来说,相信对于熟悉C/C++的程序员,并不陌生。有一些关于Watchpoint和文件描述符的内容,可能会让你看得比...
  • haoel
  • haoel
  • 2003年12月15日 01:26
  • 20195

内存检测工具purify的简介

  • 2010年10月13日 22:44
  • 612KB
  • 下载

POCO中的异常处理和调试

内容概要: POCO异常类;定义自己的异常;抛出和捕捉异常;调试工具 一、POCO异常类 所有的POCO异常都从Poco::Exception类继承, 需要包含头文件 #include "Po...
  • ihope
  • ihope
  • 2014年12月31日 13:34
  • 327

深入理解C++异常

异常是指程序在运行时存在异常行为,这些异常的行为让函数不能正常执行。异常应该捕获的应该是你能够处理的错误,比如:不能连接服务器,不能连接数据库等,但异常不应该是你修复代码的bug的手段,比如:数组访问...
  • SKY453589103
  • SKY453589103
  • 2015年11月16日 10:56
  • 5048
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C/C++内存问题检查利器—Purify (二)
举报原因:
原因补充:

(最多只允许输入30个字)