分享
 
 
 

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

王朝c/c++·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

三、 示例

假设我们现在有这样一段程序: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环境,如果你是在Windows的Telnet客户端下执行,那么你可以在Windows下装一个叫做Exceed的工具软件,它可以方便地把X-Window显示在你的Windows桌面上)

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

我们可以看到Purify的报告中有两个内存错误,一个是ABR(Array 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级:提示信息(非错误)

<-上一页 下一页->

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有