На фото Последствия от попадания “скада”. Ни самые мощные вооруженные силы на планете, ни штат компьютерщиков, ни вооружение последнего поколения не защитят от гибели, если в дело вмешаются математические правила и нерадивый кодер! Американцы были вынуждены испытать это на личном опыте.
Вечером 25.02.1991 г. незадолго до завершения «Бури в пустыне» на авиационную базу ВВС США в Дахране упал иракский «Скад». На первый взгляд, округление дробей тут роли не играет.
«Скад» попал в казарму 475-го отряда квартирмейстерской службы американских вооруженных сил, в задачу которого входила очистка воды. В результате взрыва погибло 28 солдат – 20% потерь США за все время проведения кампании. Около 100 военнослужащих были ранены. Ракету засек локатор дежурной батареи ЗРК «Patriot», защищавшей Дахран. «Скад» обнаружили, но перехватить не смогли. Оставалось лишь смотреть, как она разрушает казарму. Как впоследствии оказалось, виновным в гибели 28 бойцов стало программное обеспечение ЗРК.
Роковая математическая неточность
Ошибка оказалась элементарной: программистам и военным она была известна, но ее игнорировали, считая несущественной. Внутренний таймер комплекса представляет собой счетчик численности промежутков времени, истекшего с момента активации ЗРК. Продолжительность подобного временного промежутка составляет 0,1 сек. Для перевода численности данных интервалов в секунды, ее, разумеется, необходимо поделить на 10.
С какой инициативой выступили программисты? Конечно, умножить на 0,1. В машинной математике деление нередко заменяли на умножение на обратное число. За счет этого было легче создавать вычислительные приспособления, и функционировали они шустрее.
Кстати, способ умножения на обратное число использовался еще в античном Вавилоне.
Потом следовала другая часть процесса кодирования. Дело в том, что числа представлены в двоичной системе. Точного выражения десятичной дроби 0,1 в двоичной форме нет – его можно сделать лишь примерным. В связи с этим сотрудники компании «Raytheon» число 0,1 решили представить как 0,00011001100110011001100. Данное число чуть меньше необходимой десятичной дроби – приблизительно на 0,0000001. На него и умножили, считая, что вопрос закрыт.
Кодеры не ошиблись, поступая подобным образом. В процессе вычисления характеристик движения цели «Patriot» пользуется приблизительными показателями времени с единой и крайне малой систематической погрешностью. Соответственно, сложностей возникнуть не должно. Ситуацию объявили нормальной для применения в боевой обстановке – и предали забвению. В подобном виде «Patriot» и поступил на вооружение в 1982 г.
Неудачное улучшение
Летом 1990 г. войска иракского лидера оккупировали Кувейт. В распоряжении армии Ирака находились оперативно-тактические ракеты, самостоятельно улучшенные, а также химическое оружие. Все это несло нешуточную угрозу. Необходимо было быстро модернизировать ЗРК «Пэтриот» для Ближнего Востока, чтобы тот сумел перехватить баллистические ракеты, движущиеся на скорости 1700 м/с и выше. Корпорация-производитель стала срочно совершенствовать комплекс. Однако результат оказался прямо противоположным ожидаемому – система стала хуже.
Некий «мастер» в кодировке додумался устранить ошибку с неточным преобразованием 0,1 в двоичную систему и написал новый алгоритм умножения. Все бы хорошо, поскольку погрешность получилось уменьшить, но горе-кодер установил вызов данного алгоритма не в каждом случае, когда это было необходимо. Местами сохранился прежний расчет времени.
Иначе говоря, в софте появилось 2 внутренних показателя времени, применяемых при вычислении различных характеристик. Чем дольше «Patriot» работал, тем ощутимее становилась разница. Но проблеме не уделяли должного внимания. Первой на данном вопросе зациклилась не Америка, а Израиль.
Какой дурак до такого додумался?
Первые «Скады» Ирак запустил по еврейскому государству 18.01.1991 г. Офицеры израильской армии не поленились изучить «логи». Уже 11.02.1991 г. они направили в Америку первый отчет, содержавший сведения о наличии ошибки: после нескольких часов бесперебойного функционирования комплекса наблюдается непонятное расхождение параметров во время перехода от режима выявления цели к ее сопровождению. Локатор при функционировании в режиме «на сопровождение» нацелен на определенную неширокую зону пространства, где должна находиться цель – т.н. «Рейндж Гейт Эриа» (RGA).
Скорость полета вышеупомянутой иракской ракеты является гиперзвуковой. Необходимо четко знать, где окажется «Скад» на дальнейшем такте функционирования.
Позиция РГА вычисляется расчетом на опережение в зависимости от координат и быстроты перемещения цели. Данная математика имеет непосредственную связь с точным отсчетом времени. Вот здесь-то и скрывалась опасность, поскольку по вышеуказанным причинам ни о какой точности не могло идти и речи.
Час от часу расхождение во времени становилось все больше. Офицеры в Израиле обнаружили, что границы окна, установленные по неправильному времени, стали съезжать. Цель находилась уже не по центру «РГА», а ближе к краю. За 8 ч она сползала примерно на 20% в сторону от центра. Подсчитали и поняли, что спустя 20 ч бесперебойного функционирования цель покинет границы RGA, и тогда «Patriot» вообще не сможет захватывать цели на сопровождение, даже обнаружив их. Соответственно, комплекс потеряет возможность их сбить в полете.
Но руководство американской армии к отчету израильских военных отнеслось без должной ответственности. Понадеялись на русский «авось».
Следует сказать, что ПО системы «Пэтриот» за время, начиная с осени 1990 г., исправляли целых 6 раз. Причем в авральном порядке: требовалось научить комплекс бороться с иракскими «Аль-Хусейнами» и «Скадами». Какое-то глупое расхождение во времени никого не беспокоило. Вдобавок установка патча длилась не меньше 2 ч, в течение которых ЗРК превращался в обычную груду металлолома. Для чего это нужно, когда идут активные боевые действия?
Однако 16.02.1991 г. патч все же написали и стали постепенно устанавливать его на «Patriot». Через 5 дней после этого военное руководство, интуитивно предчувствуя надвигающуюся катастрофу, дополнительно отправило инструкцию для операторов «Patriot». Она включала единственную фразу, рекомендующую не держать ЗРК в рабочем состоянии чересчур длительное время, иначе возникнут сложности с перехватом цели. Конкретного допустимого периода бесперебойной работы не указали. …
У дежурной батареи «Альфа», относящейся к батальону, что защищал авиационную базу в Дахране, на вечер 25.02.1991 г. «Patriot» функционировал больше 96 ч. За данный срок разница во времени достигла 0,343 сек.
Для баллистической ракеты она означала смещение центральной части «Range Gate Area» почти на 0,7 км относительно действительного местонахождения «Скада». И это при размере самого РГА примерно 0,3 км.
Другими словами, собственное ПО вынуждало локатор нацеливаться в стопроцентную пустоту, и перехват отслеживаемой в режиме обзора цели не осуществлялся.
Таковы причины трагедии, унесшей жизни 28 человек. На следующее утро в Дахран прибыли ничего не знающие о случившемся офицеры, доставившие…патч, устраняющий баг.