Infidel は、未マッピングの場所を表す特別な部屋 ENDLESS‑DESERT を使って広大な空の砂漠をシミュレートし、プレイヤーがそこでアイテムをドロップすると、ゲームはその座標とオブジェクト ID を DESERT‑TABLE という配列に格納し、プレイヤーが同じ場所に戻ってきたときに復元できるようにする。DESERT‑TO‑TABLE ルーチンはこのシャッフルを行い、終わりのない砂漠内のすべての持ち運び可能なオブジェクトをループして、各オブジェクトの ID とその SLOC 座標をテーブルに書き込む。(出典: primary)
バグは、ZIL コンパイラがルーチンのオプション引数 TBL を処理する方法にあり、これは DESERT‑TABLE のアドレスをデフォルトとするべきだが、代わりにコンパイラは定数値 30(グローバル変数 DESERT‑TABLE のインデックス番号)をルーチン開始時に TBL に格納する。その結果、DESERT‑TO‑TABLE がオブジェクトデータを書き込むとき、意図したアドレス 11129 ではなく 30 から始まるメモリアドレスに書き込み、低メモリを破壊するワイルドポインタが発生する。(出典: primary)
Z‑machine バージョン 3 のメモリの最初の 64 バイトはヘッダー データを保持しているため、アドレス 30‑63 は未使用だが、アドレス 64 からテキスト圧縮に使用される略語テーブルが始まる。 endless desert で 9 つ以上のオブジェクトをドロップすると、その略語テーブルの先頭が上書きされ、最初の略語(「the」)が書き込まれたバイトパターンに置き換えられ、ゲーム出力では「the」の代わりに「You」と観察されることがある。場合によっては、この破損が印刷ルーチンを無限ループに陥れ、インタプリタをクラッシュさせる。このバグは長年にわたって気づかれなかったのは、巴砂漠でプレイヤーが 8 つ以上のオブジェクトをドロップすることがほとんどなく、メモリ破損が発見されなかったためである。(出典: primary)
同様の欠陥は、同じ間違ったアドレスから読み込むペアリングされた TABLE‑TO‑DESERT ルーチンにも存在し、PROP‑TO‑TBL / TBL‑TO‑PROP ペアも PROP‑TBL テーブルに対して同じパターンを共有する。問題を修正するには、TBL のデフォルトを削除し、ルーチンの開始時に <SET TBL ,DESERT‑TABLE> を挿入するか、DESERT‑TABLE を第二引数として明示的に渡す必要がある。(出典: primary)
