我试图向某人解释分段错误,并且我正在考虑吃豆子中的256级杀伤屏幕,整数溢出是如何触发的,以及该行为与分段中经常描述的“未知状态”有多相似故障。
我想说的是这是我所谓的“未处理的段错误”的一个很好的例子,但是在我可能散布错误信息之前,我宁愿先获得第二意见。
我尝试查找它,但我得到的只是有关错误本身的文档,以及Hipster Whale和Namco之间的协作。
因此,您是否认为Pacman级别256中的行为是未处理的细分违规的示例?
我试图向某人解释分段错误,并且我正在考虑吃豆子中的256级杀伤屏幕,整数溢出是如何触发的,以及该行为与分段中经常描述的“未知状态”有多相似故障。
我想说的是这是我所谓的“未处理的段错误”的一个很好的例子,但是在我可能散布错误信息之前,我宁愿先获得第二意见。
我尝试查找它,但我得到的只是有关错误本身的文档,以及Hipster Whale和Namco之间的协作。
因此,您是否认为Pacman级别256中的行为是未处理的细分违规的示例?
Answers:
当然不。
访问未分配的内存地址始终是编程错误。根据从中获得的信息采取行动会产生不确定的行为,这是非常准确的。我不知道最初的吃豆人是为哪个平台编写的,但是我很确定它像其他任何冯·诺依曼机器一样表现出这种行为。
但是,“分段故障”是更特定条件的技术术语。当计算机自动检测到这种情况并终止进程而不是允许发生未定义的行为时,就会发生这种情况。这需要具有复杂所有权标记的特定(分段)内存模型。我认为1980年的街机游戏不具备这种功能,实际上游戏的行为表明未检测到错误,并且确实发生了未定义的行为。
您似乎在混淆“不确定的行为”和“细分错误”。
没有未处理的段错误。根据定义,分段错误是错误处理。
如果您没有操作系统检测到错误的内存访问并为安全起见终止了该过程,那么您就不会遇到分段错误。
如果有的话,这是UB 并非总是导致段错误的一个很好的例子。
这两个术语都不适合用汇编语言编程且无法在没有内存保护硬件或操作系统的情况下运行的街机游戏中的错误。
“未定义行为”是一个术语的最先进的C和相关语言,由C标准委员会早在1989年创造的代码已未定义行为时,语言规范没有定义什么都行。Z80汇编语言中没有这样的东西:每个操作码对每个可能的输入的影响都是明确定义的。可以理解为英语中“未定义行为”的常规含义适用-终止屏幕是写游戏的人未定义的行为-但我不会在这种情况下使用它,因为它很可能会给出错误的信息印象。
“分段故障”是POSIX中的一个术语,最终源自PDP系统编程术语。当程序尝试访问未“映射”到任何内容的内存地址时,就会发生分段错误:硬件和操作系统会以一种精心定义的方式检测到此错误并关闭有故障的程序,从而使程序有机会恢复。什么样这可能是由于吃豆人游戏程序中的错误导致的,因为吃豆人电路板仅使用ROM,RAM和外围设备填充了Z80 64kB地址空间的一半以下,但我还没有这样做。如果软件试图访问未映射的内存,我们将无法找到真正的硬件会做什么。但是,无论做什么,将其描述为“分段错误”都是不合适的,因为Pac-Man的“操作系统”(甚至有一个操作系统)不是 Unix的实现,并且它也是会给人留下错误的印象。
同时,级别256的错误不会访问未映射的内存,因此很无聊。
准确地说,游戏中存在一个错误,该错误会在升至256级时出现。准确地说,该错误的根本原因是整数溢出,其后果是内存损坏(或等效地,违规)。的存储器和类型安全)。这些都是通用CS术语,定义时未参考任何特定语言或OS环境。
这也是准确的观察到效果的bug是类似的效果,一个现代化的环境中,内存腐败的bug 不惹段故障。如果您阅读了Project零漏洞利用报告中的任何内容,您将发现与Don Hodges 对《吃豆人》杀戮屏幕的分析极为相似。
请注意,模拟器在喂饱吃豆人ROM时不能如实地再现终止屏幕,这不能正确地模拟游戏硬件。
Pac Man中的256级错误导致程序读取的数据超出了预期表的末尾,但仍是可读的存储,并且写入了屏幕上超出程序意图写入但超出预期范围的部分仍然在允许程序编写的屏幕区域内。不会影响其他内存区域。
该错误使游戏无法进行游戏的原因是,该机器通过检查屏幕上的内容来确定玩家何时在吃点,并在玩家吃掉244点后判定等级是否完整。通过覆盖部分屏幕,该错误使玩家无法吃掉244点;因此,游戏将永远不会为完成关卡而使玩家信服,也不会用点重新载入屏幕。
如前所述,这不是段错误。我将添加问题发生的原因:这是一个溢出。
级别号存储在一个字节上,因此范围是0-255。每次完成一个级别,计数器都会递增。在256级,由于溢出,计数器实际上为0。
但是,游戏尝试在关卡底部显示一些水果。水果数量/类型取决于水平。该公式在级别8下每个完成的级别显示一个水果。根据计数器,您在级别0上因此在级别8之下。那么测试为true,则必须打印255个水果(旧级别值)。这是不可能的,并且会出现此故障屏幕。