Infidel simula un vasto desierto vacío con una habitación especial llamada ENDLESS‑DESERT que representa cada ubicación no mapeada; cuando el jugador deja objetos allí, el juego guarda sus coordenadas y IDs de objeto en un array llamado DESERT‑TABLE para poder restaurarlos si el jugador regresa al mismo lugar. La rutina DESERT‑TO‑TABLE realiza este intercambio, recorriendo todos los objetos portátiles en el desierto sin fin y escribiendo el ID de cada objeto y su coordenada SLOC en la tabla. (Fuente: primaria).
El error reside en cómo el compilador ZIL maneja el argumento opcional TBL de la rutina, que debería predeterminarse a la dirección de DESERT‑TABLE. En lugar de eso, el compilador almacena el valor constante 30—el número de índice de la variable global DESERT‑TABLE—en TBL al iniciar la rutina. Como resultado, cuando DESERT‑TO‑TABLE escribe datos de objetos, escribe en direcciones de memoria que comienzan en 30 en lugar de la dirección prevista 11129, creando un puntero salvaje que corrompe la memoria baja. (Fuente: primaria).
Puesto que los primeros 64 bytes de la memoria de la versión 3 de la Z‑machine contienen datos de cabecera, las direcciones 30‑63 no se utilizan, pero la dirección 64 inicia la tabla de abreviaturas utilizada para la compresión de texto. Dejar caer nueve o más objetos en el desierto sin fin sobrescribe el inicio de esa tabla, lo que hace que la primera abreviatura («the») sea reemplazada por el patrón de bytes que se escriba—observado como la palabra «You» apareciendo en lugar de «the» en la salida del juego. En algunos casos, la corrupción lleva a la rutina de impresión a un bucle infinito, bloqueando el intérprete. El error pasó desapercibido porque pocos jugadores dejaban caer más de ocho objetos en el estéril desierto sin fin, dejando la corrupción de memoria sin descubrir durante años. (Fuente: primaria).
Existe un defecto similar en la rutina emparejada TABLE‑TO‑DESERT, que lee desde la misma dirección errónea, y el par PROP‑TO‑TBL / TBL‑TO‑PROP comparte el mismo patrón con la tabla PROP‑TBL. Solucionar el problema requiere eliminar el valor predeterminado de TBL e insertar <SET TBL ,DESERT‑TABLE> al inicio de la rutina o pasar DESERT‑TABLE explícitamente como segundo argumento. (Fuente: primaria).
