搜索
bottom↓
回复: 29

数组下标越界导致其他全局变量被窜改

[复制链接]

出0入0汤圆

发表于 2015-11-11 21:37:36 | 显示全部楼层 |阅读模式
最近一直被这问题困扰,今天才解决。
程序是跑在DSP28335上的,是串口接收另外一款处理器发来的数据,处理后发送给其他设备。
发现有时有些全局变量无缘无故被改变,而程序还在正常运行。感觉很奇怪,找了好几天问题,
后来发现是串口接收在处理异常报文时有bug,导致里串口接收缓存数组越界,然后越界后就将其他的变量给改变了。
用STM32时也遇到过数组越界,但这时候处理器是进硬件错误中断里了,没有像28335那样直接改变其他变量的,问下其他人有遇到过这种问题吗?
还有想请教下处理编程上注意外,其他还有什么办法防止数组下标越界吗?

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出1070入962汤圆

发表于 2015-11-11 21:47:31 | 显示全部楼层
FIFO环形队列,是治疗下标溢出的不二良药。

出1070入962汤圆

发表于 2015-11-11 21:49:27 | 显示全部楼层
但是这个东西还是头疼医头脚疼医脚啊,
能解决造成溢出的根子才是正道

出20入25汤圆

发表于 2015-11-11 21:55:03 | 显示全部楼层
Appcat 发表于 2015-11-11 21:49
但是这个东西还是头疼医头脚疼医脚啊,
能解决造成溢出的根子才是正道

同问这个HardFault 芯片设计时是怎么检测越界的

出0入54汤圆

发表于 2015-11-11 21:58:55 | 显示全部楼层
STM32也不见得会进hardFault,我就遇到过把我全局变量改了但不进的。
他进的话应该也是要非法访问才会的。

出0入93汤圆

发表于 2015-11-11 22:00:43 | 显示全部楼层
C语言不检查数组下标越界,如果应用中有越界的可能,就需要在程序中编写越界检查的代码

出0入0汤圆

发表于 2015-11-11 22:08:41 | 显示全部楼层
必须要判断地址  或者长度的      当然环形队列也是一种解决的方式
关键要根据接受数据的长度,选择适合的缓冲大小 ,  帧数据到达后 即使处理即可以了   

出0入0汤圆

发表于 2015-11-11 22:19:28 | 显示全部楼层
数组名不也是指针。。

出0入10汤圆

发表于 2015-11-11 22:29:21 | 显示全部楼层
也不是一定会进入硬件错误中断里面

出0入0汤圆

发表于 2015-11-11 22:33:46 来自手机 | 显示全部楼层
我遇到过一次全局数组被意外修改的情况,后面采用数据访问断点调试发现是有个局部变量地址和全局变量重叠导致,编译器编译没有任何问题,上网查询,是因为栈空间设置太小导致,一直没明白这是为啥,不知道编译器是咋给变量分配地址的!!

出0入0汤圆

发表于 2015-11-11 23:08:37 | 显示全部楼层
呵和,这个只能靠自己了

出0入0汤圆

发表于 2015-11-11 23:17:17 来自手机 | 显示全部楼层
看来很有必要学习数据结构:

出0入0汤圆

发表于 2015-11-12 08:47:44 | 显示全部楼层
变量如果在顺序存储的,你数组越界肯定导致后面的变量被意想不到的篡改。

出0入10汤圆

发表于 2015-11-12 09:01:18 | 显示全部楼层
lingdianhao 发表于 2015-11-11 22:33
我遇到过一次全局数组被意外修改的情况,后面采用数据访问断点调试发现是有个局部变量地址和全局变量重叠导 ...

这就是堆栈溢出啦

出0入0汤圆

发表于 2015-11-12 09:06:29 来自手机 | 显示全部楼层
我也我也遇到 修改局部变量数组 结果改变全局变量数组了 一直没找到原因 似乎是局部变量数组太大的原因

出0入0汤圆

发表于 2015-11-12 09:07:38 来自手机 | 显示全部楼层
lingdianhao 发表于 2015-11-11 22:33
我遇到过一次全局数组被意外修改的情况,后面采用数据访问断点调试发现是有个局部变量地址和全局变量重叠导 ...

怎么看局部变量和全局变量的地址

出40入42汤圆

发表于 2015-11-12 09:21:16 | 显示全部楼层
1.进入HardFault是因为非法访问了一些地址,比如说某些没有初始化的模块的地址;

2.单纯的数据RAM地址越界操作是不会进入HardFault的,至于为什么会修改全局变量,其实跟编译器编译出来的内存分配空间有关系;
比如说全局变量g_A、g_B、g_C是连续存放的,那么指向g_B的指针越界访问时,就会访问到g_C或g_A了,数组也是跟指针一样的道理;

3.要怎么防止这种地址越界?不要操作指针或者不要用C语言……如果做不到的话,就修炼编程能力吧

出0入0汤圆

发表于 2015-11-12 09:32:20 | 显示全部楼层
如果你的数组是局部变量你就把堆栈变大点,或者你把数组变成全局变量。

出0入0汤圆

发表于 2015-11-12 09:48:04 | 显示全部楼层
ts-fjw 发表于 2015-11-12 09:07
怎么看局部变量和全局变量的地址

MDK里面变量监视窗口里面添加变量名称,就会显示变量地址了。

出0入0汤圆

发表于 2015-11-12 10:49:48 | 显示全部楼层
lingdianhao 发表于 2015-11-12 09:48
MDK里面变量监视窗口里面添加变量名称,就会显示变量地址了。

哦 原来是这呀 一直只看数据了 从来没关心过地址  谢谢

出0入0汤圆

 楼主| 发表于 2015-11-12 11:42:15 来自手机 | 显示全部楼层
lusson 发表于 2015-11-11 21:58
STM32也不见得会进hardFault,我就遇到过把我全局变量改了但不进的。
他进的话应该也是要非法访问才会的。 ...

STM32也不一定进hardfault呀?我以前遇到数组越界就进了。
刚看了下stm32编译完后的.map文件,发现全局数组定义的地址,在数组需要的内存后还有一段内存是空着的,其他全局变量隔一段内存再定义的。在想stm32是不是通过检测这段空着的内存是否被访问来判断是否数组越界?

出0入0汤圆

 楼主| 发表于 2015-11-12 11:45:21 来自手机 | 显示全部楼层
wujiaodalou911 发表于 2015-11-12 09:32
如果你的数组是局部变量你就把堆栈变大点,或者你把数组变成全局变量。

我数组就是全局的,越界后就会改变其他全局变量呀。
看dsp的.map文件,可以发展数组和其他全局变量都是挨着的,一旦数组越界就会访问到其他变量呀

出0入0汤圆

 楼主| 发表于 2015-11-12 11:46:15 来自手机 | 显示全部楼层
chenchaoting 发表于 2015-11-11 21:55
同问这个HardFault 芯片设计时是怎么检测越界的


刚看了下stm32编译完后的.map文件,发现全局数组定义的地址,在数组需要的内存后还有一段内存是空着的,其他全局变量隔一段内存再定义的。在想stm32是不是通过检测这段空着的内存是否被访问来判断是否数组越界?

出0入0汤圆

 楼主| 发表于 2015-11-12 12:13:25 来自手机 | 显示全部楼层
Appcat 发表于 2015-11-11 21:47
FIFO环形队列,是治疗下标溢出的不二良药。

环形队列没用过,研究下

出0入0汤圆

 楼主| 发表于 2015-11-12 12:17:07 来自手机 | 显示全部楼层
dhbighead 发表于 2015-11-11 22:19
数组名不也是指针。。

存储方式不一样吧,数组定义完空间是固定了

出0入0汤圆

发表于 2015-11-12 15:40:04 | 显示全部楼层
本帖最后由 侵掠如火 于 2015-11-12 15:41 编辑

其实这就是C语言的美妙,所谓Stack Overflow.
这种问题主要靠功力来解决.
当然,UART缓冲区的话,环状缓冲区是常用选项.

出0入17汤圆

发表于 2015-11-12 18:18:57 | 显示全部楼层
在程序里面做判断和限制啊

出0入4汤圆

发表于 2015-11-12 20:13:42 | 显示全部楼层
C里面数组一定要检查越界,不然一定死翘

出0入0汤圆

发表于 2015-11-12 21:17:24 | 显示全部楼层
chenchaoting 发表于 2015-11-11 21:55
同问这个HardFault 芯片设计时是怎么检测越界的

进HardFault原因很多,越界只是其中一种,猜测可能是检测到没有定义到的内存区域,比如代码compile时只用到1k ram,但是指针指到1k之外,就可以判定HarkFault错误了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-28 18:34

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表