К чему может привести маленькая ошибка?

К чему может привести маленькая ошибка?

Недавно мне в руки попался первый выпуск «Толкового словаря» Лаборатории Касперского. Я на полчаса вернулся в детство и вспомнил, как сам изучал компьютеры по иллюстрированным книгам «Мир компьютеров», «Осваиваем микрокомпьютер», «Знакомьтесь: компьютер». Ведь намного понятнее, когда объяснения даны «на пальцах» с иллюстрациями, хоть и простыми. И очень здорово, что сейчас появляются такие словари, которые помогают начинающим пользователям прояснить основные определения из сферы компьютерной безопасности.

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

Историческая справка

Эта история случилась в далёком 1945 году, когда компьютеров было мало, да и те были большими и медленными. 9 сентября в 10:00 компьютер в Гарвардском университете — Марк I — остановился по непонятной причине. Уже тогда благодаря женщине по имени Грейс Хоппер были разработаны различные диагностические процедуры для определения неисправностей в компьютере. В 11:00 эти процедуры были запущены. Например, они включали в себя вычисления синуса/косинуса, умножение, сложение чисел. В 15:45 в результате тестов было обнаружено реле, которое и приводило к ошибке в вычислениях. Реле — это управляемый электро-механический переключатель и в цифровом компьютере этот переключатель может находиться в двух состояниях: ноль или единица. Марк I как раз и был собран на основе большого количества таких реле, в одном из которых была обнаружена обычная моль. Одна из возможных неисправностей может заключаться в том, что если моль попадёт между контактами реле (как показано на рисунке ниже), то при опускании якоря контакты не замкнутся, между контактами не будет тока. Таким образом, реле не будет реагировать на управляющий сигнал, и на выходах всегда будет наблюдаться отсутствие тока, что соответствует логическому нулю. Повторюсь, что это вольная интерпретация этой неисправности, приведённая здесь всего лишь для иллюстрации проблемы.

Дальнейшая судьба этого насекомого сложилась очень хорошо — его прикрепили липкой лентой к отчету об этой ошибке. Здесь присутствует интересная игра слов. В английской компьютерной терминологии «отчет об ошибке» звучит как «bug report». Bug — жучок, насекомое, но так же и «ошибка», тем более если используется в словосочетании «software bug». Позже, этот отчет был сфотографирован, и перепечатан в различных изданиях. Сам же отчёт нынче находится в компьютерном музее в Штате Вирджиния, США. Мы же можем посмотреть на фотографию ниже. Подпись под жучком: «Первый достоверный случай обнаружения насекомого (bug)». Вот так вот маленькая букашка оставила свой значимый след в истории.

Много воды утекло с тех времён. Трудно сегодня представить, что какая-то маленькая мошка может привести к поломке, например, ноутбука или Айпада. Да и отчеты об ошибках уже не пишутся на бумаге. Современные отчеты об ошибках вносятся в специальные онлайн-системы, чтобы контролировать ход починки этих ошибок.

Пример

Казалось бы: в компьютере миллионы логических элементов, что будет, если один из них перестанет работать? Разве остальных не будет достаточно, чтобы продолжить работать правильно? Ответ заключается в том, что компьютер — это детерминированное устройство. Иными словами, все данные и операции в нём строго определены. А это значит, что даже малейшее отличие в исходных данных может привести к результату, который отличается от ожидаемого. В этом отношении компьютер — капризный педантичный зануда.

Давайте попробуем смоделировать этот случай с мотыльком, который произошел 65 лет назад. Представьте себе, что на заводе сделали специальный калькулятор для школьников, который может выполнять только одну простую операцию: умножение чисел в диапазоне от 0 до 9. Известно, что числа внутри микропроцессора представляются в двоичной форме.

0 = 0000

1 = 0001

2 = 0010

3 = 0011

4 = 0100

5 = 0101

6 = 0110

7 = 0111

8 = 1000

9 = 1001

Предположим, что моль «проела» один бит в одном из аргументов, т. е. этот бит (например, второй справа) всегда будет равен нулю. (Ну хорошо, согласен, моль не может проесть микропроцессор. Давайте тогда представим, что при изготовлении интегральной схемы на один из токопроводящих слоёв упала маленькая пылинка и привела в негодность один транзистор.) Ниже показана таблица умножения для всех пар чисел в диапазоне от 0 до 9. Красным цветом выделен неисправный бит аргумента, а также те десятичные числа, которые в результате этой неисправности отличаются от правильных.

Видно, что одна маленькая ошибка привела к тому, что в 36 случаях из 100 наш неисправный калькулятор умножает неверно. Коварность такой маленькой ошибки заключается ещё и в том, что в остальных 64 случаях калькулятор считает верно. Например, можно попробовать умножить 5 на 5, или 8 на 2. Несмотря на присутствие дефекта в процессоре, в этих случаях калькулятор умножит верно, что может усыпить бдительность пользователя.

Хотели бы вы, чтобы калькулятор с такой ошибкой достался вам на важной контрольной? А на экзамене при поступлении в вуз? А если бухгалтер будет рассчитывать вам зарплату? А если такой микропроцессор будет стоять на космической ракете? Далеко ли она улетит? :)

Выводы

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

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

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


Карта сайта


Информационный сайт Webavtocat.ru