На жаргоне компьютерного программирования гейзенбаг — это программная ошибка , которая, кажется, исчезает или меняет свое поведение, когда кто-то пытается ее изучить. [1] Термин является игрой слов на имя Вернера Гейзенберга , физика , который первым выдвинул эффект наблюдателя в квантовой механике , который гласит, что акт наблюдения за системой неизбежно изменяет ее состояние. В электронике традиционный термин — эффект зонда , когда присоединение тестового зонда к устройству изменяет его поведение.
Похожие термины, такие как bohrbug , mandelbug , [2] [3] [4] hindenbug и schrödinbug [5] [6] (см. раздел о связанных терминах), иногда предлагались для других видов необычных программных ошибок, иногда в шутку. [7] [8]
Гейзенбаги возникают из-за того, что обычные попытки отладить программу , такие как вставка выходных операторов или запуск ее с помощью отладчика , обычно имеют побочный эффект в виде изменения поведения программы неявными способами, такими как изменение адресов памяти переменных и времени ее выполнения.
Одним из распространенных примеров гейзенбага является ошибка, которая появляется, когда программа компилируется с помощью оптимизирующего компилятора , но не когда та же программа компилируется без оптимизации (как это часто делается с целью ее проверки с помощью отладчика). Во время отладки значения, которые оптимизированная программа обычно хранит в регистрах, часто помещаются в основную память. Это может повлиять, например, на результат сравнений с плавающей точкой , поскольку значение в памяти может иметь меньший диапазон и точность, чем значение в регистре [ необходима цитата ] . Аналогичным образом, гейзенбаги могут быть вызваны побочными эффектами в тестовых выражениях, используемых в утверждениях времени выполнения в таких языках, как C и C++ , где тестовое выражение не оценивается, когда утверждения отключены в производственном коде с помощью NDEBUG
макроса.
Другие распространенные причины гейзенбагов — использование значения неинициализированной переменной (которая может изменить свой адрес или начальное значение во время отладки) или следование недопустимому указателю (который может указывать на другое место во время отладки). Отладчики также обычно позволяют использовать точки останова или предоставляют другие пользовательские интерфейсы, которые вызывают скрытное выполнение дополнительного исходного кода (например, средств доступа к свойствам), что, в свою очередь, может изменить состояние программы. [9]
Конечные пользователи могут столкнуться с гейзенбагом, когда процесс создания снимка экрана гейзенбага для наблюдения исправляет гейзенбаг, а снимок экрана показывает идеально работающее состояние. Этот эффект может возникнуть, когда сложные стеки программного обеспечения работают вместе, например, веб-браузер, использующий аппаратное ускорение графической карты, что приводит к ошибкам рендеринга на физическом экране, которые не отображаются на снимке экрана.
Время также может быть фактором гейзенбагов, особенно в многопоточных приложениях. Выполнение программы под управлением отладчика может изменить время выполнения программы по сравнению с обычным выполнением. Чувствительные ко времени ошибки, такие как состояния гонки , могут не возникать, когда программа замедляется пошаговыми исходными строками в отладчике. Это особенно верно, когда поведение включает взаимодействие с сущностью, не находящейся под управлением отладчика, например, при отладке обработки сетевых пакетов между двумя машинами, и только одна из них находится под управлением отладчика.
Гейзенбаги можно рассматривать как примеры эффекта наблюдателя в информационных технологиях . Разочарованные программисты могут с юмором списать гейзенбаг на фазу луны [10] или (если это произошло только один раз) могут объяснить его как мягкую ошибку из-за воздействия альфа-частиц или космических лучей на оборудование, хорошо документированное явление, известное как эффекты единичных событий .
Бор -жук , напротив, является «хорошим, солидным жуком». Подобно детерминированной модели атома Бора , они не меняют своего поведения и сравнительно легко обнаруживаются. [11] [12]
Мандельбаг (названный в честь фрактала Бенуа Мандельброта ) — это ошибка, причины которой настолько сложны, что ее невозможно исправить, или ее поведение кажется хаотичным или даже недетерминированным . [2] Этот термин также относится к ошибке, которая демонстрирует фрактальное поведение (то есть самоподобие ), выявляя больше ошибок (чем глубже разработчик погружается в код, чтобы исправить его, тем больше ошибок он находит). [ необходима цитата ]
Ошибка Шрёдингера ( названная в честь Эрвина Шрёдингера и его мысленного эксперимента ) — это ошибка, которая проявляется в работающем программном обеспечении после того, как программист замечает, что код изначально не должен был работать. [5]
Жук -хинденбург [13] (названный в честь катастрофы дирижабля «Гинденбург» ) — это насекомое с катастрофическим поведением.
Хиггс -багсон [14] [15] (названный в честь частицы бозона Хиггса ) — это ошибка, существование которой предсказывается на основе других наблюдаемых условий (чаще всего, неясно связанных записей в журнале и отдельных сообщений пользователей), но которую трудно, если не невозможно, искусственно воспроизвести в среде разработки или тестирования. Термин может также относиться к ошибке, которая очевидна в коде (доказана математически), но которую нельзя увидеть при выполнении (но которую трудно или невозможно фактически обнаружить в существовании).
Термин был использован в 1985 году Джимом Греем в статье о сбоях программного обеспечения [16] (и иногда ошибочно приписывается ему из-за этой публикации), а также в 1986 году Джонатаном Кларком и Чжахаем Стюартом в списке рассылки (позднее новостной группе Usenet ) comp.risks . [17]
Брюс Линдси, исследователь из IBM , подтвердил в интервью ACM Queue 2004 года , что он присутствовал при первоначальном определении Гейзенбага. [18]
Более раннее появление в публикациях ACM относится к 1983 году. [19]
Гейзенбаги трудно идентифицировать и исправить; часто попытки их решить приводят к дальнейшему неожиданному поведению. Поскольку проблема проявляется как результат отдельной, лежащей в основе ошибки, поведение может быть трудно предсказать и проанализировать во время отладки. В целом количество выявленных гейзенбагов должно уменьшаться по мере развития программного обеспечения. [20]
Это принцип неопределенности Гейзенберга применительно к отладке (один из участников назвал один из примеров такой ошибки «Гейзенбагом»).
Также цитируется в LeBlanc, Richard J.; Robbins, Arnold D.; Event-Driven Monitoring of Distributed Programs , в Трудах 5-й Международной конференции IEEE по распределенным вычислительным системам (ICDCS) , IEEE Computer Society, Computer Society Press, 1985, стр. 515-522 Поиск Google Books:
Это принцип неопределенности Гейзенберга применительно к отладке, иногда называемый принципом «Гейзенбага» [ACM83].
{{cite book}}
: CS1 maint: несколько имен: список авторов ( ссылка )