Ich versuche, jemandem Segmentierungsfehler zu erklären, und ich habe über den Kill-Screen der Stufe 256 in Pacman nachgedacht, wie er durch einen Ganzzahlüberlauf ausgelöst wird und wie ähnlich das Verhalten dem in einer Segmentierung oft beschriebenen "unbekannten Zustand" ist Fehler.
Ich möchte sagen, dass dies ein gutes Beispiel für das ist, was ich einen "unbehandelten Fehler" nenne, aber ich würde lieber eine zweite Meinung einholen, bevor ich möglicherweise Fehlinformationen verbreite.
Ich habe versucht, es nachzuschlagen, aber alles, was ich bekomme, sind Dokumente über den Fehler selbst sowie die Zusammenarbeit zwischen Hipster Whale und Namco.
Würden Sie das Verhalten in Level 256 von Pacman als Beispiel für eine nicht behandelte Segmentierungsverletzung ansehen?
Antworten:
Definitiv nicht.
Der Zugriff auf eine Speicheradresse, die Sie nicht zugewiesen haben, ist immer ein Programmierfehler. Wenn Sie auf die Informationen reagieren, die Sie daraus erhalten, führt dies zu undefiniertem Verhalten, das sehr genau ist. Ich habe keine Ahnung, für welche Plattform der ursprüngliche Pac-Man geschrieben wurde, aber ich bin mir ziemlich sicher, dass er dieses Verhalten wie jede andere von Neumann-Maschine aufweist.
"Segmentierungsfehler" ist jedoch ein Fachbegriff für eine viel spezifischere Bedingung. Dies geschieht, wenn der Computer dies automatisch erkennt und den Vorgang beendet, anstatt undefiniertes Verhalten zuzulassen. Dies erfordert ein spezifisches (segmentiertes) Speichermodell mit ausgefeilten Besitzerkennzeichnungen. Ich glaube nicht , 1980 Arcade - Spiele , die hatten, und das Verhalten des Spiels in der Tat darauf hin , dass der Fehler wurde nicht erkannt, und das nicht definiertes Verhalten hat auftreten.
quelle
Es sieht so aus, als ob Sie "undefiniertes Verhalten" und "Segmentierungsfehler" verwechseln.
Es gibt keinen unbehandelten Segfault. Ein Segmentierungsfehler ist per Definition eine Fehlerbehandlung.
Wenn Sie kein Betriebssystem haben, das den fehlerhaften Speicherzugriff erkannt und den Vorgang aus Sicherheitsgründen abgebrochen hat, liegt kein Segmentierungsfehler vor.
Wenn überhaupt, dann ist dies ein ziemlich gutes Beispiel dafür, dass UB nicht immer zu einem Segfehler führt.
quelle
Keiner dieser Begriffe ist für einen Fehler in einem Arcade-Spiel geeignet, das in Assemblersprache programmiert wurde und ohne die Vorteile von Speicherschutzhardware oder Betriebssystem ausgeführt wird.
"Undefiniertes Verhalten" ist ein Begriff in C und verwandten Sprachen, der 1989 vom C-Normungsausschuss geprägt wurde. Code hat ein undefiniertes Verhalten, wenn die Sprachspezifikation nicht definiert, was er tun soll. In der Assemblersprache Z80 gibt es so etwas nicht: Die Wirkung jedes Opcodes bei jeder möglichen Eingabe ist genau definiert. Die konventionelle englische Bedeutung von "undefined behaviour" kann als zutreffend gelesen werden - der Kill Screen ist ein Verhalten, das nicht von den Leuten definiert wird, die das Spiel geschrieben haben -, aber ich würde es in diesem Zusammenhang nicht verwenden, weil es zu wahrscheinlich ist, dass es falsch ist Eindruck.
"Segmentierungsfehler" ist ein Begriff in POSIX, der sich letztendlich aus der Programmiersprache für PDP-Systeme ableitet. Segmentierungsfehler treten auf, wenn ein Programm versucht, auf eine Speicheradresse zuzugreifen, die keiner "Zuordnung" unterliegt: Die Hardware und das Betriebssystem erkennen dies und beenden das fehlerhafte Programm auf eine genau festgelegte Weise, die es dem Programm ermöglicht, sich zu erholen . So etwas wieDies könnte auf einen Fehler im Pac-Man-Spielprogramm zurückzuführen sein, da die Pac-Man-Platine nur etwas weniger als die Hälfte des 64-KB-Adressraums des Z80 mit ROM, RAM und Peripheriegeräten belegt. Ich konnte nicht herausfinden, was die reale Hardware tun würde, wenn die Software auf nicht zugeordneten Speicher zugreifen würde. Was auch immer es tun würde, wenn, wäre es unangemessen, als „Segmentation fault“ zu beschreiben, weil das „Betriebssystem“ für Pac-Man (soweit sie noch hat man) ist nicht eine Implementierung von Unix und wieder, es würde den falschen Eindruck erwecken.
Der Fehler der Stufe 256 greift indessen nicht auf nicht zugeordneten Speicher zu, so dass dies nicht möglich ist.
Es ist richtig zu sagen, dass das Spiel einen Fehler hat, der sich beim Aufsteigen auf Level 256 manifestiert. Es ist auch richtig zu sagen, dass die Hauptursache des Fehlers ein ganzzahliger Überlauf ist und dass seine Konsequenzen eine Speicherbeschädigung (oder gleichwertig Verstöße) sind des Gedächtnisses und der Typensicherheit ). Dies sind alles allgemeine CS-Begriffe, die ohne Bezugnahme auf eine bestimmte Sprache oder Betriebssystemumgebung definiert wurden.
Man kann auch genau beobachten, dass die Auswirkungen des Fehlers den Auswirkungen von Fehlern mit Speicherbeschädigung in einer modernen Umgebung ähnlich sind, die keine Segmentierungsfehler hervorrufen. Wenn Sie eine der Project Zero- Exploit-Beschreibungen lesen, werden Sie eine bemerkenswerte Ähnlichkeit mit Don Hodges ' Analyse des Pac-Man-Kill-Bildschirms feststellen .
Beachten Sie, dass ein Emulator, der den Kill-Bildschirm beim Laden der Pac-Man-ROMs nicht originalgetreu wiedergibt, die Spielhardware nicht richtig emuliert.
quelle
Der Level-256-Fehler in Pac Man führt dazu, dass das Programm Daten liest , die über das Ende der beabsichtigten Tabelle hinausgehen, aber immer noch lesbar sind , und in Teile des Bildschirms schreibt, die über denjenigen liegen, die das Programm schreiben möchte, jedoch nicht noch gut in den Bereichen des Bildschirms, die das Programm schreiben darf . Andere Speicherbereiche sind nicht betroffen.
Der Grund, warum der Fehler das Spiel nicht mehr spielbar macht, ist, dass der Computer durch Überprüfen der Bildschirmanzeige feststellt, wann ein Spieler Punkte isst, und dass ein Level abgeschlossen ist, wenn der Spieler 244 Punkte gegessen hat. Durch das Überschreiben eines Teils des Bildschirms ist es dem Spieler aufgrund des Fehlers nicht möglich, 244 Punkte zu essen. Infolgedessen wird das Spiel dem Spieler niemals das Abschließen des Levels und das Neuladen des Bildschirms mit Punkten gutschreiben.
quelle
Wie gesagt nein, es ist kein Seg-Fehler. Ich werde hinzufügen, warum das Problem auftritt: Es ist ein Überlauf .
Die Ebenennummern werden in einem Byte gespeichert, sodass der Bereich zwischen 0 und 255 liegt. Jedes Mal, wenn Sie ein Level abschließen, wird der Zähler inkrementiert. Auf Stufe 256 ist der Zähler aufgrund des Überlaufs tatsächlich 0.
Das Spiel versucht jedoch, einige Früchte am unteren Rand des Levels anzuzeigen. Die Fruchtanzahl / -art ist abhängig vom Füllstand. Die Formel zeigt eine Frucht pro abgeschlossenem Level unter Level 8 an. Entsprechend dem Zähler sind Sie auf Level 0, also unter 8. Der Test ist dann wahr und Sie müssen 255 Früchte drucken (der alte Level-Wert). Welches ist unmöglich und gibt diesen fehlerhaften Bildschirm.
quelle