假设存在这个应用
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
|