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