找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2503|回复: 0
打印 上一主题 下一主题
收起左侧

内存漏洞(leak)

[复制链接]
跳转到指定楼层
楼主
ID:108615 发表于 2016-3-13 17:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


如何检测C语言中的内存漏洞(leak)?在动态分配的内存单元(即由函数malloc()或ealloc()分
配的内存单元)不再使用却没有被释放的情况下,会出现内存漏洞。未释放内存单元本身并
不是一种错误,编译程序不会因此报告出错,程序也不会因此而立即崩溃。但是,如果不
再使用而又没有被释放的内存单元越来越多,程序所能使用的内存空间就越来越小。最终
,当程序试图要求分配内存时,就会发现已经没有可用的内存空间。这时,尤其是当程序
员没有考虑到内存分配失败的可能性时,程序的运行就会出现异常现象。
内存漏洞是最难检测的错误之一,同时也是最危险的错误。导致这个问题的编程错误很可
能出现在程序的开始部分,但只有当程序奠名其妙地使用完内存后,这个问题才会暴露出
来。此时去检查当前那条导致内存分配失败的语句是无济于事的,因为那些分配了内存却
未能按时释放内存的代码可能在程序的其它地方。遗憾的是C语言并没有为检测或修复内
存漏洞提供现成的方法。除非使用提供这种功能的商业软件包,否则,程序员就需要以很
大的耐心和精力去检测和修复内存漏洞。最好的办法是在编写程序时就充分考虑到内存漏
洞的可能性,并小心谨慎地处理这种可能性。导致内存漏洞的最简单的也是最常见的原因
是忘记释放分配给临时缓冲区的内存空间,请看下述程序段:

#include<stdio.h>
#include<stdlib.h>
/**Say hello to the user's and put the user's name in  UPPERCASE.*/
void   SayHi(char*name)
{
char* UpName;
int a;
UpName=malloc(strlen(name)+1);
/*Allocate  space  for  the  name*/
for(a=0;a<strlen(name);++a)
UpName[a]=toupper(name[a]);
UpName[a]='\0'i
printf("Hello,%si\n",UpName);
}
int main()
{
SayHi("Dave");
return(0);
}
这段程序中的问题是显而易见的——它为存储使用大写字母的名字分配了临时空间,但从
未释放这些空间。为了保证永远不发生类似的情况,你可以采用这样的方法:在分配内存
的每条语句后加上相应的free语句,然后把使用这些临时内存的语句插到这两条语句之间。
只要在程序中分配和释放内存的语句之间没有break,continue或goto语句,这种方法就
能保证每次分配的空间在使用完后就被释放掉。上述方法相当繁琐,并且不能完全避免内
存漏洞的出现,因为在实际编程中,所分配的内存空间的使用时间往往是不能预测的。此
外,如果操作或删除内存空间的程序段有错误,也会出现内存漏洞。例如,在删除链表的
过程中,最后一个结点可能会丢失,或者一个指向内存空间的指针可能会被改写。解决这
类问题的办法只能是小心谨慎地编写程序,或者象前面提到的那样使用相应的软件包,或
者利用语言的扩展功能。


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表