Программная ошибка
Шаблон:Перенаправление Програ́ммная оши́бка (арго баг Шаблон:L6e) — ошибка в программе или в системе, приводящая к неожиданному поведению программы и, как следствие, выдаче некорректного результата. Большинство программных ошибок возникает из-за ошибок, допущенных разработчиками программы в её исходном коде либо в её дизайне. Также некоторые ошибки возникают из-за некорректной работы инструментов разработчика, например, из-за компилятора, вырабатывающего некорректный код.
Термин «программная ошибка» обычно употребляется для обозначения ошибок, проявляющих себя на стадии работы программы, в отличие, например, от ошибок проектирования или синтаксических ошибок. Отчет, содержащий информацию об ошибке, также называют отчетом о проблеме (англ. Шаблон:Lang-en2). Отчет о критической проблеме (англ. Шаблон:Lang-en2), вызывающей аварийное завершение программы, называют крэш-репортом (англ. Шаблон:Lang-en2).
Программные ошибки локализуются и устраняются в процессе тестирования и отладки программы.
Этимология термина «баг»
В значении «неуловимой технической ошибки» слово «жучок» (англ. Шаблон:Lang-en2) употреблялось задолго до появления компьютеров персоналом телеграфных и телефонных компаний в отношении неполадок с электрооборудованием и радиотехникой. В 1878 году Томас Эдисон писал<ref>Источник: Edison to Puskas, 13 ноября 1878, Edison papers, Edison National Laboratory, U.S. National Park Service, West Orange, N.J., цитируется по книге Томаса П. Хьюджеса (Thomas P. Hughes), American Genesis: A History of the American Genius for Invention, Penguin Books, 1989, стр.</ref>: <templatestyles src="Шаблон:Начало_цитаты/styles.css" />{{#ifexpr: 0 mod 2 = 0 and 0 != 4 and 0 != 104 |
}}{{#if: |
:
}}
{{#ifexpr: 0 mod 2 = 0 and 0 != 4 and 0 != 104 |
}} «Так было со всеми моими изобретениями. Первый шаг — интуиция, которая приходит как вспышка, затем возникают трудности — устройство отказывается работать, и именно тогда проявляются „жучки“ — как называют эти мелкие ошибки и трудности — и требуются месяцы пристального наблюдения, исследований и усилий, прежде чем дело дойдёт до коммерческого успеха или неудачи». Шаблон:Oq {{#if:
| <templatestyles src="Шаблон:Конец цитаты/styles.css" />
—}}
Во время Второй мировой войны словом Шаблон:Lang-en2 именовали проблемы с радарной электроникой.
По одной из версий, в отношении программной ошибки этот термин впервые был применен 9 сентября 1947 года<ref>Шаблон:Cite web</ref> Грейс Хоппер, которая работала в Гарвардском университете с вычислительной машиной Шаблон:Нп3. Проследив возникшую ошибку в работе программы до электромеханического реле машины, она нашла между замкнувшими контактами сгоревшего мотылька. Извлечённое насекомое было вклеено скотчем в технический дневник с сопроводительной иронической надписью: «Первый реальный случай обнаружения жучка» (англ. Шаблон:Lang-en2)<ref>Шаблон:Cite web</ref>.
Значение и классификация ошибок программного обеспечения
В зависимости от этапа разработки ПО, на котором выявляется ошибка, выделяют:
- синтаксические ошибки (распознаваемые в качестве таковых транслятором и делающие компиляцию невозможной) — например отсутствие или несоответствие открывающей и закрывающей скобок;
- предупреждения (warnings) компилятора — например, использование неинициализированной переменной. В этом случае компилятор может заметить, что программист делает что-то необычное (вероятно неверное), и сообщает об этом, однако программист сам принимает решение, игнорировать сообщение или нет;
- ошибки времени исполнения, смысловые ошибки (семантические) — например вычитание переменных вместо сложения или ошибка сегментации.
По важности:
- Блокирующие (blockers) — делающие выполнение программы невозможным;
- Критические (иногда Шаблон:Lang-en2) — лишающие программу всей полезности;
- Серьёзные;
- Незначительные;
- Косметические.
По времени появления:
- Постоянно, при каждом запуске;
- Иногда («плавающий» тип);
- Только на машине у клиента (зависит от локальных настроек у клиента).
По месту и направлению:
- Ошибки пользовательского интерфейса;
- Системы обработки ошибок;
- Ошибки, связанные с граничными условиями (например, некорректная обработка пустой строки или максимального числового значения);
- Ошибки вычислений;
- Ошибки управления потоками;
- Ошибки обработки или интерпретации данных;
- При состоянии гонки;
- Повышение нагрузки;
- Ошибки контроля версии и идентификаторов;
- Ошибки тестирования.
В зависимости от характера ошибки, программы и среды исполнения, ошибка может проявляться сразу или наоборот — долгое время оставаться незамеченной (например Проблема 2038 года).
Также ошибка может проявляться в виде уязвимости, делающей возможным несанкционированный доступ к системе или DoS-атаку.
Разновидности
Гейзенбаг (англ. Шаблон:Lang-en2) — программная ошибка, которая исчезает или меняет свои свойства при попытке её обнаружения<ref>Шаблон:Статья</ref>. Обычно так ведут себя ошибки типа «состояние гонки».
Борбаг (англ. Шаблон:Lang-en2) — ошибка, которая, в противоположность гейзенбагу, не исчезает и не меняет своих свойств при попытке её обнаружения, аналогично стабильности модели электронных орбиталей Нильса Бора. Близкий по значению русскоязычный аналог — «стабильный» или «устойчивый» баг<ref>The jargon file. Bohr-bug Шаблон:WaybackШаблон:Ref</ref>, «систематическая ошибка».
Мандельбаг (англ. Шаблон:Lang-en2) — ошибка, чьё поведение столь сложно, что выглядит хаотичным<ref>The new hacker’s dictionary Шаблон:WaybackШаблон:Ref.</ref>. Название происходит от имени Бенуа Мандельброта, основоположника фрактальной геометрии. Однако, стоит заметить (по принципу, сходному с тестом Тьюринга), что, если не существует способа разделить ошибку, чьё поведение кажется хаотичным, и ошибку, чьё поведение действительно хаотично, то нет никакого смысла различать мандельбаг и гейзенбаг<ref>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.</ref>. Некоторые используют термин мандельбаг для описания ошибки, чьё поведение не кажется действительно хаотичным, но столь сложно, что для её исправления требуется переписать программу с нуля. Примером такой ошибки может служить фундаментальная ошибка, допущенная при проектировании системы<ref>Michael Grottke, Kishor S. Trivedi, «Fighting bugs: remove, retry, replicate, and rejuvenate Шаблон:Wayback»Шаблон:Ref. Computer, выпруск 40, номер 2, февраль 2007, страницы 107—109, doi:10.1109/MC.2007.55</ref>.
Шрёдинбаг<ref>The jargon file. Schroedinbug Шаблон:WaybackШаблон:Ref</ref> (англ. Шаблон:Lang-en2 — в честь мысленного эксперимента с котом Шрёдингера) — ошибка, которая никак не проявляет себя, однако внезапно возникает, если кто-то наткнётся на неё в исходном коде или попытается использовать программу в необычных условиях и осозна́ет, что система вообще не могла работать при наличии такой ошибки. После этого программа перестаёт работать вообще до тех пор, пока ошибка не будет исправлена. Хотя это звучит невероятно, некоторые программы содержат в себе такие ошибки.
Гинденбаг<ref>Шаблон:Cite web</ref><ref name=":0">Шаблон:Cite web</ref> (англ. Шаблон:Lang-en2 — по названию катастрофы дирижабля «Гинденбург») — ошибка с катастрофическими последствиями, например, полным уничтожением данных.
Багсон Хиггса<ref name=":0" /><ref>Шаблон:Cite web</ref> (англ. Шаблон:Lang-en2 — в честь частицы под названием бозон Хиггса) — ошибка, существование которой предсказано (чаще всего, по косвенным данным или единичным сообщениям пользователей), но которую крайне трудно, если вообще возможно, воспроизвести искусственно в условиях разработки или тестирования. Термин также может употребляться по отношению к ошибке, которая очевидна в коде (математически доказана), но при этом ни разу не наблюдалась в реальных условиях.
Поиск и исправление ошибок
Шаблон:Также Для отладки программы (англ. Шаблон:Lang-en2) разработчиками ПО используются специальные программы-отладчики (англ. Шаблон:Lang-en2). Например, в операционной системе Windows можно использовать программу WinDbg из пакета Microsoft Debugging Tools for Windows. Для GNU/Linux и ряда других UNIX-подобных операционных систем существует отладчик GDB (GNU Debugger).
Отчёты об ошибках
Основная масса ошибок обычно отлаживается на этапе компиляции и тестирования программы. Однако некоторая часть ошибок всё же попадает в публикуемую версию и проявляется на компьютерах конечных пользователей в процессе эксплуатации ПО. Для повышения качества программного обеспечения пользуются специальными программами, цель которых — отловить ошибку в целевом приложении, собрать необходимую информацию о её симптомах и отправить отчёт по интернету к разработчикам данного ПО.
Например, в операционную систему Windows встроена утилита Dr. Watson, которая по умолчанию отлавливает ошибки в приложениях пользователя и отправляет отчёт на специальный Сервер компании Microsoft. Также в качестве примера можно привести аналогичные библиотеки Breakpad<ref>Шаблон:Cite web</ref> и CrashRpt<ref>Шаблон:Cite web</ref>.
Последствия
- Авария ракеты-носителя «Ариан-5» (4 июня 1996) — пример одной из самых дорогостоящих компьютерных ошибок в истории.
- Ошибки в программном обеспечении медицинского ускорителя Therac-25 привели к превышению доз облучения нескольких людей.
- Финансовая организация Шаблон:Нп3 потеряла 440 миллионов долларов за 45 минут из-за ошибки в программе высокочастотного трейдинга<ref>Шаблон:Cite news</ref>.
См. также
Шаблон:Родственный проект{{#if:||}}{{#if: баг || {{#ifeq: Программная ошибка | программная ошибка | | }} }}
- Отладка программы
- Отчёт об ошибке
- Система отслеживания ошибок
- Типобезопасность
- Формальная верификация
- GIGO
Примечания
Ссылки
- Уязвимости в исходных кодах, «Компьютерная газета». Продолжение: Уязвимости в исходных кодах. Перепечатка: 1 частьШаблон:Недоступная ссылка, 2 частьШаблон:Недоступная ссылка.
- 10 худших ошибок в программировании в истории человечества
- 2010 CWE/SANS Top 25 Most Dangerous Software Errors частичный перевод на русский 25 самых опасных ошибок при создании программ
- Ошибки, обнаруженные в Open Source проектах разработчиками PVS-Studio с помощью статического анализа. Можно найти полезные примеры при подготовки статей и презентаций.