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

本文记录了一次ARM程序调试经历,因参数传递错误导致程序异常终止。通过对Get_XorChk函数的深入分析,找到了问题所在,并采取了限制输入长度的方法解决了问题。

今天调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.限制后问题解决,当然因为起始地址的原因,这个方法不一定百分百可靠,要百分百可靠的话就要进行绝对地址限制才行的


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值