Infidel 里的编译器 Bug 如何搞乱内存
Infidel Goes Wild
在深入分析 Infidel 时,我发现了一个极其隐蔽的编译器 Bug。这个 Bug 源于 ZIL 编译器在处理默认参数时的一个逻辑漏洞:它将全局变量 DESERT-TABLE 的索引值当作内存地址直接使用,导致程序在沙漠场景中丢弃物品时,错误地覆盖了 Z-machine 内存中用于存储缩写词表的关键区域。虽然这个错误在正常玩法中几乎不会被触发,但一旦在 ENDLESS-DESERT 中丢弃足够多的物品,游戏文本就会开始乱码,甚至导致解释器崩溃。这个 Bug 不仅存在于 1983 年的原版,在 1984 年的更新版中依然存在,甚至连 Infocom 的测试人员都未曾察觉。
作为 C 程序员,我依法必须将内存破坏视为所有可能罪孽中最严重的一种。