?

Log in

No account? Create an account

October 2018

S M T W T F S
 123456
78910111213
14151617181920
21222324252627
28293031   

Tags

Powered by LiveJournal.com

Борбаги, Шрединбаги и другие ошибки

Чем бы дитя не тешилось, лишь бы отвлекалось...
Под катом - мой перевод статьи в англоязычной википедии о необычных программных ошибках. (http://en.wikipedia.org/wiki/Unusual_software_bug). На русском в общем так или иначе отдельные обрывки публиковались, но хочется свести все воедино.
Приятного чтения о няшных багах)

Необычные баги

(здесь и далее под словом баги мы понимаем программные ошибки).


Необычные баги — это баги, которые особенно сложно понять и исправить. Существует несколько типов необычных багов, названных в основном в честь ученых, открывших схожие парадоксальные явления.


Содержание:
1.Борбаг;
2.Мандельбаг;
3.Гейзенбаг;
4.Шрединбаг;
5.Баг фазы луны;
6.Статистический баг;
7.Альфа-баг (баг альфа-частицы);



  • 1.Борбаги.

    Борбаг (названый в честь модели атома Бора) — это баг, который проявляется в определенных (но возможно неизвестных) условиях. Как следствие в отличие от Гейзенбагов, Борбаг не пропадает и не меняет своих свойств при попытке обнаружения. В эту категорию попадают как самые простейшие баги с очевидным происхождением, так и те, которые настолько сложно найти и исправить, что они остаются в программе на этапе ее использования. Иногда ошибка происходит только при вводе определеннего набора параметров или при возникновении конректных событий. Эти баги часто присутствуют в редко вызываемых частях кода, и как следствие, могут очень долго оставаться незамеченными. Их еще иногда называют Призраками в коде.


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


  • 2.Мандельбаг.

    Мандельбаг (назван в честь изобретателя фракталов Бенуа Мандельброта) — это компьютерная ошибка, причины появления которой столь сложны, что она кажется хаотичной или даже недетерминированной. Кстати, это значит, что ее часто принимают за Борбаг.
    Иногда термин «Мандельбаг» используется для описания ошибки, чье поведение не кажется хаотичным, но причины возникновения столь сложны, что практически решения нет. Например, это ошибка, вызванная неверным проектированием всей системы.
    В литературе встречаются противоречивые утверждения о связи между Борбагами, Гейзенбагами и Мандельбагами. Согласно определению выше Манедельбаги — это Борбаги, а Гейзенбаги и Борбаги считаются антонимами. При этом утверждается, что все Гейзенбаги — это Мандельбаги.

    В статье в IEEE Computer Мандельбаг рассматривается как дополняющий антоним к Борбагу, то есть ошибка в программе — это либо Борбаг, либо Мандельбаг. Очевидно сложное поведение Мандельбага считается вызванным либо длинным промежутком между активацией ошибки и ее внещним проявлением, либо влиянием других элементов системы («железа», ОС, других приложений) на ее поведение. Гейзенбаги, зависящие от отладчика, или, другими словами, от попытки исследовать ошибку, считаются Мандельбагами.


  • 3.Гейзенбаги

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

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

    Особенно часто ошибки превращаются в Гейзенбаги от того, что запуск программы в режиме отладки очищает память перед стартом и принудительнохранит переменные в стеке вызова вместо хранения значений в регистрах. Эта разница в исполнении может активировать ошибки, связанные с выходом за границы памяти, неверными предположения об изначальном состоянии памяти или сравнением чисел с плавающей точкой (например, когда переменная с плавающей точкой, хранящаяся в 32хбитном стеке сравнивается с хранящейся в 80тибитном регистре). Еще одна причина заключается в том, что отладчики часто добавляют отслеживаемые переменные и другие подсказки пользователю, из-за которых появлется дополнительный исполняемый код (property accessors, например), а это в свою очередь может изменить состояние программы. Еще одна причина — fandango on core, вышедший за границы указатель. В C++ множество Гейзенбагов вызывается неиницилированнными переменными.
    Также Гейзенбаги могут зависеть от времени. Выполнение программы под отладчиком может изменить время исполнения программы по сравнению с нормалным режимом. А некоторые ошибки, такие, как «условия гонки» зависят от времени и могут не проявиться, когда программа искусственно замедлена пошаговым исполнением в дебаггере. Особенно это актуально при завязках на взаимодействие с чем-то, что не под контролем отладчика. Например, отлаживаемый сетевой пакет, передаваемым между двумя машинами, из которых под контролем отладчика лишь одна.

    Брюс Линдсей рассказывает в интервью, что присутствовал при первом упоминании термина и что он был создан из-за слов Гейзенберга «Чем внимательней высмотрите на что-то одно, тем хуже вы видите все остальное». Эти обстоятельства происхождения почти наверняка неверны, потому что термин использовался более двух десятилетий. Например, самое ранней упоминание, которое можно найти в Гугле, находится в списке расылки (позднее список новостейт Usenet) comp.risks под модерацией Питера Г Ньюмана. В RISKS Digest Volume 4: Выпуск 34, 23 декабря 1986 Жахай Стюарт ссылается на нечто, названное «еще один гейзенбаг», отмечая, что в последних выпусках RISKS Digest появилось много таких отсылок. Термин, и сособенно различие между Гейзенбагом и Борбагом упоминалось еще Джимом Греем в статье о причинах программных сбоев 1985 года.


  • 4.Шрединбаги.

    Шрединбаги — это баги, которые проявляются после того, как кто-то, прочтя код или использовав программу необычным образом, замечает, что она вообще не должна была работать, и в этот-то момент программа тут же и прекращает, пока баг не починят. Jargon File добавляет: «Звучит немыслимо, но бывает, что некоторые прораммы работали с латентными шрединбагами годами»

    Название Шрединбаг появилось в версии 2.9.9 Сборника Жаргона, опубликованной в апреле 1992. Оно происходит от понятия мысленнего эксперимента с котом Шредингера. Хорошо написанная программа, запущенная в надежной среде, должна следовать принципу детерминизма, и все эти квантовые вопросы наблюдаемости (т.е. сломать программу прочтением ее источника), сформулированные Шредингером (убить кота, открыв коробку) влияющие на исполнение программы, соверешнно неожиданны.

    Исправить очевидно ошибочный кусок кода обычно гораздо важнее, чем определить, что за чудесный набор обстоятельств привел к его исполнению сначала, и почему потом все сломалось. Из-за этого большинство этих багов так и не были до конца поняты. Когда ошибки такого типа рассматриваются во всех подробностях, их обычно можно переопределить как Борбаги, Гейзенбаги или Мандельбаги.


  • 5. Баги фазы луны.
    См. так же http://en.wikipedia.org/wiki/Time_formatting_and_storage_bugs.

    Термин «фаза луны» зачастую возникает, как понятие о глупом параметре, от которого может зависит баг, после того, как все утомились искать истинные причины. Jargon File отмечает два редких случая, в которых проблемы с обратобкой данных действительно вызваны фазами луны.

    В общем, программы, которые отличаются время-зависимым поведением, склонны и к время-завсимым ошибкам, которые могут возникнуть в определенной части процесса или в конкретно время (например, 29 февраля или когда происходит смена суток, месяца, года или века), например проблема 2000 года.


  • 6.Статистические баги.

    Статистические баги можно отловить только при многократном запуске фрагмента кода. Обычно эти ошибки появляются при создании случайных или псевдослучайных результатов. Например, программа, равномерно распределяющая точки по поверхности, скажем, сферы, в результате демонстрирует, что в нижнем полушаррии значительно больше точек, чем в верхнем. Пошаговое исполнение создания одной точки совершенно не может пролить свет на происхождение ошибки, потому что невозможно назвать каждый отдельный результат неверным — в конце концов, он же должен быть случайным! Проблема становится понятной только при создании множества точек. Стандартные приемы отладки, вроде проверки начальных и конечных условий, тоже мало чем помогут. Похожие пробемы часто случаются в численных методах, где каждая конкретная операция точна в пределах выбранной погрешности, но после большого числа итераций накапливаются ошибки, особенно при наличии статистического смещения. Простой пример: функция strfry() в GNU C Library.


  • 7. Альфа-баг.

    Термин альфа-баг происходит от исторического феномена «ошибок железа», вызванных излучением альфа-частиц. Эти частицы, появляющиеся случайным образом, могут повлиять на электроны в RAM и превратить 0 в 1 или наоборот. То есть термин используется для описания типа ошибок, продемонстрировавших неверный результат, но анализ кода говорит, что баг невозможен. Таким образом, единственный вариант разгадки — это альфа-частицы, повлиявшие на электрон. Обычная причина таких багов — ошибки билда или сборки, или какой-то необычный дефект памяти.



Статья основана на материалах под лицензией GDFL.

Легкая редакторская правка и исправление неверных терминов в случае появления оных привестствуется. А то от чтения техтекстов на английском говорить по-русски я уже разучилась.

Comments

А чего ты не запостила перевод в русскую википедию?
Ну вот ща уважаемые читатели моего ЖЖ укажут мне на откровенные ляпы, тогда и запощу. Цель-то собственно в этом.
А на чгк-марафоне в Пущино играла команда Шрединбаг! С Вассерманом, Либером и Новиковым. Я думал это они сами такое прикольное название придумали.
Ну может и сами, ход мысли-то понятный...
Мандельбаг (назван в честь изобретателя фракталов Бенуа Мандельброта) — это компьютерная ошибка, причины появления которой столь сложны, что она кажется хаотичной или даже недетерминированной. Кстати, это значит, что ее часто принимают за Борбаг.

Взаимоисключающие параграфы детектед :).

Наверное всетаки сообщающий об ошибке принимает ее за борбаг. Хотя я могу ошибаться
Нет, ты прав. Поправлю.
Или может здесь именно дословно? Этим термином называют также... (с учетом дальнейшего контекста)
Я вообще не понимаю, почему я перевела этот кусок именно так, когда правильно "Наблюдатель чаще считает, что это Борбаг, а не Гейзенбаг"
>Еще одна причина — fandango on core, вышедший за границы указатель.

Я бы уточнил:

Еще одна причина — fandango on core(бардак в памяти вызваный вышедшим за границы указателем).
Ага, спасибо. Мне не очень-то был понятен этот термин.
ШЕЛДОН, РАЗЛОГИНЬСЯ!!!111 :)
;)