Infidelで発見された重大なメモリ破損バグ
Andrew Plotkinがインフォコムのゲーム「Infidel」の分析中に、メモリ領域を不正に上書きするワイルドポインタバグを発見した。1983年の初版と1984年のMacintosh版の両方に存在し、プレイヤーやテスターには気付かれなかった。
バグの詳細
Andrew Plotkinはメモリレベルのデバッガを使用してInfiedelを分析していた際、DESERT-TO-TABLEルーチンに重大なバグを発見した。このルーチンのTBL引数が、正しいグローバル変数DESERT-TABLE(アドレス11129)ではなく、定数値30で初期化されていた。その結果、ルーチンはDESERT-TABLE配列ではなくアドレス30以上のメモリを上書きする。
このバグは、グローバル変数が16から255の範囲で番号付けされていることに起因する。DESERT-TABLEは15番目のグローバルであり、したがって番号30である。だがルーチンはこの値を定数として扱うため、意図した配列ではなく固定メモリ領域を破損させるのだ。
影響範囲
DESERT-TABLE配列は100個の値(200バイト)で構成され、最大50個のオブジェクト(エントリあたり2つの値)を保持できる。プレイヤーが無限砂漠に9個のオブジェクトをドロップすると、最後のオブジェクトがアドレス64から始まる略語テーブルの先頭を上書きしてしまう。この破損によりテキスト表示が異常になり、インタプリタがクラッシュする可能性がある。
ただし、無限砂漠でオブジェクトをドロップすると1/3の確率で砂に埋もれて消失する。プレイヤーがこの機能をテストするインセンティブに乏しいため、バグは発見されず出荷された。Infidelのゲーム内テキストは「地面が硬すぎます(The ground is too hard here)」と表示され、プレイヤーが掘る理由はない。
複数バージョンでの存在確認
バグはInfidelのリリース22シリアル840522(Macintosh版)および初版シリアル830916で確認された。わずかなメモリアドレスの違いがあるものの、両バージョンとも同じ構造的な欠陥を抱えていた。1984年のMacintosh版リリースでも、このバグに対する対処は何も施されなかった。
筆者の見立て
- 【解釈】バグは通常のゲームプレイでは検出が難しいと論じている。
- 【解釈】無限砂漠には何もないため、誰も8個以上のオブジェクトをドロップしようとしなかったと解釈している。
- 【解釈】無限砂漠エリアは十分な厳密さでプレイテストされなかった可能性を示唆している。
- 【解釈】同様の設計のPROP-TO-TBLおよびTBL-TO-PROPルーチンは、開発中に削除された先行機能の遺物である可能性があると論じている。
- 【予測】先行機能がシリアル番号の破損を原因に削除された可能性があると予想している。
- 【含意】DESERT-TABLEが3番目のグローバル変数だった場合、バグはゲームのシリアル番号を破損させていたはずだと解釈している。
- 【予測】執筆者がInfiedelを更新するなら、無限砂漠で無駄な穴を掘る機能を復活させると予想している。
この記事は元記事の事実のみに基づいて自動生成されました。
出典
Zarf Updates「Infidel goes wild」 https://blog.zarfhome.com/2026/10/infidel-goes-wild (The Infocom Cabinetの報道による)