简单易懂的无尽黄昏bug解释

修改于2021/04/231193 浏览综合
为了更好的吃瓜!(最后付视频)
程序解释:
首先解释一下栈:
栈可以用汉诺塔来理解
你把一个圆乎乎的饼A叠在另外一个饼B上
这个时候,如果你想把饼B拿走,那你必须先拿走饼A
同时,如果你要把饼C放在饼B下面,那你需要拿走饼A和饼B,把饼C放进去,然后再放回饼B和饼A
TapTap
栈就是这样,只是把汉诺塔圆乎乎的饼换成一个数字或者一段代码罢了
然后我们来解释一下这次bug的原理:
首先,我们现在有三个buff,分别是abc
然后,设定是a会把b给限制掉(a在场的时候b没有buff效果)
在使用buff时,系统调用buff,并给他一个场上的名字
现在,我们先打出了buff a,系统给buff a贴了个A的标签
我们有打出了buff b,系统给buff b贴了个B的标签
这时,buff b把buff a限制掉了,A被清去了一个标签回收栈
然后,我们打出了buff c。按照一般正常的设想,那应该给他的标签不能是A或者B
但是程序员为了使运行内存可以少一点,所以他们并不是给他一个新的名字,而是把标签回收栈里的A给了buff c
因为buff a是暂时失效,当buff b结束时,它又有效了
但是,它在场上的标签没有重新分配,依旧是A
bug所在
A清去垃圾栈只是说A这个标签的没有buff在用,可以拿去给别的buff使用,但是并没用把buff a上贴着的标签A撕掉,所以buff a还是顶着A这一个标签
这时候,场上的buff a和buff c都有A这个标签(乱掉了)
这时,buff a撤退了,系统就认为A这个标签下的buff失效了
所以这个时候,buff c也跟着buff a一起失效,因为他们都顶着A这个标签
那无限黄昏?
现在我们把42身上的三个buff:锁血,法穿,触发自动撤退分别设为的buff abc
然后,巫毒娃娃有buff d
山有buff ef
小刻有buff g
现在,我们把先触发buff g(系统给他了一个A的标签),然后再触发buff d把他清掉
然后触发buff ef(分别给了BC的标签),然后结束技能使标签被清掉
然后42上场,buff abc分别得到了CBA三个标签(因为是栈,所以是最先的buff得最后进栈的标签,如果不懂自行回到解释栈的部分)
这个时候,buff c和小刻的buff g都顶着A这个标签
然后小刻被撤掉,标签A下面的buff失效,buff c被小刻的buff g一起清没了
然后就得到了一只不会自动撤退的42~
注:buff可能是多个子程序构成的,所以一个标签可以贴在好多个子程序上面是被允许的
PS:那肯定有人要问了,只要有一个A被清掉就可以搞这个不过啦,那为什么要搞的这么麻烦?
这个说明一下,如果只有一个A被回收了,那得到A的是buff a(锁血buff),而不是buff c(触发自动撤退buff)
此时,另外两个buff并没得到被清除过的标签,所以没法卡这个bug
简单来说,就是小刻的独行长路和42的自动撤退被程序(误)认为是同一个buff(两个buff被捆绑在一起了)
当一个buff失效时另一个buff也被捆绑下线了
(视频更简单易懂,没有代码知识,但是建议看完下文看不懂后再看视频)(但是逻辑不是很完整)
33
15
39