Раздаем медали багам: 10 самых эпичных программных дефектов в истории
9 сентября — День тестировщика. В этот день в 1947 году при тестировании вычислительной машины Mark II обнаружили мертвую моль, застрявшую между контактами реле, что привело к сбою системы. Так и задокументировали: баг.
Эту историю знают все тестировщики, поэтому не будем вдаваться в детали, укажем только, что это первый, самый древний баг. А также вспомним другие программные ошибки, которые заслуживают называться самыми.
Самый дорогой баг
Ошибка, которая привела к разрушению ракеты Ariane 5 в 1996 году, считается самым дорогим багом в истории, она стоила около 370 миллионов долларов. Через 37 секунд после старта ракета отклонилась от курса и самоуничтожилась. Причина — баг в программном обеспечении: при преобразовании 64-битного числа в 16-битное произошло переполнение буфера, что вызвало сбой в навигационной системе.
После аварии программы по запуску Ariane 5 приостановили. Разработчикам пришлось пересматривать программное обеспечение, улучшать системы безопасности и повторно тестировать ракеты, что задержало дальнейшие запуски. Это привело к значительным финансовым потерям и откату на рынке запуска спутников.
Самый шокирующий баг
В 2012 году баг в программном обеспечении финансовой компании Knight Capital привел к шокирующим последствиям на фондовом рынке. Ошибка в алгоритмах автоматической торговли вызвала цепную реакцию необоснованных покупок и продаж акций. Всего за 45 минут компания потеряла 440 миллионов долларов, что привело ее к колоссальным убыткам и банкротству.
Хотя убытки в 440 миллионов долларов огромны, назвать баг Knight Capital самым дорогим в истории нельзя по той причине, что деньги были потеряны только на рынке акций. Тогда как при аварии Ariane 5 в 1996 году речь шла не только о финансовых потерях, но и о потере дорогостоящего оборудования, которое невозможно было восстановить. Однако Knight Capital Bug достоин звания самого шокирующего из-за мгновенного эффекта и полного краха компании.
Самый переоцененный баг
Y2K можно назвать самым переоцененным багом в истории. Проблема заключалась в том, что многие системы в XX веке использовали только последние две цифры для указания года (например, 99 вместо 1999). Когда наступил 2000 год, существовал риск, что компьютеры воспримут 00 как 1900 год и это вызовет сбои в банковских и транспортных системах, энергосетях и других ключевых инфраструктурах.
Чтобы не допустить катастрофы, на исправление этой ошибки потратили миллиарды долларов. Несмотря на опасения, удалось избежать серьезных катастроф, но Y2K стал символом глобальной паники.
Самый «тихий» баг
Heartbleed — легендарная уязвимость в OpenSSL, обнаруженная в 2014 году. Она позволяла злоумышленникам извлекать из памяти серверов ключи шифрования, пароли и другую важную информацию, не оставляя следов. Особенность Heartbleed в его простоте: атака не требовала сложных навыков, но давала доступ к критическим данным. Под угрозой взлома оказались миллионы сайтов и сервисов по всему миру.
Heartbleed стал одним из самых известных и опасных багов в истории кибербезопасности, у него даже одностраничник с FAQ есть. Хитрость этого бага в том, что он действовал незаметно в течение нескольких лет, с 2011 года. После его обнаружения началась массовая замена скомпрометированных сертификатов и устранение уязвимости.
Уязвимость нашла финская компания-разработчик Condenomicon (ныне принадлежит Synopsys), она же разработала кровавый логотип Heartbleed и лицензировала его по Creative Commons, то есть предоставила в открытое использование. В связи с этим в интернет-магазинах можно найти тематический мерч — причем не только футболки, а даже постельное белье.
Самый длительный баг
С 1995 по 2017 год в калькуляторе Windows существовал баг, который не позволял правильно выполнять некоторые простые операции. Основная проблема возникала при вычислении квадратных корней для целых чисел, таких как √4. После вычисления корня и вычитания из него ожидаемого значения (например, √4 – 2), калькулятор выводил не ноль, а значение с незначительной ошибкой, вроде -1.068281969439142e-19. Это происходило из-за использования библиотеки для операций с плавающей точкой, которая не всегда корректно округляла числа.
Баг существовал более 20 лет и переезжал из одной версии Windows в другую, пока наконец Microsoft не исправила его в Windows 10. Интересно, что несмотря на множество обновлений, этот баг долгое время не считали приоритетным для исправления, так как встречались с ним редкие пользователи.
Самый распространенный баг
Null Reference Exception или Null Pointer Exception является одним из самых распространенных багов в программировании. Он возникает, когда программа пытается использовать объект, который не был инициализирован, то есть равен null.
Концепцию null впервые предложил британский ученый Тони Хоар в 1965 году при создании языка ALGOL W. Null был придуман для решения проблемы с отсутствующими значениями, но сам Хоар спустя годы пожалел о своей находке, потому что она привела к множеству багов и уязвимостей во всех системах, которые начали использовать эту концепцию.
В языках C и C++ доступ к null-указателю вызывает Null Pointer Exception, что может привести к краху программы. Эти языки допускают более низкоуровневый доступ к памяти, поэтому ошибка может быть очень серьезной. В Java, C#, Python и других языках высокого уровня Null Reference Exception выбрасывается как исключение при попытке обратиться к null-объекту.
Самый известный в поп-культуре
Самый известный баг из индустрии развлечений — это MissingNo. из франшизы про покемонов. Глюк появился в 1999 году в первых играх серии Pokemon Red и Pokemon Blue на приставке Game Boy. Баг возникал при выполнении трех определенных игровых действий и приводил к появлению странного покемона с искаженной графикой и необычными способностями. Всего существовало пять разных форм MissingNo.
Игроки могли поймать MissingNo., что иногда приводило к сбоям в графике и нарушению игровой базы данных. Но баг все равно быстро стал культовым среди фанатов, так как позволял увеличивать количество предметов в инвентаре, что многие использовали для получения редких артефактов.
Инструкции о том, как поймать MissingNo., были опубликованы в нескольких игровых журналах и гайдах по прохождению. Некоторые игроки даже предлагали платные советы по поимке этого глюка, и стоимость таких консультаций доходила до 200 долларов. Интерес к MissingNo. был настолько велик, что по этому феномену даже проводили социологические исследования, изучая поведение и мотивацию игроков, которые стремились воспользоваться багом.
Самый трагический баг
Ошибка в программном обеспечении аппарата Therac-25, который использовался для лечения рака в 1980-х, привела к печальным последствиям. Из-за багов и отсутствия аппаратных блокировок аппарат выдавал смертельные дозы радиации, что привело к гибели пяти человек и тяжелым травмам у других. Разработчики полагались на программное управление, игнорируя механические предохранители.
Этот случай привел к пересмотру стандартов для медицинского оборудования и показал, насколько важно тщательно тестировать ПО в системах, где на кону человеческие жизни. После инцидентов с Therac-25 произошли значительные изменения в регулировании этой сферы.
Баг с самым большим потенциалом
Year 2038 Problem — пока несработавший баг, связанный с тем, как компьютеры на UNIX-подобных операционных системах отображают время. Отсчет ведется с так называемой «эпохи UNIX» — полуночи 1 января 1970 года, а время записывается в виде 32-битного целого числа со знаком. Это позволяет хранить до 2 147 483 647 секунд, что приведет к конечной дате 19 января 2038 года. После этого счетчик переполнится и начнет отсчитывать время с отрицательных значений, что вызовет сбои в системах, не подготовленных к этому событию.
Несмотря на то что проблема известна много лет, она до сих пор остается актуальной и может затронуть серверы, банковские системы, транспортную инфраструктуру и другие устройства, которые работают на старом оборудовании с 32-битными процессорами. Проблема не так широко обсуждается, как в свое время Y2K, но ее последствия могут быть значительными, если не принять меры заранее.
Самый абсурдный баг
Один из самых абсурдных багов в истории произошел в 2009 году в ЦЕРНе и привел к остановке Большого адронного коллайдера. Причиной стал кусочек французского багета, который попал в электрическую установку на поверхности и вызвал короткое замыкание. Предположительно, его уронила птица. Пусть это не программная ошибка, но похоже на баг в его оригинальном смысле.
Это впечатляющий случай, когда буквально ломоть хлеба может повлиять на работу самого сложного, мощного и дорогого научного устройства в истории, созданного для решения фундаментальных вопросов, таких как происхождение Вселенной.
Не забываем, что иногда баги — это не просто дефекты, а истории с далеко идущими последствиями: от культурных феноменов до трагедий. Вовремя исправленный дефект может спасти миллионы (денег, людей, программ), проигнорированный способен привести к катастрофе.