¿Se puede considerar el "error de nivel 256" en el juego de Pacman como un error de seguridad no manejado?

51

Estoy tratando de explicar las fallas de segmentación a alguien, y estaba pensando en la pantalla de eliminación de nivel 256 en Pacman, y cómo se desencadena por un desbordamiento de enteros, y qué tan similar es el comportamiento al "estado desconocido" descrito a menudo. en una falla de segmentación.

Quiero decir que este es un buen ejemplo de lo que yo llamo un "error de seguridad no manejado", pero preferiría obtener una segunda opinión antes de difundir potencialmente la información errónea.

Intenté buscarlo, pero lo único que obtengo son documentos sobre el error, así como la colaboración entre Hipster Whale y Namco.

Entonces, ¿consideraría el comportamiento en el nivel 256 de Pacman como un ejemplo de violación de segmentación no controlada?

    
pregunta Braden Best 25.01.2016 - 11:33

5 respuestas

113

Definitivamente no.

Acceder a una dirección de memoria que no asignó siempre es un error de programación. Y actuar sobre la información que obtiene de ella produce un comportamiento indefinido, eso es exacto. No tengo idea de en qué plataforma se escribió el Pac-man original, pero estoy bastante seguro de que exhibió este comportamiento como cualquier otra máquina de von Neumann.

Sin embargo, "falla de segmentación" es un término técnico para una condición mucho más específica. Ocurre cuando la computadora detecta automáticamente que esto sucedió y finaliza el proceso en lugar de permitir que ocurra un comportamiento indefinido. Esto requiere un modelo de memoria específico (segmentado) con etiquetas de propiedad sofisticadas. No creo que los juegos de arcade de 1980 tuvieran eso, y de hecho, el comportamiento del juego sugiere que el error no fue no detectado y que el comportamiento indefinido ocurrió .

    
respondido por el Kilian Foth 25.01.2016 - 11:39
38

Parece que estás confundiendo "comportamiento indefinido" y "falla de segmentación".

No existe tal cosa como una falla de seguridad no controlada. Un error de segmentación es el manejo de errores, por definición.

Si no tiene un sistema operativo que detectó el acceso a la memoria incorrecta y finalizó el proceso por seguridad, entonces no tiene un error de segmentación.

En todo caso, este es un buen ejemplo de cómo UB no siempre da como resultado un fallo de seguridad.

    
respondido por el Lightness Races in Orbit 25.01.2016 - 11:47
24

Ninguno de estos términos es apropiado para un error en un juego de arcade que se programó en lenguaje ensamblador y se ejecuta sin el beneficio del hardware o sistema operativo de protección de memoria.

"Comportamiento indefinido" es un término de arte en C y en lenguajes relacionados, acuñado por el comité de estándares de C en 1989. El código tiene un comportamiento indefinido cuando la especificación de lenguaje no define qué lo hará No existe tal cosa en el lenguaje ensamblador Z80: el efecto de cada código de operación con cada entrada posible está bien definido. El significado en inglés convencional de "comportamiento indefinido" se puede leer para aplicar - la pantalla de eliminación es un comportamiento no definido por las personas que escribieron el juego - pero no lo usaría en este contexto porque es muy probable que dé el error impresión.

"Fallo de segmentación" es un término de arte en POSIX, derivado en última instancia de la jerga de programación del sistema PDP. Las fallas de segmentación ocurren cuando un programa intenta acceder a una dirección de memoria que no está "asignada" a nada: el hardware y el sistema operativo detectan esto y apagan el programa que funciona mal, de una manera cuidadosamente definida que le permite al programa la oportunidad de recuperarse . Algo como podría haber ocurrido como resultado de un error en el programa de juego Pac-Man, porque la placa de circuito Pac-Man solo llena un poco menos de la mitad del espacio de direcciones de 64kB con ROM de la Z80. RAM y periféricos, pero no he podido averiguar qué haría el hardware real si el software intentara acceder a la memoria no asignada. No obstante, haga lo que haga, sería inapropiado describirlo como un "fallo de segmentación", porque el "sistema operativo" para Pac-Man (en la medida en que incluso tiene uno) es no una implementación de Unix y, de nuevo, daría una impresión incorrecta.

El error de nivel 256, mientras tanto, no accede a la memoria no asignada, por lo que es discutible.

Es preciso decir que el juego tiene un error que se manifiesta al avanzar al nivel 256. También es correcto decir que la causa raíz del error es un desbordamiento de enteros , y que sus consecuencias son corrupción de memoria (o, de manera equivalente, violaciones de memoria y tipo de seguridad ). Todos estos son términos de CS de propósito general definidos sin referencia a ningún idioma o entorno de sistema operativo en particular.

También es preciso observar que los efectos del error son similares a los efectos, dentro de un entorno moderno, de errores de corrupción de memoria que no provocan segmentación faltas Si lees cualquiera de los Project Zero explota las escrituras, verás una notable similitud con El análisis de la pantalla de muerte de Pac-Man de Don Hodges .

Tenga en cuenta que un emulador que no reproduce fielmente la pantalla de eliminación cuando se alimenta con las ROM de Pac-Man no está emulando correctamente el hardware del juego.

    
respondido por el zwol 25.01.2016 - 19:03
8

El error de nivel 256 en Pac Man da como resultado que el programa lea que está más allá del final de la tabla deseada, pero que aún se puede leer y se escribe a partes de la pantalla que están más allá de las que el programa intenta escribir, pero aún se encuentran dentro de las áreas de la pantalla en las que el programa puede escribir . No se ven afectadas otras áreas de la memoria.

La razón por la que el error hace que el juego no se pueda jugar es que la máquina determina cuándo un jugador está comiendo puntos al examinar lo que está en la pantalla y decide que un nivel se completa cuando el jugador ha comido 244 puntos. Al sobrescribir parte de la pantalla, el error hace imposible que el jugador coma 244 puntos; en consecuencia, el juego nunca acreditará al jugador completar el nivel y volverá a cargar la pantalla con puntos.

    
respondido por el supercat 25.01.2016 - 21:57
1

Como se dijo antes, no, no es un fallo de seguridad. Agregaré por qué ocurre el problema: es un desbordamiento .

Los números de nivel se almacenan en un byte, por lo que el rango es de 0-255. Cada vez que completas un nivel, el contador se incrementa. En el nivel 256, el contador es de hecho 0 debido al desbordamiento.

Sin embargo, el juego intenta mostrar algunas frutas en la parte inferior del nivel. El número / tipo de fruta depende del nivel. La fórmula muestra una fruta por nivel final en el nivel 8. De acuerdo con el contador, usted está en el nivel 0, por lo tanto, en el nivel 8. La prueba es verdadera y debe imprimir 255 frutas (el valor de nivel anterior). Lo cual es imposible y le da a esta pantalla un fallo técnico.

    
respondido por el Romain Picot 27.01.2016 - 14:20

Lea otras preguntas en las etiquetas

Comentarios Recientes

En el pequeño con respecto a los pokemon de viento, hay 8 de ellos, 17 de ellos atacan a los pokemon que están en el nivel 255 a 260 en la caja, pero solo 2 de ellos; Todos pueden atacar uno debajo del otro. A mitad del juego, ves a Peter en una pelea con 6 de ellos mientras solo hay 2 monstruos en la pantalla. La tormenta de arena en bucle parece muy diferente. Algunas cartas son deformadas por el jugador para revelar parcialmente elementos; cuando la tormenta de arena se recupera, algunas cartas regresan. Más tarde,... Lee mas