Программный код начал убивать людей при помощи машин еще в 1985 году.
История, конечно, не новая, но на мой взгляд полезно узнать каждому.Баг-убийца. Фигак, фигак и Therac-25
Типичная разовая терапевтическая доза радиации составляет до 200 рад.
1000 рад — смертельная доза. Восставшая машина фигачила в беззащитных землян 20 000 рад.
Рассмотрим случай, когда поэтапное, но не согласованное внедрение улучшений софта привело к системной ошибке. К худшей в истории программной ошибке.
В Therac-25 аппаратная защита была убрана и функции безопасности были возложены на программное обеспечение.
Убийца
Therac-25 — аппарат лучевой терапии, медицинский ускоритель созданный канадской государственной организацией Atomic Energy of Canada Limited.
Убийство
С июня 1985 года по январь 1987 года этот аппарат стал причиной шести передозировок радиации, некоторые пациенты получили дозы в десятки тысяч рад. Как минимум двое умерли непосредственно от передозировок.
"Медсестра вспомнила, что в тот день она заменяла "x" на "e". Выяснилось, что, если сделать это достаточно быстро, переоблучение случалось практически со 100-процентной вероятностью."
Сотрудникам больниц нравилось, что компьютер настраивает всё быстрее, чем человек. Чем меньше времени уходило на настройку, тем больше пациентов можно было принять за день.
Когда пришло время сделать Therac-25, AECL решили оставить только компьютерное управление. Они отказались от устройств ручного управления и от аппаратных механизмов блокировки. Компьютер должен был следить за настройками устройства и, в случае обнаружения неполадок, должен был отключать питание всей машины.
Ну ну.
В программном обеспечении Therac-25 были найдены как минимум четыре ошибки, которые могли привести к переоблучению.
- Одна и та же переменная применялась как для анализа введённых чисел, так и для определения положения поворотного круга. Поэтому при быстром вводе данных через терминал Therac-25 мог иметь дело с неправильным положением поворотного круга (состояние гонки).
- Настройка положения отклоняющих магнитов занимает около 8 секунд. Если за это время параметры типа и мощности излучения были изменены, а курсор установлен на финальную позицию, то система не обнаруживала изменений.
- Деление на величину излучения, приводящее в некоторых случаях к ошибке деления на ноль и к соответствующему увеличению величины облучения до максимально возможной.
- Установка булевской переменной (однобайтовой) в значение "истина" производилось командой "x=x+1". Поэтому с вероятностью 1/256 при нажатии кнопки "Set" программа могла пропустить информацию о некорректном положении диска.
- Были выявлены потенциальные ошибки — в многозадачной операционной системе не было никакой синхронизации.
Тонкости расследования и последствий уже не так впечатляют, так что на JoyReactor им не место.
...а вот ссылочку на полную версию честно стыренного мной контента оставлю.
Что такое "безопасная радиация"? Определи ка аналоговым датчиком безопасную дозу когда источник константа, а пациентов в день много.
"Типичная разовая терапевтическая доза радиации составляет до 200 рад."
И не нужен аналоговый датчик, контролировать надо на прерывании выхода, в самом источнике, программно.
Ошибки, указанные в посте, были не в этом месте. Они были где угодно - в вычислениях, в алгоритме подготовке значения требуемого облучения, но не в том месте, где непосредственно шла команда runRadiationMotherFucker(value);
И вот перед этой сраной командой должно стоять if(value меньше 200.0), и тогда ни один человек бы не пострадал.
Помимо проверки на смертельную дозу, какого хуя вообще было предусмотрен такой жар рентгеном.
Кто виноват в смертях? Конечно же машина!
Почему if (isCrazyMurderingRobot = true) делает присваивание перед проверкой?
Но PVS-Studio вас спасёт: (видео снято в преддверии скорого выхода PVS-Studio for Linux).
Ho зачем столько рекламы?
Раст приде порядок наведе!
Так должны были сделать даже не из-за безопасности, а из соображений экономии. Бред какой-то.
Типичная доза радиации, машина херачила в 100 раз больше.
В машине тхерак аппаратная защита была убрана.
Ах да, мы забыли сказать, что вообще такое этот тхерак.
Так вот, этот аппарат убил несколько человек.
Медсестра в тот день заменила х на е. В какой ещё блять день, какая нахуй медсестра, Что означают эти буквы?
Так вот, снова вернёмся к аппарату. Бла-бла-бла, убрали аппаратный контроль.
Ну-ну. Карданы гну, блять.
В ПО найдены баги. Перечислим их.
А, так вот что это были за переменные х и е, которые мы зачем-то упомянули десять абзацев назад!
Правда, причём здесь медсестра и зачем она копалась в коде, мы так и не сообщим.
Что за хуйню я только что прочитал?