2020-09-24 14:19:32
Есть популярный тест для серверного ПО, когда программа эксплуатируется в течение продолжительного времени под нагрузкой. Такой тест позволяет выявлять проблемы, которые имеют накопительный эффект, например утечку ресурсов (файловые дескрипторы, память и т.д.). У меня две истории про такие баги, которые были найдены уже при эксплуатации.
Первая история:
MIM-104 "Патриот" — американский зенитный ракетный комплекс (ЗРК), используемый армией США и их союзниками. В программном обеспечении, отвечающем за ведение цели, присутствовал баг, из-за которого со временем внутренние часы постепенно отходили от истинного значения времени. Системное время хранилось как integer в 24-битном регистре с точностью до одной десятой секунды. Поэтому на каждом такте по 0.1 сек "терялась" часть времени. При рассчете данные переводились в числа типа real .
Число 1/10 равно 1/24 + 1/25 + 1/28 + 1/29 + 1/212 + 1/213 + ... Другими словами, бинарное разложение 1/10 = 0.0001100110011001100110011001100... Поэтому 24-битный регистр в системе Patriot хранил вместо этого 0.00011001100110011001100 внося ошибку равную 0.0000000000000000000000011001100... в двоичном исчислении, или примерно 0.000000095 в десятичном. За сто часов работы набегает 0.000000095×100×60×60×10 = 0.34 секунды.
Ракета, которая попала в ЗРК Патриот летела со скоростью 1676 метров в секунду, и проходила за 0.34 секунды больше полукилометра. Этого было более чем достаточно, чтобы пройти радиус поражения Патриотов. Забавно, что кривое вычисление времени пофиксили в некоторых частях программы, но не во всех.
Подробный отчёт: https://msquair.files.wordpress.com/2015/05/patriot-timing-error.pdf
Вторая история:
Производитель самолётов Boeing сильно пострадал в 2015 году от проблемы с его авиалайнерами 787 Dreamliner. Она была связана с конкретным временем непрерывной работы: тогда была обнаружена ошибка переполнения памяти, из-за которой генераторы 787 Dreamliner отключались после 248 дней непрерывной работы. Было обнаружено, что программный счётчик в прошивке генераторов переполнялся конкретно после этого точного промежутка времени. И это не единственная программная ошибка, которую нашли в 787 Dreamliner за последние годы.
Рекомендации персоналу, обслуживающему самолеты, от FAA - https://s3.amazonaws.com/public-inspection.federalregister.gov/2015-10066.pdf
#bugstory
2.1K views11:19