使用memcpy()出现的问题

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 16:22   2184   0

假设存在这个应用

memcpy((U16*)pDes, (U16*)pSrc, size);

pDes:指向一个全局大数组 U8 acmd[3*1024];

pSrc:指向一个临时小数组 U8 filename[256];

在此基础上如果参数size <= 256 都是理所当然的,运行肯定也是没有问题的;

但是在我的实际应用中,我的size > 256,这是运行仍然没有报错误,但是整个系统运行就异常了。

分析了一下原因:

google了一下memcpy的源码,

//============================================

void *memcpy(void *dest,void *src, unsigned int count)
{
assert((dest!=NULL)&&(src!=NULL));
if(dest==src)
return src;
char* d=(char*)dest; //定义了2个临时的指针变量,仅仅装的是地址,并没有长度信息
char* s=(char*)src;
while(count--> 0)
*d++=*s++; //不断的++,即使加到得地址值大于src指向数据块最后一个元素地址,它依然会加直到(count--> 0)
return dest;
}
//============================================

接着注释说,这就造成pSrc指向了filename[256]数据块之后的数据,但这些数据是我未知的危险的,所以造成acmd[3*1024]中数据

紊乱了,但某个应用需要用到acmd[]中数据时错误就发生了。。。。。。

个人总结:事先需要对传入的参数count做好限制,<= src指向的数据块长度,同时也要<= dest指向的数据块长度。

这样才保证安全运行。不过很奇怪memcpy为什么当初不设计成自己判断长度有合法性呢?

------ 徐平 09/09/03

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP