The Daily Newsstand · Free, Always
Friday, September 11, 2026

Самый худший софт и его смертельные баги: история Therac-25

Translate

Стремление урезать издержки и экономить — похвальное стремление, в некотором роде способствующее прогрессу. Но иногда оптимизация оборачивается мелочностью, которая в одних случаях просто раздражает, а в других, если ей сопутствуют халатность и разгильдяйство, становится опасной для жизни.

Именно в такой смертоносный унисон однажды сложились факторы, повлёкшие знаменитую трагедию Therac-25.

Пролог трагедии

Апрель 1986 года. Улыбчивая девушка-технолог проводит дежурную процедуру в Центре по изучению онкологических заболеваний Восточного Техаса. Ей нужно откалибровать недавно привезённую из Канады махину со странным именем Therac, чтобы направить пучок электронов низкой энергии на ухо пациента: у 66-летнего Вердона Кидда, местного водителя автобуса, недавно диагностировали рак ушной кожи, и ему была прописана дистанционная лучевая терапия.

Therac-25. Источник: Wikipedia.

На Therac возлагались большие надежды — это был улучшенный образец медицинского линейного ускорителя, продуцирующего слабые пучки мегаэлектронов (МэВ), способные успешно истреблять различные онкопатологии, например келоиды.

Вердону выпала честь стать вторым пациентом Therac’а. Когда технолог ввела нужную последовательность команд, машина негромко зарокотала. А мгновение спустя раздался резкий вскрик: «Crap!» — обычно тихий Вердон выругался надтреснувшим голосом во всю глотку, на весь кабинет радиотерапии, а может, и на всю больницу. Как он потом описал, в этот миг, длившийся не дольше секунды, его ошпарило невидимым кипятком — и это описание более чем точное: он получил гигантскую дозу примерно от 15 000 до 25 000 рад. Для сравнения, выжить после дозы даже в 400 рад уже довольно проблематично.

Вердон, переживший Великую депрессию и Вторую мировую, умер 20 дней спустя. И его кончина указала на единственного и главного подозреваемого: аппарат Therac-25. Ну и попутно на корпорацию, его породившую.

Благие намерения, ведущие сами знаете куда

Therac-25 был логическим продолжением двух предыдущих ускорителей — Therac-6 и Therac-20, которые продуцировали 6 и 20 МэВ соответственно. Данная линейка появилась на свет в результате сотрудничества двух корп-гигантов, а именно: французской «Главной компании по радиологии» (CGR) и канадской компании «Атомная энергия Канады Лимитед» (AECL) — «корпорации Короны», как принято величать в краю конных полицейских, всё ещё состоящем в Содружестве, контролируемые государством компании.

Схема ускорителя Therac-20. Источник: carleton.ca.

Правда, Therac-25 был уже сольным детищем канадцев. Как и в предыдущих установках, его мозгом был микрокомпьютер DEC PDP-11, который выгодно выделялся своей системой с восемью регистрами по 16 бит каждый и ортогональностью, благодаря которой большинство операций поддерживали одни и те же способы адресации.

Все три Therac’а работали на едином и почти неизменном легаси-коде, который начинался еще с самого первого устройства. Для каждой модели в преемственном порядке добавляли некоторые модификации на ассемблерном языке для PDP-11, и с кодом Therac-25 это и сыграло трагическую шутку.

Компьютер PDP-11/ Источник: Wikipedia.

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

Схематическое устройство Therac-25.

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

А ещё в нём были имплементированы три рабочих режима: «световое поле» для точного позиционирования коллиматора, прямая электронная терапия, использовавшая низкотоковый пучок электронов высокой энергии в диапазоне 5–25 МэВ, и мегавольтно-рентгеновская терапия, подававшая пучок рентгеновских фотонов с энергией 25 МэВ. Словом, это должен был быть монстр-аппарат с кучей конкурентных преимуществ.

Терракт-25

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

Роковым отличием Therac-25 было то, что с него сняли физические системы блокировки, присутствовавшие на его «родственниках» — они нужны были на тот случай, если процедура пойдёт не по плану и машина окажется в опасной для пациента конфигурации: например, если стол с пациентом и насадки зафиксированы в запрещенном положении.

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

Пример использования ускорителя на практике. Источник: Wikipedia.

Как упоминалось, управление установкой строилось на мини-компьютере PDP‑11, который запускал несколько параллельных задач: обработку ввода с терминала, проверку готовности машины, настройку магнитов и поворотного стола, и в финальной части цикла выдачу луча. Эти задачи обменивались состоянием через общие переменные-флаги в памяти, но громоздкий процесс протекал без надёжной синхронизации.

В результате итоговое поведение зависело от тайминга нажатий оператора и скорости выполнения фоновых процедур. И это привело к первой беде в Кеннестонском региональном центре онкозаболеваний: неизвестный (или, вернее, оставшийся неназванным) технолог перепутал команды и по ошибке включил рентгеновский режим лечения, но потом быстро перевёл машину в режим электронов, щелкая на консоли управления стрелками «вверх» и «вниз».

Принцип вращения поворотного стола в Therac-25/ Источник: Wikipedia.

Эта последовательность и стала триггером для злосчастного состояния гонки данных и переполнения 8‑битного счётчика Class 3 — однобайтовой переменной памяти, которая переполнялась каждые 256 проходов во время тестирования настроек машины, непреднамеренно обходя критически важную проверку радиационной безопасности. Зато, наверное, это было дешевле.

Эта ошибка привела к тому, что Кэтрин Ярброу — первый пациент, пострадавший от неполадки в мозгах Therac-25, — получила в июне 1985 года стократную дозу радиации в сравнении с прописанными ей 200 радами. Машина выдавала 25 МэВ, но полагавшийся по программному протоколу металлический выравнивающий фильтр не был расположен в нужном месте — от шока и боли бедная 61-летняя женщина, проходившая лечение грудной опухоли, выбежала из процедурной полураздетая. Как она скажет потом, это ощущалось так, будто в её плечо вонзили раскалённую трубу.

Что интересно, увлечённая маникюрным ремеслом Кэтрин не стала первой жертвой, погибшей именно от неполадок Therac’а. Она получила страшный радиационный ожог, из-за которого долгое время была частично парализованной, а последующие приступы боли были настолько мучительны, что она могла спать только урывками по 30 минут. Но неким чудом ей удалось восстановиться и даже в итоге вернуться к более-менее нормальной жизни. Её дни оборвутся лишь несколько лет спустя после инцидента, в автокатастрофе.

Расследование и «Голубой огонёк»

Кстати, Вердон Кидд был не первым в скорбном списке Therac’а. В марте той же весны смертельную дозу радиации получил другой пациент, которому лечили опасное образование в спине. По его словам, это чувствовалось так, будто кто-то вылил целый кофейник горячего кофе ему на спину. Этого мужчины не стало несколько месяцев спустя. Тогда же на дисплее машины впервые высветилась знаменитая «Ошибка 54» («Malfunction 54»).

О произошедшем сообщили Фрицу Хагеру, который работал в том же техасском центре медицинским физиком. Поспешно вернувшись с ярмарки врачебных технологий, он попытался восстановить картину происшествия, но администрация центра сразу вставила ему палки в колёса, запретив связываться с пострадавшим пациентом.

Эффект Вавилова-Черенкова, зафиксированный во время эксперимента Фрица Хагера. Источник: kitv.com.

По его запросу в центр прибыли канадские инженеры с инспекцией, дабы проверить работу аппарата. Их вердикт был единогласным: всё в порядке, всё работает как надо. А доводы и предположения Хагера отвергались как беспочвенные спекуляции. А затем такая же история случилась с уже известным нам семьянином и водителем автобуса Верденом Киддом, и пазл начал неотвратимо складываться.

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

«Компьютерная программа не полностью переключила все параметры и оставила систему в гибридном режиме, при котором на пациента лился душ из электронов высокой энергии. Это давало запредельную дозу облучения за одну десятую секунды — в районе 15 000 сантигреев, чего достаточно для лечения трёх пациентов за пять недель».

Еще один пример сияния Вавилова-Черенкова. Источник: Spacegid.com.

Для сравнения, жертвы Хиросимы, находившиеся в эпицентре взрыва, получили заряд в 946 сантигреев по результатам анализа челюстной кости пострадавших. Сделав замер радиации в ионизационной камере, Хагер лаконично заметил администратору центра: «Мы только что “убили” кого-то».

Эксперимент был проведен еще раз, уже на более профессиональном оборудовании при содействии Медицинского центра онкозаболеваний Андерсона. Когда они снова искусственно вызвали ошибку, монитор Therac’а резко погас, как перегоревшая лампочка. А затем присутствовавшие воочию увидели «голубой огонёк» — эффект Черенкова, который обычно можно наблюдать в ядерных реакторах бассейнового типа. Огонёк красиво прогорел 1/10 секунды, а индикаторы сняли дозу в 15 000 сантигреев.

Справедливость восторжествовала?

Как же закончилась вся эта эпопея? Против доказательств вины, в том числе предоставленных Фрицем Хагером с коллегами, идти было трудно. Первоначально канадская корпорация пыталась делать хорошую мину и настаивала, что с софтом всё в порядке. Вместо тщательной проверки они просто предложили отключить стрелку «вниз» на консоли управления.

Фриц Хагер. Источник: Reddit.

r/MedicalPhysics - New interview with the physicist who discovered the infamous Therac-25 failure condition

Но утаить произошедшее уже было невозможно. Хагер принялся активно обзванивать все учреждения, где имелся Therac-25, и объяснять сложившуюся ситуацию. Назревал серьезный скандал, от которого AECL не смогла бы уже, что называется, «отмахаться лопатой». В итоге канадские и американские регуляторы, в частности FDA — она же “Управление по санитарному надзору за качеством пищевых продуктов и медикаментов” — при Минздраве США, постановил прекратить использование Therac-25. По требованию всё того же FDA все машины на территории Штатов были отозваны и оборудованы механизмами безопасности, которые были установлены на предыдущих моделях.

На AECL посыпались иски от пострадавших и их родни. Всё было урегулировано в досудебном порядке, и компенсационные выплаты не разглашались, но по некоторым данным AECL в общей сложности пришлось выплатить порядка 150 миллионов долларов семьям пострадавших. Техасский центр по изучению онкологических заболеваний получил 1 миллион долларов и долгие сессии с психологом, которого наняли специально для сотрудников, всерьёз терзавшихся муками совести по поводу двух загубленных душ.

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

АЭС Пойнт-Лепро, Канада. Источник: neutrons.ca.

В свете событий американским законодательством был принят Акт о безопасности медицинской техники (SMDA) в 1990 году, который обязывал производителей отслеживать работу своего оборудования до тех пор, пока оно используется.

Акт повлиял на международные нормы, и таким образом сформировалась современная практика «материовигилянс» (materiovigilance) — надзор за безопасностью медизделий. А в мире IT стали уделять более пристальное внимание проверке качества кода, особенно там, где речь заходит о жизни и смерти.

Из всех пострадавших сравнительно легко отделалась Дженис Тильман, проходившая терапию в госпитале города Якимы, штат Вашингтон. После критического облучения у неё начался частичный некроз кожи бедра, а также сильные боли, но по итогам операции она сумела успешно восстановиться, хотя и заработала лёгкую, но все же пожизненную инвалидность. Её текущий статус неизвестен.

View the original on Хабр

KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.