打印

未知的数组越界问题如何查

[复制链接]
5154|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
电信小菜|  楼主 | 2013-11-16 10:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
全局变量在程序运行过程中经常发生不可预测的变化,据说比较可能的原因是数组越界访问,但又不知道是在什么时候,那个数组、指针越界访问了,如何找出问题,据说能再调试过程中,设置当变量变化时暂停住,是叫“高级端点”吗,或者有没有其他解决方法

相关帖子

沙发
香水城主| | 2013-11-16 11:03 | 只看该作者
闲逛路过此处,发现此帖已结,知道问题解决。

使用特权

评论回复
板凳
huangxz| | 2013-11-16 11:15 | 只看该作者
这个在vc里面应该是可以检查的出来的。

使用特权

评论回复
地板
ayb_ice| | 2013-11-16 11:16 | 只看该作者
char array[10]

void test(char i)
{
    if(i < 10){
          array[i] = 0x12;
    }
}

使用特权

评论回复
5
电信小菜|  楼主 | 2013-11-16 11:26 | 只看该作者
香水城主 发表于 2013-11-16 11:03
闲逛路过此处,发现此帖已结,知道问题解决。

给0分的自动结贴啊

使用特权

评论回复
6
cool_coder| | 2013-11-16 16:39 | 只看该作者
我想可以这样:
#ifdef _DEBUG
  #define  SetArrayItem(array,len,idx,value) {if(idx>=len) while(1);array[idx]=value;}
#else
  #define  SetArrayItem(array,len,idx,value) array[idx]=value
#endif

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
电信小菜 + 2
7
sunhq02| | 2013-11-17 08:37 | 只看该作者
有几种方式:
1. 借助仿真器的调试功能发现
2. 类似6楼那样, 不直接使用各种功能,比如赋值, 而是给各种功能加一个壳,在debug版软件中借助壳注入代码调试功能
3. 给数组分配内存的时候, 多分配一点, 比如100大小的数组, 分配 102字节, 最前1字节和最后1字节写入一个固定的编码
   在空闲时\操作内存时\回收时\或者别的什么时候, 检查这个固定编码有没有被修改,  如果有的话, 数组越界了
   多分配的内存越多检查到越界的概率越大

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
电信小菜 + 2
8
chenbb8| | 2013-11-17 08:51 | 只看该作者
用那么复杂么。直接用断言不就行了。
但实际上都是不太实用,最重要的还是在实现功能的时候,顺手就将测试做了!
很是鄙视那些将代码码完后,直接丢给同事,说写完了的那些人

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
电信小菜 + 2
9
woshixinshou| | 2013-11-17 09:15 | 只看该作者
这个问题刚刚遇到过,全局变量无端的变化....原来是一个数组处理的下标超出了一倍....浪费不少时间。

使用特权

评论回复
10
香水城主| | 2013-11-17 10:58 | 只看该作者
顶6、7楼,:handshake

使用特权

评论回复
11
电信小菜|  楼主 | 2013-11-18 08:43 | 只看该作者
sunhq02 发表于 2013-11-17 08:37
有几种方式:
1. 借助仿真器的调试功能发现
2. 类似6楼那样, 不直接使用各种功能,比如赋值, 而是给各种功能 ...

嗯,2和3都很有意思,1呢,太泛了不知道是怎么调试的

使用特权

评论回复
12
电信小菜|  楼主 | 2013-11-18 09:17 | 只看该作者
chenbb8 发表于 2013-11-17 08:51
用那么复杂么。直接用断言不就行了。
但实际上都是不太实用,最重要的还是在实现功能的时候,顺手就将测试 ...

长姿势了

使用特权

评论回复
13
电信小菜|  楼主 | 2013-11-18 09:17 | 只看该作者
cool_coder 发表于 2013-11-16 16:39
我想可以这样:

赞一个

使用特权

评论回复
14
sunhq02| | 2013-11-18 09:39 | 只看该作者
chenbb8 发表于 2013-11-17 08:51
用那么复杂么。直接用断言不就行了。
但实际上都是不太实用,最重要的还是在实现功能的时候,顺手就将测试 ...

你说的没错
系统本身和测试系统应该是同步开发的
边做边测试
而不是等东西做完了才做测试
甚至压根不测试

使用特权

评论回复
15
电信小菜|  楼主 | 2013-11-18 11:37 | 只看该作者
sunhq02 发表于 2013-11-18 09:39
你说的没错
系统本身和测试系统应该是同步开发的
边做边测试

呵呵,都是很有经验的老手,新手做的过程中都不知道有这种情况更不用说要针对这种情况测试了

使用特权

评论回复
16
chenbb8| | 2013-11-19 10:10 | 只看该作者
LS的调试系统的调试都是全局的,包括assert宏
但很多时候,我们调试经常是需要针对某个部件,这时候就想要将别的调试内容屏蔽
如果能定义需要调试的模块和优先级就好了,最好是有这样的一个调试框架

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
电信小菜 + 2
17
原野之狼| | 2013-11-19 11:22 | 只看该作者
cool_coder 发表于 2013-11-16 16:39
我想可以这样:

这样的思路是可以的,但是写起来形式上不美观,每次都要指定数组长度。

何不把数组进行封装呢?使得其屏蔽指针操作,也就没有越界的问题了。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
电信小菜 + 2
18
原野之狼| | 2013-11-19 11:23 | 只看该作者
chenbb8 发表于 2013-11-19 10:10
LS的调试系统的调试都是全局的,包括assert宏
但很多时候,我们调试经常是需要针对某个部件,这时候就想要 ...

对于大型软件系统,对日志进行分级以及分块管理是不可或缺的。

使用特权

评论回复
19
电信小菜|  楼主 | 2013-11-19 13:01 | 只看该作者
原野之狼 发表于 2013-11-19 11:22
这样的思路是可以的,但是写起来形式上不美观,每次都要指定数组长度。

何不把数组进行封装呢?使得其屏 ...

能否举个栗子

使用特权

评论回复
20
cool_coder| | 2013-11-19 17:14 | 只看该作者
本帖最后由 cool_coder 于 2013-11-19 17:19 编辑
原野之狼 发表于 2013-11-19 11:22
这样的思路是可以的,但是写起来形式上不美观,每次都要指定数组长度。

何不把数组进行封装呢?使得其屏 ...

考虑到这里是“单片机”版,基本面向8位机,标准C开发,就这样写喽,见笑了。
我这样写的考虑主要有
1、能够在调试时定位错误
2、方便统一修改调试代码
3、不给最终发行版引入额外开销
如果有更好的方法,愿闻其详啊~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

53

主题

236

帖子

2

粉丝