Ни самая сильная армия в мире, ни штат программистов, ни новейшее вооружение не помогут избежать смерти, если в дело вмешаются математика и невнимательный кодер! Американцы очень горько узнали об этом факте на своей коже.
Вечером 25 февраля 1991 года, уже к концу операции «Буря в пустыне», на американскую авиабазу в саудовском городе Дахран упала иракская ракета «Скад». И вот, казалось бы, какое отношение к этому имеет округление дробей?
Ракета разрушила здание квартирмейстерской службы армии США, отвечавшей за очистку воды. В результате взрыва погибло 28 человек, что составляет пятую часть всех погибших американцев на протяжении всей войны в Заливе. Еще около ста человек получили ранения.
«Скад» был обнаружен радаром батареи Пэтриот, которая охраняла авиабазу. Система засекла ракету… но ничего не смогла сделать. Пришлось лишь наблюдать, как она падает на здание.
Суть проблемы заключалась в простом баге, связанном с математикой. Разработчики и военные были в курсе этого, но считали, что это ничего особенного и не имеет значения.
Быстрое округление
Проблема заключалась в том, что внутренний таймер системы Пэтриот работал с интервалами времени длительностью 0,1 секунды. Чтобы перевести это значение в секунды, его нужно было разделить на 10. Разработчики предложили умножить его на 0,1.
В машинной арифметике деление часто заменяется умножением на обратное число, что упрощает работу вычислительных устройств и ускоряет их работу. Метод умножения на обратное число широко используется уже очень давно.
Еще одна часть этой математической загадки связана с использованием двоичных чисел. Точное представление десятичной дроби 0,1 в двоичной системе не существует — она может быть только приближенной.
Поэтому разработчики вместо десятичного значения 0,1 использовали двоичное число 0,00011001100110011001100, которое было немного меньше требуемого значения 0,1. Но они не обратили внимание на это и просто умножили все значения на это число.
Кодеры считали, что этот «лейкопластырь» сработает надежно. При вычислении параметров движения цели система работала с близкими значениями времени и небольшой систематической погрешностью. Поэтому все считали, что проблем не будет. Комплекс был принят на вооружение в таком виде в 1982 году.
Если вчера война
Позже Саддам Хусейн перестал быть таким уверенным и решил разделить свою «крутость» с остальным миром, захватив Кувейт летом 1990 года. У него было и оперативно-тактическое оружие, включая самодельные баллистические ракеты и химические вещества.
Это создало проблему. Было необходимо в кратчайшие сроки переделать системы Пэтриот для работы с баллистическими целями, движущимися со значительной скоростью — 1700 м/с и выше. Первоначальные версии Пэтриот были предназначены для более медленных целей. Но все эти задачи можно было решить с помощью обновлений программного обеспечения.
Компания Raytheon начала работу над улучшением системы. И тут произошло неожиданное: при добавлении нового кода, туловище (неясно, что это за организация) не внедрило его в некоторые части системы, где это было необходимо. Вместо этого остался старый расчет времени.
В результате в системе появились ДВА значения времени, используемых при разных расчетах. Разница между ними становилась больше с каждым часом работы системы.
Ситуация была замечена в Израиле, которое первым столкнулось с неожиданностями. Там проводились логи системы и было обнаружено, что при длительной работе значения времени начинают смещаться и целевая область также смещается. Но никто не принял меры, так как все считали, что это нормально. Ведь система работает корректно в тестовом режиме.
Если что-то работает…
В конце концов, система Пэтриот при слишком длительной работе перестала возвращать цели в режим обнаружения. Никто не ожидал этого и официально данная проблема не была признана. В результате комплекс просто перестал выполнять свою основную функцию — перехват баллистических ракет.
К сожалению, помощи от запасных накопителей с системными журналами не было. Это было связано со слухами о том, что софтину для систем Пэтриот кодируют клоуны, и накопители часто вызывают проблемы. Поэтому американские операторы систем Пэтриот на Ближнем Востоке обычно не использовали накопители. В отличие от этого, в израильской армии все сделано по инструкции.
Кто виноват?
Первые иракские ракеты «Скад» пошли на Израиль 18 января 1991 года. В то же время израильские офицеры имели возможность изучить записи системных журналов и обнаружить необъяснимое смещение параметров при смене режимов системы после нескольких часов непрерывной работы.
Иракские ракеты движутся очень быстро, и необходимо точно знать, где они будут в следующем такте работы. Позиция, на которую смотрит радар в режиме сопровождения цели, определяется опережающим расчетом, который зависит от значения времени. Но из-за ошибок в расчетах, связанных с двумя разными значениями времени, радар начал смотреть на пустое пространство, а не на цели.
Комплексы Пэтриот не работали корректно. Но эти проблемы вызвали подозрения только в Израиле. В времена войны американское начальство просто не обратило внимание на эту проблему. Формальное указание, что «систему не следует держать включенной слишком долго», не было в достаточном объеме пояснено.
И только утром 26 февраля они привезли патч, который, по идее, исправлял ошибку. Но в итоге для батареи «Альфа» оказалось уже слишком поздно.
Борьба с ошибками
Инцидент в Дахране стал уроком для многих разработчиков программных систем, чья некорректная работа может привести к катастрофе.
Во-первых, если ваш софт заработал, отдайте себе отчет в этом. Убедитесь, что ваши заплатки надежны.
Во-вторых, если ваша заплатка не вызывает проблем сейчас, нельзя быть уверенным, что так будет всегда. Думайте о режимах, в которых система может работать и о тех, которых она должна избегать.
И, наконец, когда вы изменяете работающую систему, проанализируйте ее работу и подумайте о том, как эти изменения скажутся на уже существующей функциональности.
Только тогда вы сможете избежать того, чтобы вас обвиняли в некомпетентности и безответственности, как в случае ошибок в программном обеспечении, которые могут провести черту под цивилизацией.
Sources: Warhead.su