2010년 2월 21일 일요일

역사상 최악의 버그: The Therac 25

도요타 기술의 상징인 하이브리드카 프리우스의 브레이크 시스템에서 소프트웨어 '버그'가 발견되어 소프트웨어 '업그레이드'를 위한 리콜을 검토중이라고 한다 [1]. 자동차에 '업그레이드'라는 말이 왠지 낮설지만 엔진 제어 장치인 ECU를 포함해 자동차의 많은 곳에서 컴퓨터와 소프트웨어가 사용된지는 이미 오래다.

결함없는 소프트웨어를 만드는 것은 어렵다. 그런데 자동차를 포함해 우리의 생명과 직결되는 많은 장치들이 점점 더 컴퓨터와 소프트웨어에 의존해 동작하는 현실은 그리고 미래는 섬뜩하기까지 하다. Window 운영체제로 동작하는 자동차, 비행기를 그리고 원자력 발전소를 상상해 보라.

소프트웨어 버그로 인해 발생한 사고중 최악의 사건 중 하나는 무려 25년 전으로 거슬러 올라간다 [2]. 1985년에 캐나다의 AECL이란 회사는 암 종양 제거를 위한 방사선 치료기인 Therac 25라는 제품을 판매하기 시작했다. 모양은 아래 그림과 같이 생겼다.

(사진 출처: http://idg.bg/test/cwd/2008/7/14/21367-radiation_therapy.JPG )

Therac 25는 전자빔으로 피부 근처의 종양을 제거하는 Electron 모드와 X-ray로 피부 깊숙한 곳의 종양을 제거하는 X-ray 모드의 두가지 동작 모드를 지원했다. 그 전에는 각각이 별도의 장비로 되어 있던 것을 하나로 합쳐 공간과 비용을 혁신적으로 개선한 제품이었다고 한다.

그런데 X-ray 모드는 강한 방사선을 사용하기 때문에 이를 균일하고 안전하게 환자에게 쪼일 수 있게 하는 턴테이블이라고 하는 장치를 환자와 방사선 발사기 사이에 위치하도록 제어해주는 것이 필요했다. 하지만 이 장치는 Electron 모드로 동작할 때는 필요하지 않았다. 때문에 모드에 따라 턴테이블을 움직여 주어야 하는데 이러한 제어를 컴퓨터 소프트웨어가 담당하고 있었다. 불행히도 이 소프트웨어에는 버그가 있어 '간혹' X-ray 모드인 상태에서 턴테이블이 제위치에 있지 않은 경우가 발생했다. 그림으로 보면 아래와 같다.

(출처 : http://radonc.wdfiles.com/local--files/radiation-accident-therac25/Therac25.png)

정상적인 경우라면 왼쪽의 두 그림중 하나의 상태여야 하는데 소프트웨어의 오류로 인해 오른쪽과 같은 상황에서 방사능을 발사했고 이로인해 문제가 완전히 밝혀져서 고쳐지기까지 무려 6건의 사고가 발생해서 3명이 죽고 다른 3명은 심각한 방사능 후유장애에 시달려야 했다. 

이러한 상황을 만들 수 있는 몇가지 오류중 하나를 소개하면 다음과 같다. 오류가 보이는가? 힌트는 in_progress 라는 변수가 8bit 변수라는 점이다.

Thread 1 : // 턴테이블 준비 Thread. 주기적으로 수행 

   if ( system ready )

       in_progress = 0

   else

       in_progress ++

Thread 2 : // X-ray 빔 제어 Thread. 주기적으로 수행.

   if ( start key pressed AND in_progress == 0 )

       start radiation

(*) 이해의 편의를 위해 변형하였음.

컴퓨터 프로그램에 대한 지식이 조금이라도 있는 사람이라면 바로 알 수 있을 것이다. 8bit 변수는 최대 255까지 표현할 수 있기 때문에 Thread 1이 256번 수행되면 256번째 수행할 때 in_progress에 overflow가 발생해서 값이 0으로 변한다. 문제는 바로 그 순간에 start key를 누르면 실제로는 턴테이블을 준비하는 중이지만 방사능을 발사하게 되는 것이다. 어이없을 정도로 간단한 실수지만, 이 문제는 테스트를 통해 발견하기는 사실상 거의 불가능에 가깝다. 왜냐면 256 번째 Thread 1이 수행되서 overflow가 발생한 바로 그 순간에 start 키를 누를 때에만 문제가 생기고 다른 경우에는 모두 정상 동작하기 때문이다.

바로 똑같은 이유로 1996년에는 Arian 5 로켓이 폭팔했다 [3]. 지극히 정상적으로 날고 있던 로켓의 속도를 감지하는 변수가16bit 였는데 속도가 높아지자 overflow가 발생해 컴퓨터가 로켓의 속도를 0으로 인식하게 되었고 로켓에 심각한 문제가 발생했다고 판단한 컴퓨터는 지상에 추락하는 것을 방지하기 위해 자폭을 한 것이다.

일상의 점점 더 많은 부분을 컴퓨터에 의지하는 세상이다. 소프트웨어는 밤새서 만들면 된다라는 사고 방식은 이제 정말로 버려야 할 때다.

Reference

[1] ABC News, 02.04.2010,  http://abclocal.go.com/wjrt/story?section=resources/auto&id=7257751

[2] Nancy Leveson, Medical Devices: The Therac-25, 1995

[3] ARIANE 5 Failure - Full Report, http://www.ima.umn.edu/~arnold/disasters/ariane5rep.html

[출처] 역사상 최악의 버그: The Therac 25|작성자 덤덤2

댓글 없음:

댓글 쓰기