Программная ошибка

Програ́ммная оши́бка (арго баг ) — означает ошибку в программе или в системе, из-за которой программа выдает неожиданное поведение и, как следствие, результат. Большинство программных ошибок возникают из-за ошибок, допущенных разработчиками программы в её исходном коде, либо в её дизайне. Также некоторые ошибки возникают из-за некорректной работы инструментов разработчика, например из-за компилятора, вырабатывающего некорректный код.

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

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

Этимология термина «баг» 

В значении «неуловимой технической ошибки» слово «жучок» () употреблялось задолго до появления компьютеров персоналом телеграфных и телефонных компаний в отношении неполадок с электрооборудованием и радиотехникой. В 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>:

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

Во время Второй мировой войны словом  именовали проблемы с радарной электроникой.

По одной из версий, в отношении программной ошибки этот термин впервые был применен 9 сентября 1947 года Грейс Хоппер, которая работала в Гарвардском университете с вычислительной машиной . Проследив возникшую ошибку в работе программы до электромеханического реле машины, она нашла между замкнувшими контактами сгоревшего мотылька. Извлечённое насекомое было вклеено скотчем в технический дневник с сопроводительной иронической надписью: «Первый реальный случай обнаружения жучка» ().

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

По важности:
 Блокирующие (blockers'') — делающие выполнение программы невозможным;
 Критические (иногда ) — лишающие программу всей полезности;
 Серьёзные;
 Незначительные;
 Косметические.

По времени появления:
 Постоянно, при каждом запуске;
 Иногда («плавающий» тип);
 Только на машине у клиента (зависит от локальных настроек у клиента).

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

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

Также ошибка может проявляться в виде уязвимости, делающей возможным несанкционированный доступ к системе или DoS-атаку.

Разновидности 

 Борбаг — легко обнаруживаемая стабильная ошибка
 Гейзенбаг — сложно обнаруживаемая, периодически исчезающая и меняющая свойства, при попытке обнаружения, ошибка
 Мандельбаг — ошибка с очень сложным, хаотичным, поведением
 Шрёдинбаг — критическая ошибка, которая не проявляется, пока кто-нибудь на неё не наткнётся в исходном коде, после чего программа совершенно перестаёт работать

Поиск и исправление ошибок 

Для отладки программы () разработчиками ПО используются специальные программы-отладчики (). Например, в операционной системе Windows можно использовать программу WinDbg из пакета Microsoft Debugging Tools for Windows. Для GNU/Linux и ряда других UNIX-подобных операционных систем существует отладчик GDB (GNU Debugger).

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

Например, в операционную систему Windows встроена утилита Dr. Watson, которая по умолчанию отлавливает ошибки в приложениях пользователя и отправляет отчёт на специальный Сервер компании Microsoft. Также в качестве примера можно привести аналогичные библиотеки Breakpad и CrashRpt.

Последствия 
 Авария ракеты-носителя «Ариан-5» (4 июня 1996) — пример одной из самых дорогостоящих компьютерных ошибок в истории.
 Ошибки в программном обеспечении медицинского ускорителя Therac-25 привели к превышению доз облучения нескольких людей.
 Финансовая организация  потеряла 440 миллионов долларов за 45 минут из-за ошибки в программе высокочастотного трейдинга.

См. также 

 Отладка программы
 Отчет об ошибке
 Система отслеживания ошибок
 Типобезопасность
 Формальная верификация
 GIGO

Примечания

Ссылки 
 Уязвимости в исходных кодах, «Компьютерная газета». Продолжение: Уязвимости в исходных кодах. Перепечатка: 1 часть, 2 часть.
 10 худших ошибок в программировании в истории человечества
 2010 CWE/SANS Top 25 Most Dangerous Software Errors частичный перевод на русский 25 самых опасных ошибок при создании программ
 Ошибки, обнаруженные в Open Source проектах разработчиками PVS-Studio с помощью статического анализа. Можно найти полезные примеры при подготовки статей и презентаций.

Ошибки программирования
Программистский сленг