.
Констекты из книги "Наука отладки". Часть 9. История ошибки в Therac-25.
Автор megabax   
20.07.2010 г.
Проблема

Конспекты из книги "Наука отладки". Часть 9. История ошибки в Therac-25.

 

Это продолжение предыдущей статьи.

 

Проблема

Ошибка аппарата Therac-25 была одной из самых дорогих в истории человечества.  В июня 1985 года по январь 1987 года шесть пациентов, которые лечились этим аппаратом, получили передозировку радиации, что привело к гибели троих из них. 

 

Фактографические данные

 Therac-25 представлял собой компьютеризированную машину для радиационной терапии. Ей предшествовал Therac-6, который представлял собой ускоритель на 6 МэВ (6 млн. электрон-вольт), способный испускать только рентгеновские лучи. и Therac-20, рентгеновский излучатель и ускоритель на 20 МэВ. Все три машины использовали мини-компьютер DEC PDP-11. В обоих предшественниках Therac-25 использовалась аппаратная защита от опасных операций (передозировки излучения). Некоторые программные модули из Therac-6 использовались в Therac-20, а затем и в Therac-25. Кроме того, у Therac-25 программный комплекс был сильно усовершенствован и мог контролировать состояние оборудования и управление им. Поэтому аппаратную защиту было принято решение удалить.

Случай 1. Женщина в возрасте 61 год была направлена в онкологический центр для лечения аппаратом Therac-25. Пациентка получила от 15000 до 20000 рад (для сравнения, терапевтическая доза 200 рад).  В конечном итоге пациентка потеряла грудь и возможность пользоваться плечами и руками. Так как до этого  с 1983 года клиника пользовалась аппаратом без происшествий, техники фирмы производителя не поверили, что проблема вызвана сбоями в Therac-25.

Случай 2.  Клиника в Хэмилтоне использовала Therac-25 в течении полугода. Сорокалетняя женщина поступала на 24-ый сеанс лечения. Через пять секунд аппарат отключился. Так как Therac-25 и до этого иногда глючил, но без последствий для пациентов, оператор просто повторил сеанс, так как машина показывала, что облучения не было. Оператор произвел пять попыток, затем вызвал техника. Но тот не обнаружил никаких проблем в аппарате. Об инциденте сообщили фирме производителю, но воспроизвести неполадку  и сделать заключение о причинах глюка не удалось. Однако благодаря этому сообщения фирма AECL нашла потенциальные проблемы в конструкции и исправила их.

Пациентка умерла через пять месяцев. Результаты вскрытия показали, что смерть наступила от рака. Однако вскрытие так же выявило серьезные радиационные поражения бедра. Как было позже определено, она облучилась дозой радиации 13000-17000 рад.

Случай 3.  После лечения аппаратом Therac-25 у женщины появилось сильное покраснение кожи. Персонал клиники считал, что это могло быть вызвано Therac-25, но не сумел воспроизвести конфигурацию оборудования, при котором произошел данный инцидент. Фирма AECL так же была информирована о данном случае, но ее специалисты дали ответ, что передозировки быть не могло. Сотрудники клиники не знали о двух предыдущих инцидентах и данный случай был просто благополучно забыт.

Случай 4. Восточно-техасский онкологический центр использовал аппарат Therac-25 для лечения более 500 пациентов.  21 марта 1986 года  на дополнительное лечение был направлен мужчина. Оператор, которая осуществляла лечение, был знакома с Therac-25 и хорошо разбиралась в его свойствах. Когда она ввела данные пациента, допустила ошибку, которую очень быстро исправила и начала лечение. Спустя некоторое время машина отключилась с сообщением "Ошибка 54", которая расшифровывалась в перечне ошибок "Ввод дозы -2".  Никакой другой информации о смысле этой ошибки персонал больницы не располагал. Так как индикаторы показали очень малую дозу облучения, и оператор была знакома с глюками Therac-25, она повторила сеанс. Аппарат снова отключился с тем же сообщением. Клиника связалась с AECL  по поводу этой проблемы. Техники фирмы снова не смогли воспроизвести глюк, и AECL  по прежнему продолжала считать, что передозировка  невозможно. А пациент спустя  пять месяцев после данного события скончался от осложнения передозировки облучения..

Случай 5. В той же самой клинике та же женщина оператор вновь при вводе данных допустила ошибку, и так же быстро ее исправила. Аппарат ответил сообщением "Ошибка 54" и отключился. Однако пациент уже получил передозировку и оператор побежала за помощью. Therac-25 был отключен, и клиника проинформировала AECL об очередном случае передозировки. Персонал клиники на этот раз смог воспроизвести глюк, и, компания AECL, повторив их действия, признала, что передозировка все таки возможна. Оказалось, что ошибка проявляется в ситуации, когда входные данные редактировались в очень быстром темпе.

Аппарат Therac-25 мог работать в одном из двух режимов: фотонном или электронном. В последнем оператору необходимо было ввести уровень энергии. Если же был фотонный режим, то уровень энергии по умолчанию ставился 25 МэВ. Ошибки, совершенные оператором в обоих случаях были одни и те же. Для двоих пациентов получивших передозировку, требовался электронный режим. Но так как большинству пациентов требовался фотонный режим то оператор привыкла выбирать последний. Первоначально она выбирала фотонный режим, затем исправляла свою ошибку.

Физическая калибровка и настройка магнитов занимает около 6 сек. Подпрограмма, которая проверяет завершение ввода данных, должен произвести калибровку магнитов. как только был выбран режим и уровень энергии. Другой программный модуль был ответственен за проверку изменения входных данных. Если были изменения, то калибровка магнитов сбрасывалась и начиналась заново, согласно измененным входным данным. Однако в этом модуле была программная ошибка, которая не смогла распознать изменения данных, если они были произведены в течении восьми секунд после того, как были введены первоначальные данные.

В этих двух случаях, когда оператор изменила режим на электронный, калибровка магнитов не была сброшена и аппарат выдавал неверную дозу излучения.

Когда фирма AECL поняла ошибку, она разослала информационные письма с рекомендациями в качестве временной меры не редактировать данные в процесс их ввода.

А пациент скончался через три недели после инцидента с передозировкой радиации.

Случай 6.  К этому времени проблемы с машиной были переданы широкой огласке.  Операторы  знали о запрете редактировать данные. В то время, когда фирма AECL активно работала над устранением глюка, случился шестой инцидент.  На этот раз машина заглючила,  когда входные данные не редактировались. Было подозрение на передозировку, но дисплей показывал, что доза облучения всего 7 рад.

Через неделю AECL нашла ошибку, которая вызывала подобное поведение. В данном случае причина оказалось в том, что однобайтовая переменная, которая являлась флагом, показывающим, соответствуют ли параметры машины входным данным. Если нуль - то параметры считались соответствующими. иначе - несоответствующими. В процессе инициализации происходил инкремент данной переменной. Так как переменная была однобайтной, то через каждые 256 итераций она доходила до нуля. Таким образом, если оператор нажимал на кнопку тогда, когда переменная равнялась нулю, происходил глюк, из за которого пациент получаел неверную дозу облучения.

В результате шестого случая пациент так же скончался от осложнения. Вскоре после этого аппарат Therac-25 был отозван.

 

Особенности излагаемого материала, критика

От себя добавлю, что фирме AECL следовало бы написать программы так, что бы калибровка и включение излучателя происходила тогда и только тогда, когда оператор подтвердил входные данные, а не так, что при изменении входных данных происходит переколибровка.

 

 

Новизна, как можно применить в жизни (выводы)

С точки зрения безопасности, самое уязвимое место - доверие к программному обеспечению. Очевидно, что тот же дефект, который был выявлен в Therac-25 присутствовал так же и в Therac-20 и в Therac-6. Но эти машины имели аппаратную защиту от передозировки, благодаря чему глюк не приводил к человеческим жертвам.

Ошибки, зависимые от времени, очень трудно обнаружить. В случае первого глюка, что бы он проявился, необходимо случайное стечение двух обстоятельств:

  • Оператор должен сделать изменения в параметра режима и уровне энергии.

  • Оператор должен сделать изменения в течении восьми секунд.

Естественно, в таком случае воспроизвести неполадку очень трудно, практически, нереально, потому что когда глюк проявлялся, никто не знал, что он проявляется при выше перечсиелнных обстоятельства. Кстати, по той же причине ошибка не была выявлена при обычном тестировании аппарата. 

Большинство аварий - аварии системные, тоесть, они происходят в результате сложного взаимодействия между различными частями единой системы.

 

Какие уроки можно извлечь из опубликованной выше истории?

  • Должно существовать несколько уровней защиты от неправильно работающих программ, особенно, в тех случаях, когда появление ошибки очень критично (может привести к огромным убыткам или даже человеческим жертвам).

  • Игнорирование неполадок, от которых нет вреда может привести к тому, что когда нибудь выплывает глюк, который причинит серьезный вред. 

  • Использование программных блоков в новых продуктах может активизировать скрытые дефекты этих блоков, которые по какой либо причине не были обнаружены ранее.

 

Источник: Мэтт Тэллес, Юань Хсих, "Наука отладки".

Продолжение следует.

 

Последнее обновление ( 18.02.2013 г. )