C复合条件未按预期工作(值神秘地重新分配给其他值)-可能存在gcc错误

C复合条件未按预期工作(值神秘地重新分配给其他值)-可能存在gcc错误,c,conditional,C,Conditional,我有一个程序由于gcc中可能存在的错误而陷入循环。我已经在编译器的多个版本上测试过了,它似乎仍然存在。这个bug的模型版本是 #include <stdio.h> #include <stdlib.h> #define db printf("t=%d\n", t) size_t t = 9; int main(int argc, char** args) { l: //label so we can repeat t-(t^14) //works a

我有一个程序由于gcc中可能存在的错误而陷入循环。我已经在编译器的多个版本上测试过了,它似乎仍然存在。这个bug的模型版本是

#include <stdio.h>
#include <stdlib.h>

#define db printf("t=%d\n", t)

size_t t = 9;

int main(int argc, char** args) {
    l: //label so we can repeat
    t-(t^14) //works as expected if this line is changed to t-7, but t xor 14 = 7... this line is also executed ONCE
    ==2?db,t=1: //end of first conditional, next line starts the second
    t==1?db,t=41: //buggy ONLY if t=40 or 41 on this and next line
    t==41?db,t=0: //bug in this line (after this line executes, t = 1 no matter what)
    t==0?exit(0): //terminates if not buggy
    0;
    goto l; //repeat
}
#包括
#包括
#定义db printf(“t=%d\n”,t)
尺寸t=9;
int main(int argc,char**args){
l://标签,以便我们重复
t-(t^14)//如果此行更改为t-7,则按预期工作,但t xor 14=7…此行也执行一次
==2?db,t=1://第一个条件结束,下一行开始第二个条件结束
t==1?db,t=41://仅当t=40或41在这一行和下一行
t==41?db,t=0://这一行中的bug(在这一行执行之后,不管发生什么情况,t=1)
t==0?退出(0)://如果没有错误则终止
0;
转到l;//重复
}
请不要问我为什么使用这个,因为它是为了一个模糊代码竞赛,我使用的是这个特殊的方法

我也想知道这是否是一种意想不到的行为,但我怀疑是的


谢谢

打印的
t
的值在1和41之间交替,因此当您的程序被分解时,很明显为什么
exit(0)
从未执行

在第一次迭代中,
t==9
t-(t^14)==2
因此
t
变为1

在第二次迭代中
t==1
t-(t^14)=2因此
t
变为41

在第三次迭代中,
t==41
t-(t^14)==2
因此
t
变为1

现在重复第二次迭代

#include <stdio.h>
#include <stdlib.h>

size_t t = 9;

int main(int argc, char** args) {
    l: //label so we can repeat

    if (t-(t^14) == 2) {
        printf("t=%d\n", t);
        t=1;
    }
    else if (t==1) {
        printf("t=%d\n", t);
        t=41;
    }
    else if (t==41) {
        printf("t=%d\n", t);
        t=0;
    }
    else if (t==0)
        exit(0);
    else
        0;

    goto l;
}
#包括
#包括
尺寸t=9;
int main(int argc,char**args){
l://标签,以便我们重复
如果(t-(t^14)=2){
printf(“t=%d\n”,t);
t=1;
}
else如果(t==1){
printf(“t=%d\n”,t);
t=41;
}
else如果(t==41){
printf(“t=%d\n”,t);
t=0;
}
else如果(t==0)
出口(0);
其他的
0;
后藤岛;
}

我用缩进和注释重新编写了您的表达式,以便跟踪

t-(t^14)==2?  
     /*True */ db,t=1
     /*else */ :
     /*False*/ t==1? 
               /*True */ db,t=41
               /*else */ :
               /*False*/ t==41?
                         /*True */ db,t=0
                         /*else */ :
                         /*False*/ t==0?
                                   /*True */ exit(0)
                                   /*else */ :
                                   /*False*/ 0;
现在跟踪到:

通过#1
通过#2
通过#3 因为t现在回到值1,我们回到了与Pass#2相同的场景。 循环在通过#2通过#3之间不断切换。(t=1和t=41)

无限循环是正确的结果。


(在你真的相信自己发现了一个编译器错误之前,你需要聪明一百万倍。)

请不要这样做,看在上帝的份上,不要。。。不要。。。只需编写可读的代码。这个项目的目的是什么?这没用,不要学这些东西,它们没用,相信我?使用标签的循环是在古代编程语言中使用的。@iharob这是用于模糊代码竞赛的。不要参加这些竞赛,它们是为了什么?花时间学习有用的东西。爱因斯坦说,任何聪明的傻瓜都能使事情变得更大、更复杂、更暴力。相反的方向需要一点天才和很大的勇气。所以“编译器的多个版本”都有相同的bug?也许你可以让它更具可读性,但仍然保留bug?你确定你完全理解程序的逻辑吗?正如我在第二次迭代中看到的,将对
t=1
执行操作
t-(t^14)
,这将产生负面结果。但是
t
的类型是
size\u t
,基本上是无符号的,因此我无法进一步跟踪它。这就是你的意思吗?显然41-(41^14)和40-(40^14)都等于2,这就是真正的问题你把一堆模糊的垃圾扔给我们,然后你说数学是“真正的问题”???哈。@101timjim 9-9^14是2,所以在第二次迭代中你得到t=1,所以第一个条件为假,第二个条件为真,所以twill变为41。在第三次迭代中,41-(41^14)是2,所以t再次变为1,所以我们在相同的序列上重复。这才是真正的问题。
t = 9
t^14 = 7
t-7 == 9 - 7 == 2, therefore Condition 1 is True.
 printf 9, t = 1, goto top.
t=1
t^14 = 15
t-15 = -14 != 2, therefore condition 1 is False.
Condition 2: t==1? TRUE,
  printf 1, t = 41, goto top.
t = 41
t^14 = 39
41-39 = 2, therefore Condition 1 is true.
Printf 41, t = 1, goto top.