使用memcpy()出现的问题

假设存在这个应用

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 

 

 

 

 

 

 

你可能感兴趣的:(嵌入式软件)