Шаг 3.
Систематические и случайные ошибки

    На этом шаге мы рассмотрим систематические и случайные ошибки.

    Некоторые ошибки являются систематическими; они возникают всякий раз при выполнении программы. Если в команде на вычисление по заданной формуле вместо плюса поставить минус, то и ответ, скорее всего, будет ошибочным. Такие ошибки в программах обычно живут недолго: их быстро обнаруживают и исправляют. Приведем интересный пример систематической ошибки в программном интерфейсе.

    19 июня 1985 года команда американского корабля многоразового использования "Шаттл" должна была развернуть свой корабль так, чтобы зеркало на его борту могло отражать луч лазера, находившегося на горе высотой 10023 фута. Навигационная система пыталась развернуть "Шаттл" так, чтобы принимать луч с вершины несуществующей горы высотой в 10023 морских миль над уровнем моря. Это произошло из-за того, что один из пары взаимосвязанных компонентов программно-аппаратного комплекса передавал высоту в футах, а другой - интерпретировал эту величину в милях.

    Другие ошибки носят случайный характер; при каждом выполнении программы они будут приводить к разным результатам, либо программа может выполняться в большинстве случаев правильно, но время от времени неожиданно давать неверный результат. Такие случайные ошибки следует стараться выявить на этапе ручной проверки, потому что при машинном выполнении программы они могут "исчезнуть" лишь для того, чтобы снова появиться позже.

    В некотором смысле достаточно сложная программа напоминает карточный домик: тот факт, что домик стоит, еще не гарантирует, что он не рассыплется в следующее мгновение. Программы опровергают опыт нашей жизни. Обычно, если что-то работает, то оно работает! Если новый стул выдержал Вас, он выдержит Вас и в следующий раз; если сошедший с конвейера автомобиль проехал один километр, он сможет проехать еще сотни километров; если здание простояло 5 минут, то, как уверяют строители и архитекторы, оно простоит еще сто лет.


    Показательны в этом отношении результаты первых попыток запуска "Шаттла". Программное обеспечение этого космического корабля состояло примерно из полумиллиона программных строк, над которыми трудился большой коллектив разработчиков. Корабль не смог оторваться от Земли из-за нарушения синхронизации всех его компьютеров. Оказалось, что программная ошибка, явившаяся причиной неудачи, была внесена нечаянно при исправлении другой ошибки, обнаруженной двумя годами раньше, и могла проявляться в среднем только в одном из 67 полетов.

    Одна из наиболее типичных случайных ошибок возникает, если Вы забыли инициализировать переменную, то есть присвоить ей начальное значение. В этом случае начальное значение переменной зависит от того, какая программа (назовем ее Р) выполнялась на компьютере перед тем, как была загружена отлаживаемая программа. Если Ваша переменная имеет адрес а, то программа Р может оставить после своего выполнения в ячейке по адресу а "все, что угодно" - код команды, значение переменной, значение адреса переменной (мусор, то есть произвольное, непредсказуемое значение).

    Еще одной часто встречающейся случайной ошибкой является запись данных в массив, когда значение индекса вышло за допустимые пределы. Если, например, Вы присваиваете начальное значение элементу массива T(J), а значение индекса J должно находиться в границах от 1 до 100, но J случайно оказалось в какой-то момент больше 100 либо меньше 1, то Вы, разумеется, получите не тот результат, который хотели. Если Вы часто совершаете ошибку такого рода, Вам полезно написать несколько операторов, которые будут проверять значения каждого индекса перед его использованием и фиксировать его выход из установленного диапазона. Конечно, это увеличивает время выполнения программы, но заметно ускоряет процесс отладки.

    В заключение - полезный совет:


    Каждый раз, когда Вы обнаруживаете ошибку, заносите ее в этот список и обязательно проверяйте, чтобы она не повторилась в дальнейшем!

    Со следующего шага мы начнем рассматривать некоторые классические приемы тестирования программ.

Предыдущий шаг Содержание Следующий шаг