Открыть сервисСервис

Баги в программировании

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

Происхождение термина

Самое известное объяснение происхождения слова связано с Грейс Хоппер, работавшей в 1940-х годах над компьютером Harvard Mark II. В сентябре 1947 года в реле машины был обнаружен мёртвый мотылёк, который вызывал замыкание и сбой в работе. Инцидент был задокументирован в журнале лаборатории с подписью «First actual case of bug being found» («первый реальный случай обнаружения бага»). Этот эпизод популяризировал термин, хотя слово «bug» в инженерии использовалось и раньше — так называли неисправности в телеграфии и радиотехнике.

Причины возникновения

Баги появляются по разным причинам, и большинство из них связано с человеческим фактором:

  • Логические ошибки в коде — неверная реализация алгоритма, неправильная обработка граничных условий, ошибки в условиях и циклах.
  • Ошибки памяти — обращение к неинициализированным переменным, утечки памяти, выход за границы массивов, двойное освобождение указателей.
  • Гонки данных — некорректное взаимодействие потоков, из-за которого результат выполнения зависит от порядка их планирования.
  • Ошибки ввода-вывода — некорректная обработка файлов, сети, пользовательского ввода, отсутствие проверки на пустые или некорректные данные.
  • Проблемы совместимости — различия в поведении на разных ОС, браузерах, версиях библиотек.
  • Неполные требования — если спецификация составлена с пробелами, разработчик реализует не то, что ожидалось.

Классификация

Баги различают по нескольким признакам.

По тяжести последствий:

КлассОписание
КритическийПриводит к потере данных, сбою системы, нарушению безопасности
СерьёзныйОсновная функция недоступна, обходных путей нет
ОбычныйФункция работает некорректно, но есть обходной путь
НезначительныйКосметическая ошибка, не влияющая на работу

По типу:

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

Жизненный цикл бага

В корпоративной разработке баги проходят типовой цикл: обнаружение → регистрация в трекере (например, Jira, Bugzilla, Redmine) → назначение приоритета → исправление → проверка (регрессионное тестирование) → закрытие. Хорошо построенный процесс предполагает, что каждый баг имеет уникальный идентификатор, описание, шаги воспроизведения, ожидаемое и фактическое поведение.

Методы обнаружения и предотвращения

  • Ручное тестирование — тестировщик воспроизводит сценарии и фиксирует отклонения.
  • Автоматизированное тестирование — юнит-тесты, интеграционные тесты, прогоняются при каждой сборке.
  • Статический анализ — инструменты (например, SonarQube, PVS-Studio, Coverity) ищут подозрительные конструкции без запуска программы.
  • Код-ревью — проверка кода коллегами до вливания в основную ветку.
  • Fuzzing — автоматическая генерация случайных входных данных для поиска сбоев и уязвимостей.
  • Метод Фейманна — в чистом виде не применяется, но в инженерной практике используется принцип «сначала воспроизвести, потом чинить».

Баги и уязвимости

Часть багов представляет особый интерес для кибербезопасности. Классические примеры — переполнение буфера (Buffer Overflow), SQL-инъекции, ошибки проверки прав доступа. Такие дефекты публикуются в базах уязвимостей (CVE, NVD) и могут использоваться для атак, поэтому для их исправления часто выпускаются внеочередные патчи.

Интересные факты

  • В 1996 году ракета «Ариань-5» разрушилась через 37 секунд после старта из-за переполнения 64-битного числа, записанного в 16-битную переменную — ошибка при переносе кода с «Ариань-4».
  • Баг в программе Therac-25 (1985–1987 годы) привёл к передозировке радиации у нескольких пациентов.
  • Некоторые баги живут десятилетиями: известны случаи, когда ошибка, заложенная в 1970-е годы, обнаруживалась в 2010-е.

Источники

  • Гейл Л. Рамзоу, Томас К. Линда. «Язык программирования C»
  • Стив Макконнелл. «Совершенный код»
  • История Harvard Mark II и журнал лаборатории Harvard Computation Laboratory (1947)
  • Стандарты ISO/IEC 25010 (классификация качества ПО)
  • Базы уязвимостей CVE/NVD
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru