Гейзенбаг

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

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

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

Сообщество Fedora выбрало «Heisenbug» кодовым именем 20 версии дистрибутива.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. The Jargon File:Bohr-bug
  2. The New Hacker's Dictionary.
  3. M. Grottke and K. S. Trivedi, Software Faults, Software Aging and Software Rejuvenation. Journal of the Reliability Engineering Association of Japan, Vol. 27, No. 7, pp. 425-438, 2005.
  4. Michael Grottke, Kishor S. Trivedi, «Fighting Bugs: Remove, Retry, Replicate, and Rejuvenate». Computer, vol. 40, no. 2, pp. 107—109, Feb. 2007, doi:10.1109/MC.2007.55
  5. The Jargon File:Schroedinbug

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