Гейзенбаг (Iyw[yuQgi)

Перейти к навигации Перейти к поиску

Гейзенбаг (англ. heisenbug) — жаргонный термин, используемый в программировании для описания программной ошибки, которая исчезает или меняет свои свойства при попытке её обнаружения. Это слово, в отличие от слова «баг» (англ. bug), в русском языке используется редко. Не полностью идентичный, но достаточно близкий по значению русскоязычный термин — «плавающая ошибка».

Примером могут являться ошибки, которые проявляются в окончательном варианте программы, однако не видны в режиме отладки, или ошибки синхронизации в многопоточном приложении.

Происхождение названия[править | править код]

Данное название является игрой слов и происходит от термина «принцип неопределённости Гейзенберга» из квантовой механики, который на бытовом уровне понимается как неожиданное изменение наблюдаемого объекта в результате самого факта наблюдения.

В интервью журналу ACM Queue[1] Брюс Линдсей рассказывает, что присутствовал в тот момент, когда данный термин был впервые употреблён в значении «ты смотришь на него — и он исчезает» (сравните со словами Гейзенберга, который говорил: «чем более пристально вы глядите на один предмет, тем меньше внимания вы уделяете чему-то ещё»).

Возможные причины возникновения[править | править код]

Как правило, это низкоуровневые проблемы:

  • неинициализированная переменная — переменная перед использованием не инициализируется. При наблюдении в отладчике она всегда попадает на область памяти, заполненную нулями, а в реальной работе — на произвольное значение.
  • неправильный порядок инициализации — инициализация может происходить на более поздней стадии работы, чем первое использование, при этом после инициализации проблема не проявляется (при этом на стадии отладки порядок инициализации совпадает с порядком использования);
  • ошибка синхронизации в многозадачной среде или многопоточном приложении (так называемое состояние гонки) — всевозможные ошибки, от неправильной установки семафоров до ошибок, связанных с относительными приоритетами работы потоков (приоритеты при отладке и в реальной работе могут различаться);
  • аппаратная ошибка.

Ошибки оптимизаторов:

  • ошибка алгоритма удаления мёртвого кода — алгоритм оптимизации может ошибочно посчитать, что блок не имеет побочных эффектов и удалить его, при этом вставка отладочных команд для вывода на экран или в лог уже не даст удалить этот блок как мёртвый и отлаживаться будет уже немного другая программа.

Методы борьбы[править | править код]

Гейзенбаги очень сложно искать, поскольку они проявляются в зависимости от случайных факторов и воспроизводятся нестабильно (свою роль играет и сложность анализа состояния многопоточной системы). Поэтому их стараются отсечь ещё на этапе проектирования, продумывая процедуры синхронизации.

Сходные понятия[править | править код]

Эти слова, равно как и «гейзенбаг», в русском языке практически не встречаются.

Борбаг (англ. Bohr bug) — ошибка, которая, в противоположность гейзенбагу, не исчезает и не меняет своих свойств при попытке её обнаружения, аналогично стабильности модели электронных орбиталей Нильса Бора. Близкий по значению русскоязычный аналог — «стабильный» или «устойчивый» баг[2], «систематическая ошибка».

Мандельбаг (англ. mandel bug) — ошибка, чьё поведение столь сложно, что выглядит хаотичным[3]. Название происходит от имени Бенуа Мандельброта, основоположника фрактальной геометрии. Однако, стоит заметить (по принципу, сходному с тестом Тьюринга), что, если не существует способа разделить ошибку, чьё поведение кажется хаотичным, и ошибку, чьё поведение действительно хаотично, то нет никакого смысла различать мандельбаг и гейзенбаг[4]. Некоторые используют термин мандельбаг для описания ошибки, чьё поведение не кажется действительно хаотичным, но столь сложно, что для её исправления требуется переписать программу с нуля. Примером такой ошибки может служить фундаментальная ошибка, допущенная при проектировании системы[5].

Шрёдинбаг[6] (англ. schroedin bug — в честь мысленного эксперимента с котом Шрёдингера) — ошибка, которая никак не проявляет себя, однако внезапно возникает, если кто-то наткнётся на неё в исходном коде или попытается использовать программу в необычных условиях и осозна́ет, что система вообще не могла работать при наличии такой ошибки. После этого программа перестаёт работать вообще до тех пор, пока ошибка не будет исправлена. Хотя это звучит невероятно, некоторые программы содержат в себе такие ошибки.

Гинденбаг[7][8] (англ. hinden bug — по названию катастрофы дирижабля "Гинденбург") — ошибка с катастрофическими последствиями, например, полным уничтожением данных.

Багсон Хиггса[8][9] (англ. higgs-bugson — в честь частицы под названием бозон Хиггса) — ошибка, существование которой предсказано (чаще всего, по косвенным данным или единичным сообщениям пользователей), но которую крайне трудно, если вообще возможно, воспроизвести искусственно в условиях разработки или тестирования. Термин также может употребляться по отношению к ошибке, которая очевидна в коде (математически доказана), но при этом ни разу не наблюдалась в реальных условиях.

Примечания[править | править код]

  1. Bruce Lindsay. A Conversation with Bruce Lindsay (англ.) // ACM Queue : журнал. — 2004. — Ноябрь (no. 8). Архивировано 4 февраля 2022 года.
  2. The jargon file. Bohr-bug Архивная копия от 12 января 2013 на Wayback Machine (англ.)
  3. The new hacker’s dictionary Архивная копия от 8 сентября 2013 на Wayback Machine (англ.).
  4. M. Grottke and K. S. Trivedi, Software faults, software aging and software rejuvenation. Journal of the reliability engineering association of Japan, выпуск 27, номер 7, 2005 год, страницы 425—438.
  5. Michael Grottke, Kishor S. Trivedi, «Fighting bugs: remove, retry, replicate, and rejuvenate Архивная копия от 27 марта 2010 на Wayback Machine» (англ.). Computer, выпруск 40, номер 2, февраль 2007, страницы 107—109, doi:10.1109/MC.2007.55
  6. The jargon file. Schroedinbug Архивная копия от 8 сентября 2013 на Wayback Machine (англ.)
  7. HindenBug. wiki.c2.com. Дата обращения: 24 октября 2019. Архивировано 8 августа 2020 года.
  8. 1 2 Matt Lynley. 20 Hilarious Programming Jargon Phrases You Should Use When Talking To Engineers. Business Insider. Дата обращения: 24 октября 2019. Архивировано 24 октября 2019 года.
  9. New Programming Jargon. blog.codinghorror.com. Дата обращения: 24 октября 2019. Архивировано 4 ноября 2019 года.