您的位置:首页 > 其它

读数据的坑,Get_XorChk(Buf,L-1)中的坑

2013-09-27 16:35 134 查看
今天调ARM程序遇到的问题,消耗4小时

一:查找错误地方:

1. 最开始程序一切正常,在一次清除所有数据后,程序在打出最开始几个字符后,就OVER了,追查下去,发现关闭 Get_XorChk(uint8 *Buf,uint32 Len)

程序恢复正常,于是对Get_XorChk(uint8 *Buf,uint32 Len)进行分析

代码如下

uint8 Get_XorChk(uint8 *Buf,uint32 Len)

{

uint32 i=0;

uint8 a=0;

for(i = 0; i < Len; i++ ){

a^=Buf[i];

}

return a;

}

二:分析原因

1. 程序很简单,初看无论for(i = 0; i < Len; i++ ),还是a^=Buf[i],都是很正常的不会有任何问题

2.但是如果看这参数Len输入是Len-1,当数据清0后,Len=0时,(Len-1 )就发生了翻转,变成一个很大的数,这时语句:a^=Buf[i];,

就会发生问题,因为当读Buf[i]超过内存大小时,就会指向非法的地址,一些地方是不可以读的,一读程序就会OVER.

三: 解决问题

1.对Len的长度进行限制,这里把它限制在它的物理内存长度之内.

uint8 Get_XorChk(uint8 *Buf,uint32 Len)

{

uint32 i=0,XorLen;

uint8 a=0;

XorLen=Len;

if(XorLen>8192) XorLen=8192;

for(i = 0; i < XorLen; i++ ){

a^=Buf[i];

}

return a;

}

2.限制后问题解决,当然因为起始地址的原因,这个方法不一定百分百可靠,要百分百可靠的话就要进行绝对地址限制才行的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: