打印
[STM32]

指针使用不当,会造成很奇怪的问题,大家注意

[复制链接]
楼主: haohaodee
手机看帖
扫描二维码
随时随地手机跟帖
61
haohaodee|  楼主 | 2018-3-24 08:57 | 只看该作者 回帖奖励 |倒序浏览
linqing171 发表于 2018-3-22 23:33
看反汇编没有问题。
DCW 0x0000   是填充,没有用处,代码对齐用的。
DCW 0x01B0

搞定了,有个指针指向了被释放的栈。激动啊。

感谢各位仁兄提供的建议,很多都很有启发性,对我这个新手都很有帮助。

使用特权

评论回复
62
linqing171| | 2018-3-24 21:51 | 只看该作者
haohaodee 发表于 2018-3-24 08:57
搞定了,有个指针指向了被释放的栈。激动啊。

感谢各位仁兄提供的建议,很多都很有启发性,对我这个新手 ...

解决了就好。
野指针问题是c++中常见的问题,c语言里面代码写大了也会有遇到。
上面看你描述的现象,也感觉像是此类问题。这类问题老司机都有自己的解决办法。
看你这么诚恳,传你一点经验。
1 移植个FastMM等c运行库,加入到工程里,自动代替keil自带的malloc、free、大数乘除等函数。涉及malloc等野指针、数组越界、堆栈溢出什么的问题,直接报告出来。
2 只要是特种的项目,我都禁用动态内存。功能实现的越简单越好。
3 不涉及硬件寄存器的功能,在自己构造的环境里单元测试。特别这些年定制的这几个SOC的调试功能都比较弱的情况下,要保证代码质量,必须自己搞。

使用特权

评论回复
63
haohaodee|  楼主 | 2018-3-25 00:30 | 只看该作者
本帖最后由 haohaodee 于 2018-3-25 00:32 编辑
linqing171 发表于 2018-3-24 21:51
解决了就好。
野指针问题是c++中常见的问题,c语言里面代码写大了也会有遇到。
上面看你描述的现象,也感 ...

受教了。
关于单元测试,在指针用错,比如指向了局部变量,单元测试不一定能测出来,现在好想把整个工程的内存使用过程清晰地过一遍,确保不存在类似的问题了。

使用特权

评论回复
64
linqing171| | 2018-3-25 10:11 | 只看该作者
haohaodee 发表于 2018-3-25 00:30
受教了。
关于单元测试,在指针用错,比如指向了局部变量,单元测试不一定能测出来,现在好想把整个工程的 ...

函数的局部变量在栈上,出了作用域就不能用了。
如果指针引用的话,FastMM有时候也查不出来,a调用b和c,b中的变量在a里面能查出来无效,在c里面就难以查了。
不过这个时候用pc-lint是可以查出来的。
一般来说我的代码除了我认为某强悍的检查方案,和自己做的一些功能很弱的辅助工具之外,pc-lint必须检查的过,像offsetof等手工确定没有问题的外,不能有看不懂的。不过它毕竟是warning,不是error,度还是要自己把握,过犹不及。

使用特权

评论回复
65
haohaodee|  楼主 | 2018-3-25 10:28 | 只看该作者
linqing171 发表于 2018-3-25 10:11
函数的局部变量在栈上,出了作用域就不能用了。
如果指针引用的话,FastMM有时候也查不出来,a调用b和c, ...

我先用一下PC-LINK,有问题再向您请教。

使用特权

评论回复
66
苏山人家| | 2018-3-25 22:14 | 只看该作者
haohaodee 发表于 2018-3-22 22:21
生成的image,有if,所在的函数size大了64个字节,他之后的函数,地址向后顺延了64个字节,飞机就不稳了。
...

函数长度增加一点就不行,这个和代码大小有关系吗,是后续什么地方引用了绝对地址的代码吧,可以在函数里面增加一些无关代码,试一试。

使用特权

评论回复
67
haohaodee|  楼主 | 2018-3-26 23:07 | 只看该作者
linqing171 发表于 2018-3-25 10:11
函数的局部变量在栈上,出了作用域就不能用了。
如果指针引用的话,FastMM有时候也查不出来,a调用b和c, ...

我现在在想,如果开发稍微大型的工程,并且安全性要求高的,如果存在潜在的问题,怎么排查?如果我的代码还有问题,但过了PC-LINT,还有什么方法,最大程度减小可能存在的指针误用等这类不易排查的问题。

使用特权

评论回复
68
haohaodee|  楼主 | 2018-3-26 23:18 | 只看该作者
本帖最后由 haohaodee 于 2018-3-26 23:28 编辑
苏山人家 发表于 2018-3-25 22:14
函数长度增加一点就不行,这个和代码大小有关系吗,是后续什么地方引用了绝对地址的代码吧,可以在函数里 ...

你说的也有道理,但感觉更可能是内存使用方面的问题。”是后续什么地方引用了绝对地址的代码吧“是指什么情况呢?
现在程序的代码量远没有达到flash的容量。

使用特权

评论回复
69
haohaodee|  楼主 | 2018-3-26 23:20 | 只看该作者
看了好久没看明白fastmm怎么用的,怎么给keil配合使用。
理想的内存检测工具,可以对每个文件中涉及到的内存使用生成较为完整的报告。不知道有没有这样的工具和手段

使用特权

评论回复
70
haohaodee|  楼主 | 2018-3-26 23:53 | 只看该作者
苏山人家 发表于 2018-3-25 22:14
函数长度增加一点就不行,这个和代码大小有关系吗,是后续什么地方引用了绝对地址的代码吧,可以在函数里 ...

不得不说,上次没有解决彻底,现在程序中还存在这样的问题,在主程序前加一段无关代码,飞机飞的稳,如果注释掉,飞机又飞的不稳了。是跟代码大小有关系。

使用特权

评论回复
71
haohaodee|  楼主 | 2018-3-27 00:42 | 只看该作者
ayb_ice 发表于 2018-3-20 08:34
这么简单的语句,不可能是KEIL BUG
极有可能是其它地方的问题,只是这种情况下容易触发故障罢了,因为执行 ...

如果是“这样的语句导致其他代码的位置发生了变化”,那本质是什么错误,是flash的问题,还是内存的问题

使用特权

评论回复
72
ayb_ice| | 2018-3-27 08:49 | 只看该作者
haohaodee 发表于 2018-3-27 00:42
如果是“这样的语句导致其他代码的位置发生了变化”,那本质是什么错误,是flash的问题,还是内存的问题 ...

有时无用的代码正好不产生明显错误,有时产生明显错误,这与变量的值变化是类似的

总之,通常看到的只是现象,不是根源,但人们总是容易被现象迷惑,

这点经验很重要,

使用特权

评论回复
73
haohaodee|  楼主 | 2018-3-27 09:28 | 只看该作者
ayb_ice 发表于 2018-3-27 08:49
有时无用的代码正好不产生明显错误,有时产生明显错误,这与变量的值变化是类似的

总之,通常看到的只是 ...

是啊,我们看到的只是现象。
但是我们根据这个现象,有没有手段来找出原因。目前最重要的就是找到原因。

使用特权

评论回复
评论
haohaodee 2018-3-30 11:15 回复TA
@苏山人家 :增加栈,和堆,和全局变量不超过ram就行了啊,现在没有超过ram啊 
苏山人家 2018-3-30 09:35 回复TA
@haohaodee :新的代码如果增加了局部变量就会增加栈 
haohaodee 2018-3-29 21:41 回复TA
@苏山人家 :代码大小在flash上啊,栈在ram上,怎么影响的啊;你说的可能有道理啊,我以前的局部变量都有初值,最近感觉太蹩脚了,就把一些初值s... 
苏山人家 2018-3-29 09:14 回复TA
是不是代码大小影响了栈,然后你后面使用的时候又没有初始化,建议局部变量赋初值 
74
haohaodee|  楼主 | 2018-3-28 17:49 | 只看该作者
雪山飞狐D 发表于 2018-3-22 12:47
有浮点数的地方你不开编译优化试试,浮点数有可能会出现极大数和极小数细分精度不够和舍弃的问题,或者或者 ...

如果是这里的问题,与多加一行多减一行无关代码有什么关系

使用特权

评论回复
75
zqx1000| | 2018-4-10 08:47 | 只看该作者
贴 if(control_get_mode() == MODE_LAND)  这句代码对应的反汇编。

使用特权

评论回复
76
sum123456| | 2018-4-11 13:46 | 只看该作者

不用看了,肯定是哪里指针或者数组越界

使用特权

评论回复
77
beijingkp| | 2018-5-5 17:08 | 只看该作者
都是大神啊,我刚接触,进来学习一下

sangwu.afzhi.com | chengdukfp.wordpress.com | zhongshan360.baolifeng.com | tnn26.baolifeng.com
tianjin99.baolifeng.com | tnn26.baolifeng.com | laodao.afzhi.com

使用特权

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

本版积分规则