«Гасниця» проти «Патріотів»: як американські військові програмісти навчилися правильно округляти

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


Військові оглядають ракету типу Р-17 збиту в пустелі ЗРК MIM-104 «Патріот» під час операції Desert Storm


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

фотки 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, about each 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). Ретельно виконуйте конвертацію.
  • Перевіряйте можливі ситуації переповнення. Перевіряйте ділення на нуль.
Стаття від PVS: Чому все-таки ми отримуємо різний результат у 32-bit і 64-бітному коді?

Читати ще про Patriot
Висновок
Ми хочемо привернути увагу людей до проблем надійності програмного забезпечення. Програми — це давно не тільки дивні незрозумілі розрахунки вчених на Fortran або комп'ютерні ігри. Це те, що давно і повсюдно нас оточує.

Раніше серйозні баги завдавали шкоди у вузьких специфічних областях — ракетобудування мирний (Ariane 5) і військову (Patriot). Зараз же з помилкою в програмі ви можете зіткнутися не тільки сидячи за комп'ютером, але і сидячи в автомобілі (Toyota або відвідуючи лікарню (Therac-25). Ми одні з тих, хто бореться на боці програмістів проти багів. Нами розроблений статичний аналізатор коду PVS-Studio, що дозволяє виявляти ще на етапі кодування багато помилок в програмах на мові С, С++ та С#. І користуючись нагодою, хочу нагадати, що з 25 жовтня 2016 року буде доступна не тільки Windows, але і Linux версія цього аналізатора.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.