今天调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.限制后问题解决,当然因为起始地址的原因,这个方法不一定百分百可靠,要百分百可靠的话就要进行绝对地址限制才行的
本文记录了一次ARM程序调试经历,因参数传递错误导致程序异常终止。通过对Get_XorChk函数的深入分析,找到了问题所在,并采取了限制输入长度的方法解决了问题。

被折叠的 条评论
为什么被折叠?



