Il "livello 256 bug" nel gioco di Pacman può essere considerato un segfault non gestito?

51

Sto cercando di spiegare gli errori di segmentazione a qualcuno, e stavo pensando al kill-screen di livello 256 in Pacman, e come è innescato dall'overflow dei numeri interi e quanto è simile il comportamento allo "stato sconosciuto" spesso descritto in un errore di segmentazione.

Voglio dire che questo è un buon esempio di ciò che chiamo un "segfault non gestito", ma preferirei ottenere una seconda opinione prima di diffondere potenzialmente informazioni errate.

Ho provato a cercarlo, ma tutto quello che sto ottenendo sono documenti sul bug stesso, così come quello tra Hipster Whale e Namco.

Quindi, considereresti il comportamento nel livello 256 di Pacman come un esempio di violazione della segmentazione non gestita?

    
posta Braden Best 25.01.2016 - 11:33
fonte

5 risposte

113

Assolutamente no.

L'accesso a un indirizzo di memoria che non hai assegnato è sempre un errore di programmazione. E agire sulle informazioni che ne ricavate produce un comportamento indefinito, tanto è accurato. Non ho idea di quale piattaforma sia stata scritta per la versione originale di Pac-man, ma sono abbastanza sicuro che ha esibito questo comportamento proprio come qualsiasi altra macchina di von Neumann.

Tuttavia, "errore di segmentazione" è un termine tecnico per una condizione molto più specifica. Succede quando il computer rileva automaticamente che ciò è successo e termina il processo piuttosto che consentire il verificarsi di un comportamento non definito. Ciò richiede un modello di memoria specifico (segmentato) con sofisticati tag di proprietà. Non penso che i giochi arcade del 1980 avessero questo, e in effetti il comportamento del gioco suggerisce che l'errore era non rilevato, e il comportamento indefinito ha si è verificato.

    
risposta data 25.01.2016 - 11:39
fonte
38

Sembra che tu stia confondendo "comportamento non definito" e "errore di segmentazione".

Non esiste una segfault non gestita. Un errore di segmentazione è la gestione degli errori, per definizione.

Se non disponi di un sistema operativo che rileva l'accesso errato alla memoria e termina il processo per sicurezza, non hai un errore di segmentazione.

Se mai, allora, questo è un buon esempio di come UB non produce sempre un segfault.

    
risposta data 25.01.2016 - 11:47
fonte
24

Nessuno di questi termini è appropriato per un bug in un gioco arcade che è stato programmato in linguaggio assembly e viene eseguito senza il vantaggio dell'hardware di protezione della memoria o del sistema operativo.

"Comportamento indefinito" è un termine dell'arte in C e lingue correlate, coniato dal comitato degli standard C nel 1989. Il codice ha un comportamento indefinito quando la specifica del linguaggio non definisce quale lo farà. Non c'è nulla di simile nel linguaggio assembly Z80: l'effetto di ogni opcode con ogni input possibile è ben definito. Il significato inglese convenzionale di "comportamento indefinito" può essere letto per essere applicato - lo schermo di uccisione è un comportamento non definito dalle persone che hanno scritto il gioco - ma non lo userei in questo contesto perché è troppo probabile che dia il torto impressione.

"Errore di segmentazione" è un termine dell'arte in POSIX, derivato in ultima analisi dal gergo di programmazione del sistema PDP. Gli errori di segmentazione si verificano quando un programma tenta di accedere a un indirizzo di memoria che non è "mappato" a qualcosa: l'hardware e il sistema operativo lo rilevano e arrestano il programma malfunzionante, in un modo accuratamente definito che consente al programma di recuperare . Qualcosa come potrebbe essere accaduto a causa di un bug nel programma di gioco di Pac-Man, perché il circuito Pac-Man popola solo poco meno della metà dello spazio degli indirizzi 64kB dello Z80 con la ROM, RAM e periferiche, ma non sono stato in grado di scoprire cosa avrebbe fatto il vero hardware se il software avesse tentato di accedere alla memoria non mappata. Comunque, qualunque cosa faccia, sarebbe inappropriato descrivere come un "difetto di segmentazione", perché il "sistema operativo" per Pac-Man (nella misura in cui ha uno) è non un'implementazione di Unix e, ancora una volta, darebbe un'impressione sbagliata.

Il bug di livello 256, nel frattempo, non accede alla memoria non mappata, quindi è discutibile.

È corretto dire che il gioco ha un bug che si manifesta avanzando al livello 256. È anche esatto dire che la causa principale del bug è un overte intero / em> e che le sue conseguenze sono corruzione della memoria (o, equivalentemente, violazioni della memoria e sicurezza del tipo ). Questi sono tutti termini CS generici definiti senza riferimento ad alcuna lingua o ambiente operativo specifico.

È anche accurato osservare che gli effetti del bug sono simili agli effetti, all'interno di un ambiente moderno, di bug di corruzione della memoria che non provocano segmentazione difetti. Se leggi uno dei Zero del progetto sfrutta le annotazioni, vedrai una notevole somiglianza con l'analisi della schermata di uccisione di Pac-Man .

Nota che un emulatore che non riproduce fedelmente la schermata di uccisione quando viene alimentato con le ROM di Pac-Man non emula l'hardware di gioco correttamente.

    
risposta data 25.01.2016 - 19:03
fonte
8

Il bug del livello 256 in Pac Man risulta nei dati del programma che legge che è oltre la fine della tabella prevista, ma è memoria ancora leggibile e scrive in porzioni dello schermo che vanno oltre quelle che il programma intende scrivere, ma sono ancora ben all'interno delle aree dello schermo che il programma può scrivere . Non sono interessate altre aree di memoria.

La ragione per cui il bug rende il gioco non riproducibile è che la macchina determina quando un giocatore sta mangiando punti esaminando cosa c'è sullo schermo e decide che un livello è completo quando il giocatore ha mangiato 244 punti. Sovrascrivendo parte dello schermo, il bug rende impossibile al giocatore di mangiare 244 punti; di conseguenza, il gioco non accrediterà mai al giocatore il completamento del livello e ricaricherà lo schermo con i punti.

    
risposta data 25.01.2016 - 21:57
fonte
1

Come detto prima no non è un difetto di seg. Aggiungerò perché il problema si verifica: è un overflow .

Il numero di livello è memorizzato su un byte, quindi l'intervallo è 0-255. Ogni volta che si completa un livello, il contatore viene incrementato. A livello 256 il contatore è in realtà 0 a causa dell'overflow.

Tuttavia, il gioco cerca di mostrare alcuni frutti nella parte inferiore del livello. Il numero / tipo di frutta dipende dal livello. La formula mostra un frutto per livello finito sotto il livello 8. Secondo il contatore sei al livello 0 quindi sotto 8. Il test è vero allora e devi stampare 255 frutti (il vecchio valore di livello). Che è impossibile e dà questo schermo glitch.

    
risposta data 27.01.2016 - 14:20
fonte

Leggi altre domande sui tag