Η ανακάλυψη ενός «αόρατου» σφάλματος
Κατά την ανάλυση του κώδικα του Infidel (release 22), εντοπίστηκε ένα εξαιρετικά ενδιαφέρον bug στη διαχείριση των αντικειμένων στο «Endless Desert». Αν και το παιχνίδι λειτουργεί ομαλά για τον μέσο παίκτη, η χρήση ενός memory-level debugger αποκάλυψε ότι η ρουτίνα DESERT-TO-TABLE προκαλούσε αλλοίωση μνήμης (memory corruption) κάθε φορά που αποθηκεύονταν αντικείμενα.
Το αρχιτεκτονικό σφάλμα του ZIL compiler
Το πρόβλημα εντοπίζεται στον τρόπο με τον οποίο ο compiler της ZIL διαχειρίζεται τις προεπιλεγμένες παραμέτρους (default arguments) στις ρουτίνες. Αντί να αναγνωρίσει τη μεταβλητή DESERT-TABLE ως τη διεύθυνση μνήμης όπου έπρεπε να αποθηκευτούν τα δεδομένα, ο compiler την ερμήνευσε ως τον δείκτη (index) της global μεταβλητής. Ως αποτέλεσμα, η ρουτίνα έγραφε δεδομένα ξεκινώντας από τη διεύθυνση 30, αντί για τη σωστή θέση στη μνήμη.
Επιπτώσεις στη μνήμη και το runtime
Το σφάλμα αυτό «σκουπίζει» (stomps) τμήματα της μνήμης που προορίζονται για τον πίνακα συντομογραφιών (abbreviations table) του Z-machine. Σε ακραίες περιπτώσεις, η αλλοίωση αυτή οδηγεί σε αλλοιωμένο κείμενο κατά την εκτύπωση ή ακόμη και σε infinite loops στον interpreter, καθώς η ρουτίνα εκτύπωσης προσπαθεί να διαβάσει άκυρα δεδομένα συμπίεσης.
Συμπεράσματα για τη διατήρηση λογισμικού
Το γεγονός ότι το bug αυτό παρέμεινε ενεργό για δεκαετίες χωρίς να επηρεάσει την εμπειρία των παικτών καταδεικνύει την ανθεκτικότητα του κώδικα της Infocom, αλλά και την ανάγκη για αυστηρότερο έλεγχο σε επίπεδο compiler. Η διόρθωση είναι απλή: η ρητή ανάθεση της τιμής της μεταβλητής εντός της ρουτίνας θα απέτρεπε την εσφαλμένη ερμηνεία από τον compiler, διασφαλίζοντας την ακεραιότητα της μνήμης.