作者bobo0120 ()
站内RO
标题[BUG] 数值的overflow/underflow
时间Mon Jan 18 19:07:46 2010
这个BUG主要是基於二补数系统中,数值发生overflow/underflow时
而程式撰写者并没有做妥善的检查,所引发的数值BUG
下图是以简单的数值range : -32768~32767 为解释
应用面令人争议,所以我简单介绍一下就好
--------------------------------------------
首先,我们先拿出一个简单的模型,如下图
(+) (-)
32767 <-> -32768
↖\ ↗/
\↘ /↙
0
我稍微解释一下,基本上这个图是一个循环
当32767+1时,其数值不是32768而是-32768
当-32768-1时,其数值不是-32769而是32767
而0为-32768与32767之中心点
在这边我们只关心overflow/underflow,也就是32767+1与-32768-1
0这数值,实际上是一点意义都没有的,尽管是晕眩率0%、失败率0%...等
-------------------------------------------
讲一个比较简单的例子,假设普攻伤害最高只到32767
如果今天某玩家打到伤害高达65535,那怪物实际受到的伤害将会是下列算式
65535 / ( 32767 + 32768 ) = 1....0
怪物受到的伤害将会是0
如果今天某玩家打到伤害高达90000,那怪物实际受到的伤害将会是下列算式
90000 / ( 32767 + 32768 ) = 1....24465
怪物受到的伤害将会是24465
如果今天某玩家打到伤害高达10000,那怪物实际受到的伤害将会是下列算式
100000 / ( 32767 + 32768 ) = 1....34465
- ( 34465 - 32767 ) = -1698
怪物受到的伤害将会是-1698,所以我们预期会看到0或是MISS
--------------------------------------------
结论就是,如果只要我们找到感兴趣的数值range,我们可以经由overflow/underflow
来达到一些实际上不可能达到的效果
如百万HP、百万SP、抗状态100%、制作率100%、经验值DOUBLE....等
这个BUG原理就简单的介绍到这边,应用面的细节就不明说了
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.32.191.166
※ 编辑: bobo0120 来自: 114.32.191.166 (01/18 19:09)
1F:→ r10896:连这个都讲... 01/18 19:10
2F:→ r10896:事实上玩家跟怪物攻击伤害不在此种限制。 01/18 19:14
3F:推 annie6119:比较明显的例子应该是血量超过32767,组队视窗内看到的 01/18 19:14
4F:→ annie6119:血量会是负数,血条也变全黑,但实际上血还是满的XD 01/18 19:15
5F:→ r10896:应用建议保留 别给有心人用~0~ 01/18 19:15
6F:推 healangel:经验值DOUBLE.......0__0 01/18 19:29
7F:推 johnlei:超过数值记录储存格的range就有满泄的状况 16BIT游戏很多 01/18 20:17
8F:推 sakuratuka:这有甚麽不能讲?程式设计或有修改游戏的应该都知道吧XD 01/19 19:49
9F:→ r10896:是说应用面 不是说原理 01/19 21:11
10F:→ r10896:没人希望在gvg看到四五个hp破80万的刺客满街跑吧 01/19 21:12
11F:→ johnlei:楼上是说应用还是打比方 XDDDDDD 01/19 21:19
12F:→ r10896:百万hp在内文就有提到了 怎麽弄出来才是问题 01/19 21:24
13F:推 superjohnny:告诉我吧= =+ 我也想变HP八十万... 01/20 03:38
14F:推 ocaen2000:想知道百万HP+1 XD 01/20 07:25
15F:推 t5368836:感谢大大们倾囊相授= = 01/20 12:47
16F:推 jujubaby174:百万血舍命 百万魔阿修@@" 01/21 09:26
17F:推 Ymiao:其实我觉得应用面都教一教 一起倒一倒算了(误) 01/26 18:10
[部份违规或广告推文已被系统自动删除]