Зрк пэтриот ошибка в программе

Обновлено: 08.07.2024

Февраль 1991 года, американские войска уже победоносно завершают операцию "Буря в пустыне", за всё время боевых действий в которой погибло всего лишь чуть более 100 военнослужащих.

Но 25 февраля удар по американской казарме баллистической ракеты "Скад" унесет еще 28 жизней, несмотря на современную систему противоракетной обороны на основе ЗРК "Пэтриот", накрывавшей непрозрачным "зонтиком" силы группировки.

Как оказалось, жизни американских военных забрала обычная ошибка в округлении, на которую программисты при разработке программного обеспечения к ЗРК попросту наплевали. Она заключалась вот в чём:

У "Пэтриот" был свой внутренний таймер, который отсчитывал время с запуска комплекса. Таймер - дискретный с величиной интервала - 0,1 секунда. Машина - на то и машина, что работает с двоичным кодом. Но как представить в двоичной системе число 0,1 ? Дело в том, что идеально точно это сделать невозможно!

Десятичные дроби переводят при помощи последовательного умножения на новое основание. Рассмотрим на примере.

Всё дело в коварной "единице", ведь, например, число 0,5 можно перевести в двоичную систему точно - это будет 0,1. Всё дело в коварной "единице", ведь, например, число 0,5 можно перевести в двоичную систему точно - это будет 0,1.

Теперь давайте сделаем то, что сделали американские программисты, а именно для внутренних целей умножим число тактов на 10, чтобы получить секундный формат, который можно точно переводить между системами исчисления.

В десятичной системе 0,1*10 будет 1. А теперь умножим в двоичной системе : 0,000110 * 1010 = 0000.111100 (можете проверить на калькуляторе), что равняется 0,9375 в десятичной! Естественно, чем больше мы возьмем разрядов для представления 0,1 в двоичной системе, тем меньше будет погрешность.

Вот и американцы успокоились, когда в ПО под таймер отдали 24-битную последовательность, не учитывая, что это будет каждый раз давать накапливающуюся ошибку в 0,00000001 секунды!

Их расчет был таким: по своему предназначению ЗРК "Пэтриот" был мобильным комплексом, а длительность его непрерывного боевого применения исчислялась часами.

Принцип работы ЗРК в любом случае основывается на экстраполяции положения цели в следующий момент времени и перемещении "невидимого ока" вслед за ней. Что же происходит, когда внутренние часы, участвующие в расчетах, идут не так? А то, что ЗРК просто не видит цель, так как "смотрит" не туда!

В случае с ударом по американской казарме, ошибка по времени составляла 0,343 секунды, что означало, что "око" смотрит в сторону от ракетной цели в среднем на 700 метров! Неудивительно, что ЗРК проворонил СКАД! Спасибо за внимание!

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

0445_Patriot_ru/image1.jpg

11 февраля 1991 года Patriot Project Office получил израильские данные о дефекте в ракетной системе Patriot. Они нашли, что, если система работает 8 часов, она начинает мазать на 20%. Они прикинули, что после 20 часов работы система начинает промахиваться настолько, что перестанет быть способной захватывать, отслеживать и поражать баллистические ракеты. Американские военные не приняли во внимание всю важность открытия, заявив, что система предназначена для портативных и краткосрочных защитных операций и что никто никогда не будет использовать систему больше 8 часов.

16 февраля был выпущен Bug Fix, но, чтобы его внедрить во все единицы боевой техники, требовалось время, ибо война.

21 февраля военные выпускают указание, что система не должна работать "долго". Военные не уточнили сколько длится "долго".

25 февраля в Дахране (Саудовская Аравия) в казарму в гости к американцам прилетела баллистичекая ракета "керосинка" (она же Р-17, она же Scud). 28 убито 96 ранено, потому что ЗРК "Патриот" промахнулся из-за программной ошибки.

26 февраля Bug Fix был доставлен в Дахран.

0445_Patriot_ru/image2.jpg

0445_Patriot_ru/image4.jpg

Р-17 (по классификации МО США и НАТО — SS-1c Scud B, экспортное обозначение R-300, неофициально — "керосинка") — советская жидкостная одноступенчатая баллистическая ракета на долгохранимых компонентах топлива.

0445_Patriot_ru/image5.jpg

0445_Patriot_ru/image6.jpg

Военные осматривают ракету типа Р-17 сбитую в пустыне ЗРК MIM-104 "Патриот" во время операции Desert Storm

MIM-104 "Патриот" (англ. MIM-104 Patriot, перевод с английского — Патриот) — американский зенитный ракетный комплекс (ЗРК), используемый армией США и их союзниками.

0445_Patriot_ru/image7.jpg

0445_Patriot_ru/image9.jpg

0445_Patriot_ru/image10.jpg

A detailed view of an AN/MPQ-53 radar set. The circular pattern on the front of the vertical component is the system's main phased array, consisting of over 5,000 individual elements, each about 39 millimeters (1.535 in) diameter.

0445_Patriot_ru/image11.jpg

PAC-3 missile launcher, note four missiles in each canister

В программном обеспечении, отвечающем за ведение цели, присутствовал баг, из-за которого со временем внутренние часы постепенно отходили от истинного значения времени.

Системное время хранилось как integer в 24-битном регистре с точностью до одной десятой секунды. Поэтому на каждом такте по 0.1 сек "терялась" часть времени. При расчете данные переводились в real numbers.

Число 1/10 равно 1/24+1/25+1/28+1/29+1/212+1/213+. Другими словами, бинарное разложение 1/10 = 0.0001100110011001100110011001100. Поэтому 24 bit регистр в системе Patriot хранил вместо этого 0.00011001100110011001100 внося ошибку равную 0.0000000000000000000000011001100. в двоичном исчислении, или примерно 0.000000095 в десятичном. За сто часов работы набегает 0.000000095×100×60×60×10=0.34 секунды

"Керосинка" летит со скоростью 1676 метров в секунду, и проходит за 0.34 секунды больше полукилометра. Этого больше чем достаточно, чтоб прошмыгнуть радиус поражения Патриотов. Забавно, что кривое вычисление времени пофиксили в некоторых частях программы, но не во всех.

Софт был написан на ассемблере 15-20 лет назад и с тех пор несколько раз модифицировался различными командами программистов.

Несколько слайдов из отчета, где выявляется проблемы с системой Patriot:

0445_Patriot_ru/image12.jpg

0445_Patriot_ru/image14.jpg

0445_Patriot_ru/image16.jpg

  • Правильно подбирайте размер. Всегда тщательно перепроверяйте, сколько бит вам требуется для хранения каждой переменной выбрать (long, int, double, float, и пр) в конкретном языке и конкретной операционной системе.
  • Используйте целые числа вместо float где только возможно. Храните деньги в центах, а не долларах. Если все же необходимо использовать float, используйте двойную точность.
  • Никогда не используйте float в качестве счетчика цикла.
  • Избегайте смешанных типов (signed, unsigned; integer, floating point; single precision, double precision). Тщательно производите конвертацию.
  • Проверяйте возможные ситуации переполнения. Проверяйте деление на ноль.

Читать еще про Patriot

Заключение

Мы хотим привлечь внимание людей к проблемам надежности программного обеспечения. Программы — это давно не только странные непонятные расчёты ученых на Fortran или компьютерные игры. Это то, что давно и повсеместно нас окружает.

Иракские военные запустили в сторону американских солдат модернизированную ракету Р-17, перехват должен был обеспечить ЗРК «Пэтриот». Противоракетная система начала отслеживать и вести цель, а «рожденная в СССР» тем временем стремительно приближалась. Это происходило в феврале 1991 года — очередной этап войны в Персидском заливе подходил к концу. «Пэтриот» уже использовался некоторое время, однако именно произошедший инцидент принес ему широкую известность и «славу». Правда, от нее американские военные с радостью бы отказались.

Тот запуск Эль-Хусейна (так называли модернизированную версию ракеты) стал, вероятно, самым успешным в истории конфликта: он привел к одномоментной гибели 28 американцев, десятки получили ранения (разные источники указывают цифры в диапазоне от 50 до 100 человек). Дело было не только в эффективности иракской ракеты, но и в ошибке в программном обеспечении системы наведения «Пэтриота».

В чем состояла эта ошибка? Существует сугубо техническое описание того, что происходило в «мозгах» дорогостоящего ЗРК, который работал по технологиям 70-х годов. А если говорить простым языком, CPU постоянно отсчитывал время с момента включения системы, что требовалось для расчета траектории полета ракеты в случае обнаружения цели.


Числа хранились в 24-битном регистре, что снижало точность в случае с дробями: записать (точнее, отсчитать) корректно 0,1 секунды в этом виде невозможно из-за ограничений на количество «ячеек». Это приводило к постепенной «потере» времени — 0,003433 секунды в час. Ничтожно мало? Для бредущего пешехода — да. А вот ракета за это время проделывает весьма длинный путь, и все расчеты компьютера о нахождении цели улетали в трубу.

Как итог: «Пэтриот» за миллион долларов дает промах в 500 метров, а Scud-B (Р-17) поражает бараки с американскими служащими.


Военные знали о существовании проблемы, но по определенным причинам игнорировали ее. Может, потому, что она проявляла себя не сразу — критическая масса ошибочных данных накапливалась постепенно: чем больше ЗРК находился в активной фазе, тем выше становилась погрешность. И этот баг имелся во всех американских ЗРК, размещенных в регионе.


Для управляющих систем готовили патч (третий по счету, по другим данным, их было шесть), который был уже запланирован к установке. Дата, правда, оказалась более поздней, чем произошел трагический инцидент. Не успели, о чем после сообщалось в отчете комиссии Счетной палаты США.

Сыграло роль, видимо, и то, что в состоянии боеготовности «Пэтриоты» обычно находились недолго, а в описываемом случае — более 100 часов. Примерно за неделю или две до произошедшего израильские вооруженные силы сообщили американским коллегам о найденном баге: они рассказали о серьезном — на 20% — снижении точности «мегашотгана» после восьми часов его работы. При том, что для поражения вражеской боеголовки ракете «Пэтриот» нужно было находиться в радиусе 5—10 метров от нее (после чего в дело вступала «шрапнель»), это много.


Особого значения информации не придали, следовать рекомендации «не держать систему в боеготовности долго», регулярно перезагружая ее, также не стали. Да и данные преподносились хитро: что значит «долго» или «недолго», не уточнялось.

И 25 февраля 1991 года баллистическая ракета бьет по американской военной базе.

Видео: предположительно, работа ЗРК «Пэтриот» против Scud.

Официальные лица озвучили несколько версий. В ранней, которая появилась спустя пару дней, утверждалось, что «Пэтриот» неверно оценил состояние Р-17, посчитав, что ракета разрушилась еще в верхней точке траектории — радарная система перестала считать ее угрозой, и запуск не состоялся.

Затем чиновники отказались от этих слов.


Спустя четыре месяца после инцидента появилась вторая версия: «произошедшее стало полной неожиданностью и „аномалией“ на фоне тестирования длительностью в тысячи часов». Как-то эксперт в области встраиваемых систем Майкл Барр в шутку написал: «Я представил, как могла выглядеть программа испытаний. Шаг 1. Включить „Пэтриот“. Шаг 2. Проверить, все ли идеально. Шаг 3. Поразить имитацию врага». Позже его слова некоторые ресурсы приняли за чистую монету и в чуть измененном виде начали тиражировать как выдержки из реальной документации.

Но и эта версия противоречила «менее официальным» данным из рапорта израильских военных, который упоминался выше. Кроме того, это заявление косвенно ставил под сомнение и отчет Счетной палаты США. Согласно документу, перед отправкой в зону военных действий в ПО «Пэтриотов» вносились срочные изменения: «скады» перемещались на скорости примерно в 2,5 раза выше, чем цели, для перехвата которых конструировались американские ЗРК. Высказывается мнение, что времени на полноценную проверку просто не было.


«„Пэтриоты“ были одновременно огромным успехом и громким провалом. Лучше они, чем ничего», — сказал один из израильских солдат, принимавших участие в той войне. Однако он признает, что «было страшно», указывая на положительный момент: Израиль начал собственные программы по разработке защитных систем.

Ракеты Р-17, в свою очередь, несмотря на разрушительную мощь, особенной эффективностью не отличались: во время применения этих ракет в войне в Персидском заливе от них погибло всего несколько человек (но сотни получили травмы, в том числе серьезные). От этого промах «Пэтриота» выглядит еще трагичнее.

Всего же за время конфликта для перехвата 47 «рудиментарных» Р-17 (так их называла американская пресса) было запущено 158 ракет из ЗРК «Пэтриот». Тогда высказывались предположения, что американская система перехвата нанесла примерно такой же урон, что и уничтоженные ею «скады», если не больше. Были вопросы и к точности: по телевизору говорили о 80—95%, в реальности было иначе.

Впрочем, «Пэтриоты» подвергались критике регулярно, в том числе из-за огромных затрат на разработку системы. В компании Raytheon, которая и являлась разработчиком, считали свое детище эффективным средством, аналогичного мнения придерживались высшие военные чины. Правда, это уже другая история.


Что касается Raytheon, еще примерно за месяц до инцидента ее обхаживали со всех сторон, нахваливая за «Пэтриота» («это супервысокотехнологичное оружие», говорили в прессе, «поражает 9 из 10 „скадов“ (десятая сама упала в море)») и предлагая отпраздновать огромный контракт от Пентагона: одна единица ЗРК со всем оборудованием стоила $50—55 млн ($95—105 млн с учетом инфляции).

А летом 1991 года те же издания писали об увольнении 700 сотрудников — от восторгов не осталось и следа. Было ли это связано с произошедшими событиями, не уточнялось. Впрочем, сейчас компания чувствует себя весьма неплохо.

6 сентября 1989 года 41 тыс. парижан, нарушивших правила дорожного движения, пришли извещения о том, что ими были совершены убийства и грабежи. Граждан также обвиняли в вымогательствах, организованной проституции, незаконном обороте наркотиков и сексуальных девиациях. Вскоре ситуация разрешилась. Власти выпустили заявление, в котором объяснили эти письма ошибкой, возникшей в компьютерной системе суда.

123

«Черный понедельник»

19 октября 1987 года индекс Доу-Джонса упал на исторически рекордное значение — 22,6%. Американский фондовый рынок потерпел крах, крупнейшие компании лишились миллиардов долларов. Взрывной волной накрыло также Австралию, Гонконг, Великобританию и Канаду, чьи фондовые биржи потеряли от 20% до 50%.

123

Фото: Getty Images/ Pete Williams/Consolidated News Picture

Ошибка Patriot

Причиной послужила ошибка в ПО. Каждые 100 часов бесперебойной работы системные часы отклонялись на 0,34 секунды. За это время ракеты способны преодолеть расстояние до 500 м. Как следствие, образовалась погрешность, стоившая жизни 28 американским солдатам.

Поплатиться за неправильное деление

Профессор математики Томас Найсли обнаружил в новом процессоре Intel Pentium сравнительно незначительную ошибку при делении. Погрешность составляла 0,006%, и, по словам руководства компании, обычный пользователь мог бы столкнуться с ней не чаще, чем «раз в 27 тыс. лет». Однако история была растиражирована, и директорам Intel пришлось искать решение. Они отмечали, что с лета 1994 года ошибка в процессорах была исправлена. Но определить точное количество дефектных устройств компания не смогла, поэтому в конце концов она была вынуждена менять процессоры Pentium по требованию клиентов. Желающих получить абсолютно исправную версию оказалось гораздо больше, чем рассчитывали руководители компании. В итоге Intel потеряла на замене процессоров порядка $475 млн.

Переоблучить по ошибке

Многие пациенты получали радиационные ожоги. Облучение в 1 тыс. рад считается смертельным. Людям же, подвергавшимся лечению Therac-25, доставалось 8 тыс., 15 тыс. и даже 20 тыс. рад. Впоследствии область на месте ожогов опухала. У одних пациентов части тела оказывались парализованы, другие пациенты сталкивались с риском ампутации. После тщательного расследования эксперты обнаружили минимум четыре ошибки в ПО, которые могли привести к переоблучению.

123

Неудавшаяся миссия на Марс

Автоматическая межпланетная станция «Фобос-Грунт» была запущена в ночь на 9 ноября 2011 года. Аппарат должен был добраться до Фобоса, спутника Марса, взять образцы грунта и вернуть их на Землю в специальной капсуле. Но спустя некоторое время после запуска маршевая двигательная установка станции не включилась, поэтому аппарат не смог выйти на траекторию перелета к Марсу. Таким образом «Фобос-Грунт» застрял на околоземной орбите. Там он пробыл до 15 января 2012 года, пока не сгорел в плотных слоях атмосферы.

Эксперты называют несколько причин катастрофы, и одна из них — ошибка программистов, писавших ПО. Стоимость миссии оценивалась в 5 млрд рублей, строительство самого аппарата обошлось в 1,2 млрд рублей.

Спасти миллионы благодаря орфографической ошибке

Иногда ошибки в ПО играют на руку пострадавшей стороне. В феврале 2016 года хакеры взломали систему ЦБ Бангладеш и украли $81 млн. Сумма могла быть куда выше, не допусти они орфографической ошибки в названии адресата. $81 млн был украден четырьмя траншами. Пятый в размере $20 млн был приостановлен сотрудником Федерального резервного банка, через который проходили переводы. Он обнаружил, что в запросе вместо слова foundation было написано fandation. Специалисты, занимавшиеся переводом средств, решили обратиться в ЦБ Бангладеш за разъяснениями. Благодаря их действиям удалось избежать дальнейшей утечки денег. В общей сложности хакеры рассчитывали украсть $850 млн. Спустя несколько месяцев ЦБ Бангладеш смог вернуть часть средств: из $81 млн руководству банка удалось заполучить лишь $15 млн.

Читайте также: