读数据的坑,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.限制后问题解决,当然因为起始地址的原因,这个方法不一定百分百可靠,要百分百可靠的话就要进行绝对地址限制才行的
一:查找错误地方:
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.限制后问题解决,当然因为起始地址的原因,这个方法不一定百分百可靠,要百分百可靠的话就要进行绝对地址限制才行的
相关文章推荐
- ios学习--通过xib文件创建子控件 .
- Catenyms
- Android平台调用WebService详解
- Linux逻辑卷管理(LVM)操作笔记
- Mac上Android开发环境的搭建
- 存储流行混搭风 数据冷热分开治
- iOS7(Xcode5)中隐藏状态栏的方法
- 逆向并查集(ZOJ 3261)
- BUCK/BOOST电路原理分析
- uva 10651- Pebble Solitaire(状态压缩DP)待看。。。
- HTTP GET请求URL中IP被异常替换的问题
- SQUID工作原理是什么
- 【IE10打开链接的默认启动方式】
- 会计证考试《财经法规与职业道德》第一章精选题
- IGeoDatabaseBridge2.GetLineOfSight
- open source collect
- jQuery 导航条动态美化效果
- IIS详细错误代码以及解释
- SQL语句之Question 1
- spring的ioc原理(java反射机制)