奇怪的bug,assert(0 == 0) failed

若谷 发布于 2013/08/08 22:56
阅读 312
收藏 0

简化代码如下: g_global_i是存在于一个共享内存中的全局变量


#define INVALID 0

uint8_t g_global_i = 0;

assert(g_global_i == INVALID);


    assert后从生成的core文件中看到g_global_i这个值为0,间接相等于assert(0 == 0)失败,难道(0 == =) != 1?

    另外猜测可能core文件里打印的值不准,把共享内存的内容导出到文件,查看到该变量的值确实为0. 

    求论坛里的大神给点定位思路,此bug半个月以前出现过一次,但当时没保留core文件和内存环境,没法定位。ps:此处assert流程,属常规代码路径。之前出现过一次后,尝试复现了很多次,都没有出现,此次好不容易复现一次,却又毫无头绪。求各位大神拯救下小弟,给点思路,此单挂头上半个月了,实在不爽。






加载中
0
若谷
若谷
@中山野鬼 @宏哥 , 麻烦两位前辈指导指导
0
中山野鬼
中山野鬼
这个有什么奇怪的啊。assert(exp); exp == 0时,才出问题。你0==0 这个exp自然恒为1了。
若谷
若谷
exp恒为1 ,assert(1)不会出错啊,只有assert(0),程序才会abort啊
0
中山野鬼
中山野鬼
assert(false);则报错,所以我现在自己写的debug工具都是_bug(true);报错。否则脑袋转不过来。
中山野鬼
中山野鬼
回复 @若谷 : 立刻去最近的酒吧,喝最便宜的酒,找最穷的美女聊天,就是穷的做裙子的布不够长,只能包屁股的那种。
若谷
若谷
回复 @中山野鬼 : 好吧,只是感觉现在缺乏思路,不知道该咋办了
中山野鬼
中山野鬼
回复 @若谷 : 绝大多数情况下,不要相信电脑在玩你,曾经在未量产的soc上做开发,确实发生过玩我的情况。所以搞不出来,去打打机放松下再搞,打飞机也行。哈。反正别想问题就是了。
若谷
若谷
回复 @中山野鬼 : 原谅我的低级失误吧,core里面看到那个变量是0.不是1,之前写错了
中山野鬼
中山野鬼
回复 @若谷 : (0==0)这个返回是1。。。。不是0。哈。
下一页
0
狮子的魂
狮子的魂

宏定义默认类型为int, uint8_t为无符号8位整数,这个两者的比较中间有个转换的问题。

确认下程序的运行过程中是否发生了符号的变更,如果有的话,不相等是很正常的。

再者,想想除了这个问题,也貌似没别的问题会导致这个现象了。

若谷
若谷
符号的变更具体指的是啥?
0
周翼翼
周翼翼

assert后从生成的core文件中看到g_global_i这个值为1

说明core当时共享内存里的值确实为1,你应该考虑谁能写这个共享内存?他写了什么?

若谷
若谷
不好意思,写错了,core里面是0,
0
Polle
Polle
Java有#define这种语句么?
0
中山野鬼
中山野鬼

引用来自“刘子玄”的答案

Java有#define这种语句么?
java没有,c有。哈。
0
中山野鬼
中山野鬼

引用来自“狮子的魂”的答案

宏定义默认类型为int, uint8_t为无符号8位整数,这个两者的比较中间有个转换的问题。

确认下程序的运行过程中是否发生了符号的变更,如果有的话,不相等是很正常的。

再者,想想除了这个问题,也貌似没别的问题会导致这个现象了。

这种不带位宽截取的比较,对0,1判断没有影响的。。。判断本身就是个test指令,其实就是个sub指令,他们的电路应该是一样的。除非设计的人脑袋通了。如果我没记错的话。哈。同位宽的计算,对加减,有符号无符号没有任何区别,从当前指令(右移、乘法除外),无非后面的逻辑怎么判断状态标记位而已。
0
JerryLin
JerryLin

1.。assert 有没有被用户自定义函数覆盖

2。assert(g_global_i == INVALID); 这句话前后加锁,然后再测

3。在assert之前,加锁代码之后打印g_global_i值


返回顶部
顶部