Программная ошибка
Програ́ммная оши́бка (арго баг от англ. bug — «жук») — означает ошибку в программе или в системе, из-за которой программа выдает неожиданное поведение и, как следствие, результат. Большинство программных ошибок возникают из-за ошибок, допущенных разработчиками программы в её исходном коде, либо в её дизайне. Также некоторые ошибки возникают из-за некорректной работы инструментов разработчика, например из-за компилятора, вырабатывающего некорректный код.
Термин «программная ошибка» обычно употребляется для обозначения ошибок, проявляющих себя на стадии работы программы, в отличие, например, от ошибок проектирования или синтаксических ошибок. Отчет, содержащий информацию об ошибке также называют отчетом о проблеме (англ. bug report). Отчет о критической проблеме (англ. crash), вызывающей аварийное завершение программы, называют крэш-репортом (англ. crash report).
Программные ошибки локализуются и устраняются в процессе тестирования и отладки программы.
Этимология термина «баг»Править
В значении «неуловимой технической ошибки» слово «жучок» (англ. bug) употреблялось задолго до появления компьютеров персоналом телеграфных и телефонных компаний в отношении неполадок с электрооборудованием и радиотехникой. В 1878 году Томас Эдисон писал[1]:
«Так было со всеми моими изобретениями. Первый шаг — интуиция, которая приходит как вспышка, затем возникают трудности — устройство отказывается работать, и именно тогда проявляются «жучки» — как называют эти мелкие ошибки и трудности — и требуются месяцы пристального наблюдения, исследований и усилий, прежде чем дело дойдёт до коммерческого успеха или неудачи».
Оригинальный текст (англ.)[показатьскрыть]It has been just so in all of my inventions. The first step is an intuition, and comes with a burst, then difficulties arise—this thing gives out and [it is] then that «Bugs»—as such little faults and difficulties are called—show themselves and months of intense watching, study and labor are requisite before commercial success or failure is certainly reached.
Во время Второй мировой войны словом bugs именовали проблемы с радарной электроникой.
По одной из версий, в отношении программной ошибки этот термин впервые был применен 9 сентября 1947 года[2] Грейс Хоппер, которая работала в Гарвардском университете с вычислительной машиной Harvard Mark II (англ.) (рус.. Проследив возникшую ошибку в работе программы до электромеханического реле машины, она нашла между замкнувшими контактами сгоревшего мотылька. Извлечённое насекомое было вклеено скотчем в технический дневник с сопроводительной иронической надписью: «Первый реальный случай обнаружения жучка» (англ. First actual case of bug being found)[3].
Значение и классификация ошибок программного обеспеченияПравить
В зависимости от этапа разработки ПО, на котором выявляется ошибка, выделяют:
- синтаксические ошибки (распознаваемые в качестве таковых транслятором и делающие компиляцию невозможной) — например отсутствие или несоответствие открывающей и закрывающей скобок;
- предупреждения (warnings) компилятора — например, использование неинициализированной переменной. В этом случае компилятор может заметить, что программист делает что-то необычное (вероятно неверное), и сообщает об этом, однако программист сам принимает решение, игнорировать сообщение или нет;
- ошибки времени исполнения, смысловые ошибки (семантические) — например вычитание переменных вместо сложения или ошибка сегментации.
По важности:
- Критические (иногда showstoppers) — лишающие программу всей полезности;
- Серьёзные;
- Незначительные;
- Косметические.
По времени появления:
- Постоянно, при каждом запуске;
- Иногда («плавающий» тип);
- Только на машине у клиента (зависит от локальных настроек у клиента).
По месту и направлению:
- Ошибки пользовательского интерфейса;
- Системы обработки ошибок;
- Ошибки, связанные с граничными условиями (например, некорректная обработка пустой строки или максимального числового значения);
- Ошибки вычислений;
- Ошибки управления потоками;
- Ошибки обработки или интерпретации данных;
- При состоянии гонки;
- Повышение нагрузки;
- Ошибки контроля версии и идентификаторов;
- Ошибки тестирования.
В зависимости от характера ошибки, программы и среды исполнения, ошибка может проявляться сразу или наоборот — долгое время оставаться незамеченной (например Проблема 2038 года).
Также ошибка может проявляться в виде уязвимости, делающей возможным несанкционированный доступ к системе или DoS-атаку.
РазновидностиПравить
- Борбаг — легко обнаруживаемая стабильная ошибка
- Гейзенбаг — сложно обнаруживаемая, периодически исчезающая и меняющая свойства, при попытке обнаружения, ошибка
- Мандельбаг — ошибка с очень сложным, хаотичным, поведением
- Шрёдинбаг — критическая ошибка, которая не проявляется, пока кто-нибудь на неё не наткнётся в исходном коде, после чего программа совершенно перестаёт работать
Поиск и исправление ошибокПравить
Для отладки программы (англ. debugging) разработчиками ПО используются специальные программы-отладчики (англ. debugger). Например, в операционной системе Windows можно использовать программу WinDbg из пакета Microsoft Debugging Tools for Windows. Для GNU/Linux и ряда других UNIX-подобных операционных систем существует отладчик GDB (GNU Debugger).
Отчёты об ошибкахПравить
Основная масса ошибок обычно отлаживается на этапе компиляции и тестирования программы. Однако некоторая часть ошибок всё же попадает в публикуемую версию и проявляется на компьютерах конечных пользователей в процессе эксплуатации ПО. Для повышения качества программного обеспечения пользуются специальными программами, цель которых — отловить ошибку в целевом приложении, собрать необходимую информацию о её симптомах и отправить отчёт по интернету к разработчикам данного ПО.
Например, в операционную систему Windows встроена утилита Dr. Watson, которая по умолчанию отлавливает ошибки в приложениях пользователя и отправляет отчёт на специальный Сервер компании Microsoft. Также в качестве примера можно привести аналогичные библиотеки Breakpad[4] и CrashRpt[5].
ПоследствияПравить
- Авария ракеты-носителя «Ариан-5» (4 июня 1996) — пример одной из самых дорогостоящих компьютерных ошибок в истории.
- Ошибки в программном обеспечении медицинского ускорителя Therac-25 привели к превышению доз облучения нескольких людей.
- Финансовая организация Knight Capital Group (англ.) (рус. потеряла 440 миллионов долларов за 45 минут из-за ошибки в программе высокочастотного трейдинга[6].
См. такжеПравить
ПримечанияПравить
- ↑ Источник: 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, стр.
- ↑ Log Book With Computer Bug (англ.). National Museum of American History. Дата обращения: 26 июля 2019. Архивировано 1 июня 2019 года.
- ↑ Danis, Sharron Ann: "Rear Admiral Grace Murray Hopper" (неопр.). ei.cs.vt.edu (16 февраля 1997). Дата обращения: 20 января 2015. Архивировано 15 июня 2010 года.
- ↑ Breakpad (неопр.). Google. Дата обращения: 11 августа 2009. Архивировано 3 февраля 2012 года.
- ↑ CrashRpt (неопр.). Архивировано 3 февраля 2012 года.
- ↑ Popper, Nathaniel. Knight Capital Says Trading Glitch Cost It $440 Million (англ.), New York Times (2 August 2012). Архивировано 5 октября 2017 года. Дата обращения: 13 ноября 2017.
СсылкиПравить
- Уязвимости в исходных кодах, «Компьютерная газета». Продолжение: Уязвимости в исходных кодах. Перепечатка: 1 часть (недоступная ссылка), 2 часть (недоступная ссылка).
- 10 худших ошибок в программировании в истории человечества
- 2010 CWE/SANS Top 25 Most Dangerous Software Errors частичный перевод на русский 25 самых опасных ошибок при создании программ
- Ошибки, обнаруженные в Open Source проектах разработчиками PVS-Studio с помощью статического анализа. Можно найти полезные примеры при подготовки статей и презентаций.