Эффект бабочки в программировании. Делимся историями, где, казалось бы, небольшая ошибка в коде привела к масштабным последствиям.
1️⃣ Ариан-5. 64-битное число, которое не влезло в 16 битную переменную.
64-битное значение горизонтальной скорости с плавающей запятой переполняло 16-битную переменную. В Ариан-4 такой скорости никогда не было и ошибка перетекла в Ариан-5. По итогу в программном обеспечении ракеты произошло целочисленное переполнение.
Из-за ошибки ракета-носитель была подорвана на 34-й секунде полёта, что стало одной из самых дорогостоящих компьютерных ошибок в истории.
Вывод: даже если в новой системе используется работающий код из старой, его всё-равно необходимо тщательно проверять
2️⃣ Cloudflare: регулярное выражение, которое съело все CPU
Инженер Cloudflare написал правило для WAF (Web Application Firewall). В нём было неудачное регулярное выражение, которое на определённых входных данных вызывало катастрофический возврат (catastrophic backtracking) — время выполнения росло экспоненциально На сложных запросах движок начинал перебирать миллиарды вариантов вместо одной проверки.
Последствия: 2 июля 2019 года CPU всех серверов Cloudflare по всему миру встали на 100%. 27 минут половина сайтов на Cloudflare возвращали ошибку 502. А защита от превышения CPU была случайно удалена за несколько недель до этого
Вывод: регулярки стоит тестировать в том числе на производительность, на длинных и сложных строках, а не только на валидных данных.
3️⃣ Knight Capital: старый тестовый код, который ожил Разработчики обновляли торговую систему SMARS. В одном из серверов случайно остался старый тестовый код Power Peg, написанный ещё в 2003 году. Этот код должен был проверять работу алгоритма, но никогда не использовался в реальной торговле. Ошибка в деплое: одна из восьми машин не получила новую версию и продолжила работать со старым кодом. А в старом коде была функция, которая не распознавала, когда заявки уже исполнены, и продолжала отправлять их снова и снова.
В результате 1 августа 2012 года, в 9:30 утра, бот отправлял заявки (скупал акции) быстрее, чем они исполнялись, и не видел, что они уже исполнены. За 28 минут Knight Capital потеряла $440 млн. Инженерам пришлось топорами выдергивать сетевые модули серверов в дата-центре, чтобы остановить алгоритм. Компания потеряла 53% капитализации и вскоре обанкротилась.
Вывод: Мёртвый тестовый код, оставленный в продакшене, — это бомба замедленного действия. Тщательно проверяйте, что именно уходит в деплой, и не храните старые версии там, где они могут случайно запуститься.
Post #499
346
- 🤯 4
- 😱 3
- ❤ 2