Зрк пэтриот ошибка в программе
В этой статье будет затронут вопрос надёжности встраиваемого программного обеспечения, используемого в военной технике.
11 февраля 1991 года Patriot Project Office получил израильские данные о дефекте в ракетной системе Patriot. Они нашли, что, если система работает 8 часов, она начинает мазать на 20%. Они прикинули, что после 20 часов работы система начинает промахиваться настолько, что перестанет быть способной захватывать, отслеживать и поражать баллистические ракеты. Американские военные не приняли во внимание всю важность открытия, заявив, что система предназначена для портативных и краткосрочных защитных операций и что никто никогда не будет использовать систему больше 8 часов.
16 февраля был выпущен Bug Fix, но, чтобы его внедрить во все единицы боевой техники, требовалось время, ибо война.
21 февраля военные выпускают указание, что система не должна работать "долго". Военные не уточнили сколько длится "долго".
25 февраля в Дахране (Саудовская Аравия) в казарму в гости к американцам прилетела баллистичекая ракета "керосинка" (она же Р-17, она же Scud). 28 убито 96 ранено, потому что ЗРК "Патриот" промахнулся из-за программной ошибки.
26 февраля Bug Fix был доставлен в Дахран.
Р-17 (по классификации МО США и НАТО — SS-1c Scud B, экспортное обозначение R-300, неофициально — "керосинка") — советская жидкостная одноступенчатая баллистическая ракета на долгохранимых компонентах топлива.
Военные осматривают ракету типа Р-17 сбитую в пустыне ЗРК MIM-104 "Патриот" во время операции Desert Storm
MIM-104 "Патриот" (англ. MIM-104 Patriot, перевод с английского — Патриот) — американский зенитный ракетный комплекс (ЗРК), используемый армией США и их союзниками.
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.
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:
Мы хотим привлечь внимание людей к проблемам надежности программного обеспечения. Программы — это давно не только странные непонятные расчёты ученых на Fortran или компьютерные игры. Это то, что давно и повсеместно нас окружает.
Подробнее
1 TiK*«m>'0'*rA»o»0«M
Figure 5: Incorrectly Calculated Range Gate 3. Track Action - Only Range Gated Portion of Beam Processed
к P Г . - if* ; ■ » < . rim шш f fe yv 1 ОШ1 * Ш1 ЙГг / 1 I. V;»' >А» г ¿U* I» “ -GJE 4^ • ■• • — -, a i ^ ч__ *
Acquire. Search all of radar volume Validate. Detection received narrow search volume to establish a range gate. Track. Only established range gate area processed Patriot Operational Cycle TBM
Patriot Range Gate ■ Computer constraints - Patriot ECS performs calculations in floating point - Registers(4) are only 24 bits long • Therefore conversion of time from an integer to real is precise to only 24 bits 24 - [0.1T] is non-terminating in binary —*■ infinite number of bits to represent - Therefore [0.1] 2/24 = 0.1T (1- 2 20) - Or [T] 2/24 (fp) = T - 6(T) . ON PAPER A PROBLEM
Patriot Range Gate ■ A naive analysis would indicate following RGA errors Hours Seconds Calculated Time (sec) Inaccuracy (sec) Approximate Shift In RGA (m) 0 0 0 0 0 1 3600 3599.9966 0.0034 7 8 28800 28799.9725 0.0025 55 20(a) 72000 71999.9313 0.0687 137 48 172800 172799.8352 0.1648 330 72 259200 259199.7528 0.2472 494 100(b) 360000 359999.6667 0.3433 687 a. Continuous operation exceeding about 20 hours-target outside range gate b. AJpha Battery ran continuously for about 100 hours ■ But actually we use 5(T) Next relative to 5(T) Now for RGA ■ Therefore negligible errors
программирование,военная техника,Patriot,ошибки,баги,длиннопост,песочница,удалённое
11 февраля 1991 года Patriot Project Office получил израильские данные о дефекте в ракетной системе Patriot. Они нашли, что если система работает 8 часов, она начинает мазать на 20%. Они прикинули, что после 20 часов работы система начинает промахиваться настолько, что перестанет быть способной захватывать, отслеживать и поражать баллистические ракеты. Американские военные не приняли во внимание всю важность открытия, заявив, что система предназначена для портативных и краткосрочных защитных операций и что никто никогда не будет использовать систему больше 8 часов.
16 февраля был выпущен Bug Fix, но чтобы его внедрить во все единицы боевой техники, требовалось время, ибо война.
21 февраля военные выпускают указание, что система не должна работать «долго». Военные не уточнили сколько длится «долго».
25 февраля в Дахране (Саудовская Аравия) в казарму в гости к американцам прилетела баллистичекая ракета "керосинка" (она же Р-17, она же Scud). 28 убито 96 ранено, потому что ЗРК «Патриот» промахнулся из-за программной ошибки.
26 февраля Bug Fix был доставлен в Дахран.
Р-17 (по классификации МО США и НАТО — SS-1c Scud B, экспортное обозначение R-300, неофициально — «керосинка») — советская жидкостная одноступенчатая баллистическая ракета на долгохранимых компонентах топлива.
Военные осматривают ракету типа Р-17 сбитую в пустыне ЗРК MIM-104 «Патриот» во время операции Desert Storm
MIM-104 «Патриот» (англ. MIM-104 Patriot, перевод с английского — Патриот) — американский зенитный ракетный комплекс (ЗРК), используемый армией США и их союзниками.
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.
PAC-3 missile launcher, note four missiles in each canister
В программном обеспечении, отвечающем за ведение цели, присутствовал баг, из-за которого со временем внутренние часы постепенно отходили от истинного значения времени.
Системное время хранилось как integer в 24-битном регистре с точностью до одной десятой секунды. Поэтому на каждом такте по 0.1 сек «терялась» часть времени. При рассчете данные переводились в real numbers.
[источник]
Число 1/10 равно 1/2 4 +1/2 5 +1/2 8 +1/2 9 +1/2 12 +1/2 13 +… Другими словами, бинарное разложение 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:
Золотые правила
- Правильно подбирайте размер. Всегда тщательно перепроверяйте, сколько бит вам требуется для хранения каждой переменной выбрать (long, int, double, float, и пр) в конкретном языке и конкретной операционной системе.
- Используйте целые числа вместо float где только возможно. Храните деньги в центах, а не долларах (а лучше в сатоси). Если все же необходимо использовать float, используйте двойную точность.
- Никогда не используйте float в качестве счетчика цикла.
- Избегайте смешанных типов (signed, unsigned; integer, floating point; single precision, double precision). Тщательно производите конвертацию.
- Проверяйте возможные ситуации переполнения. Проверяйте деление на ноль.
Читать еще про Patriot
-
бага на hackernews
- New York Times: AFTER THE WAR; Army Is Blaming Patriot's Computer For Failure to Stop the Dhahran Scud
- Software Bug Report: Patriot Missile Software Problem
Заключение
Мы хотим привлечь внимание людей к проблемам надежности программного обеспечения. Программы — это давно не только странные непонятные расчёты ученых на Fortran или компьютерные игры. Это то, что давно и повсеместно нас окружает.
Продолжаем цикл статей, посвященных важности качества программного кода в системах, отказ работоспособности которых приводит к огромным денежным тратам или человеческим жертвам. В этот раз будет затронут вопрос надёжности встраиваемого программного обеспечения, используемого в военной технике.
11 февраля 1991 года Patriot Project Office получил израильские данные о дефекте в ракетной системе Patriot. Они нашли, что, если система работает 8 часов, она начинает мазать на 20%. Они прикинули, что после 20 часов работы система начинает промахиваться настолько, что перестанет быть способной захватывать, отслеживать и поражать баллистические ракеты. Американские военные не приняли во внимание всю важность открытия, заявив, что система предназначена для портативных и краткосрочных защитных операций и что никто никогда не будет использовать систему больше 8 часов.
16 февраля был выпущен Bug Fix, но, чтобы его внедрить во все единицы боевой техники, требовалось время, ибо война.
21 февраля военные выпускают указание, что система не должна работать "долго". Военные не уточнили сколько длится "долго".
25 февраля в Дахране (Саудовская Аравия) в казарму в гости к американцам прилетела баллистичекая ракета "керосинка" (она же Р-17, она же Scud). 28 убито 96 ранено, потому что ЗРК "Патриот" промахнулся из-за программной ошибки.
26 февраля Bug Fix был доставлен в Дахран.
Р-17 (по классификации МО США и НАТО — SS-1c Scud B, экспортное обозначение R-300, неофициально — "керосинка") — советская жидкостная одноступенчатая баллистическая ракета на долгохранимых компонентах топлива.
Военные осматривают ракету типа Р-17 сбитую в пустыне ЗРК MIM-104 "Патриот" во время операции Desert Storm
MIM-104 "Патриот" (англ. MIM-104 Patriot, перевод с английского — Патриот) — американский зенитный ракетный комплекс (ЗРК), используемый армией США и их союзниками.
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.
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:
- Правильно подбирайте размер. Всегда тщательно перепроверяйте, сколько бит вам требуется для хранения каждой переменной выбрать (long, int, double, float, и пр) в конкретном языке и конкретной операционной системе.
- Используйте целые числа вместо float где только возможно. Храните деньги в центах, а не долларах. Если все же необходимо использовать float, используйте двойную точность.
- Никогда не используйте float в качестве счетчика цикла.
- Избегайте смешанных типов (signed, unsigned; integer, floating point; single precision, double precision). Тщательно производите конвертацию.
- Проверяйте возможные ситуации переполнения. Проверяйте деление на ноль.
Читать еще про Patriot
Заключение
Мы хотим привлечь внимание людей к проблемам надежности программного обеспечения. Программы — это давно не только странные непонятные расчёты ученых на Fortran или компьютерные игры. Это то, что давно и повсеместно нас окружает.
В этой статье будет затронут вопрос надёжности встраиваемого программного обеспечения, используемого в военной технике.
11 февраля 1991 года Patriot Project Office получил израильские данные о дефекте в ракетной системе Patriot. Они нашли, что, если система работает 8 часов, она начинает мазать на 20%. Они прикинули, что после 20 часов работы система начинает промахиваться настолько, что перестанет быть способной захватывать, отслеживать и поражать баллистические ракеты. Американские военные не приняли во внимание всю важность открытия, заявив, что система предназначена для портативных и краткосрочных защитных операций и что никто никогда не будет использовать систему больше 8 часов.
16 февраля был выпущен Bug Fix, но, чтобы его внедрить во все единицы боевой техники, требовалось время, ибо война.
21 февраля военные выпускают указание, что система не должна работать "долго". Военные не уточнили сколько длится "долго".
25 февраля в Дахране (Саудовская Аравия) в казарму в гости к американцам прилетела баллистичекая ракета "керосинка" (она же Р-17, она же Scud). 28 убито 96 ранено, потому что ЗРК "Патриот" промахнулся из-за программной ошибки.
26 февраля Bug Fix был доставлен в Дахран.
Р-17 (по классификации МО США и НАТО — SS-1c Scud B, экспортное обозначение R-300, неофициально — "керосинка") — советская жидкостная одноступенчатая баллистическая ракета на долгохранимых компонентах топлива.
MIM-104 "Патриот" (англ. MIM-104 Patriot, перевод с английского — Патриот) — американский зенитный ракетный комплекс (ЗРК), используемый армией США и их союзниками.
В программном обеспечении, отвечающем за ведение цели, присутствовал баг, из-за которого со временем внутренние часы постепенно отходили от истинного значения времени.
Системное время хранилось как 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:
-Правильно подбирайте размер. Всегда тщательно перепроверяйте, сколько бит вам требуется для хранения каждой переменной выбрать (long, int, double, float, и пр) в конкретном языке и конкретной операционной системе.
-Используйте целые числа вместо float где только возможно. Храните деньги в центах, а не долларах. Если все же необходимо использовать float, используйте двойную точность.
-Никогда не используйте float в качестве счетчика цикла.
-Избегайте смешанных типов (signed, unsigned; integer, floating point; single precision, double precision). Тщательно производите конвертацию.
-Проверяйте возможные ситуации переполнения. Проверяйте деление на ноль.
Мы хотим привлечь внимание людей к проблемам надежности программного обеспечения. Программы — это давно не только странные непонятные расчёты ученых на Fortran или компьютерные игры. Это то, что давно и повсеместно нас окружает.
Раньше серьезные баги наносили вред в узких специфичных областях — ракетостроение мирное (Ariane 5) и военное. Сейчас же с ошибкой в программе вы можете столкнуться, не только сидя за компьютером, но и сидя в автомобиле (Toyota) или посещая больницу (Therac-25). Мы одни из тех, кто сражается на стороне программистов против багов.
Иракские военные запустили в сторону американских солдат модернизированную ракету Р-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 сотрудников — от восторгов не осталось и следа. Было ли это связано с произошедшими событиями, не уточнялось. Впрочем, сейчас компания чувствует себя весьма неплохо.
Android, экран 6.5" AMOLED (1080x2400), Exynos 9611, ОЗУ 4 ГБ, флэш-память 64 ГБ, карты памяти, камера 48 Мп, аккумулятор 4000 мАч, 2 SIM
Читайте также: