Hacker News오픈소스 · 도구

40년 된 고전 게임에서 메모리 손상 버그 발견

원제 Infidel goes wild

113 포인트댓글 17
Key Point

40년 전 게임에 숨어있던 메모리 손상 버그가 최근에 발견된 것은 게임 개발 초창기 컴파일러 결함과 테스트 범위의 한계를 보여주는 흥미로운 사례다.

핵심 요약

  • 인포콤의 1983년 어드벤처 게임 '인피델'에서 와일드 포인터 메모리 손상 버그가 발견되었다.
  • 버그는 DESERT-TO-TABLE 루틴에서 발생한다. 기본값으로 사용되는 DESERT-TABLE 배열이 전역변수인데도 ZIL 컴파일러는 이를 상수로 취급했다.
  • 결과적으로 배열 주소 11129 대신 메모리 주소 30부터 덮어쓰기가 발생했다.
  • 게임에서 사막에 9개 이상의 물체를 떨어뜨리면 텍스트 압축용 약어 테이블(주소 64부터)이 손상되어 게임이 오작동하거나 인터프리터가 충돌한다.
  • 원문은 실제로 약어 테이블을 덮어써서 'the'가 'You'로 교체되고 인터프리터가 무한 루프에 빠진 사례를 보여준다.
  • 버그는 놀랍게도 테스트 단계에서 발견되지 않았는데, 사막 지역은 게임 진행에 필수적이지 않아 많은 물체를 버릴 이유가 없었기 때문이다.
  • ZIL 컴파일러 문제로 인해 1983년 초판과 1984년 수정판 모두 같은 버그를 포함하고 있다.
  • 동일한 구조의 버그가 PROP-TO-TBL/TBL-TO-PROP 루틴에도 존재한다.
  • 픽스 방법은 간단하다: 루틴 시작 시 명령을 추가하거나, DESERT-TABLE을 인자로 전달하면 된다.
  • 저자는 인포콤 테스팅 로그를 찾을 수 있다면 이 버그의 흔적이 있는지 궁금해하고 있다.
AI 요약 안내

AI가 한국어로 정리한 내용입니다. 정확한 정보는 원문을 확인해 주세요.

요약 원칙 ↗