Цена ошибки (в коде)
Из учебного пособия А.С. Камкина "Введение в формальные методы верификации программ"
В 1982 г. канадской фирмой Atomic Energy of Canada Limited был запущен в серию
медицинский аппарат «Therac-25», предназначенный для лучевой терапии — облучения раковой опухоли. В «редких» ситуациях из-за ряда ошибок, допущенных при
проектировании и реализации встроенной системы управления, интенсивность облучения возрастала на 2 порядка и более. За время эксплуатации прибора (период
с июня 1985 г. по январь 1987 г.) как минимум два пациента умерли, а несколько
человек остались инвалидами...
23 марта 2003 г. во время войны в Ираке американский зенитно-ракетный комплекс
«Patriot» ошибочно идентифицировал британский бомбардировщик «Tornado», летевший близ кувейтской границы, как приближающуюся вражескую ракету и автоматически произвел залп. Погибли два пилота. Спустя полторы недели, 2 апреля,
«дружественным огнем» был уничтожен американский палубный истребитель-бомбардировщик F/A-18 «Hornet». Еще один пилот погиб.
Про тот же "Патриот"
11 февраля 1991 года Patriot Project Office получил израильские данные о дефекте в ракетной системе Patriot. Они нашли, что, если система работает 8 часов, она начинает мазать на 20%. Они прикинули, что после 20 часов работы система начинает промахиваться настолько, что перестанет быть способной захватывать, отслеживать и поражать баллистические ракеты. Американские военные не приняли во внимание всю важность открытия, заявив, что система предназначена для портативных и краткосрочных защитных операций и что никто никогда не будет использовать систему больше 8 часов.
16 февраля был выпущен Bug Fix, но, чтобы его внедрить во все единицы боевой техники, требовалось время, ибо война.
21 февраля военные выпускают указание, что система не должна работать "долго". Военные не уточнили сколько длится "долго".
25 февраля в Дахране (Саудовская Аравия) в казарму в гости к американцам прилетела баллистичекая ракета "керосинка" (она же Р-17, она же Scud). 28 убито 96 ранено, потому что ЗРК "Патриот" промахнулся из-за программной ошибки.
В программном обеспечении, отвечающем за ведение цели, присутствовал баг, из-за которого со временем внутренние часы постепенно отходили от истинного значения времени.
Системное время хранилось как integer в 24-битном регистре с точностью до одной десятой секунды. Поэтому на каждом такте по 0.1 сек "терялась" часть времени. При рассчете данные переводились в real numbers.