Шаг 5.
Ручная проверка
На этом шаге мы рассмотрим организацию ручной проверки.
Отладку любой программы никогда не следует начинать с прогона программы на компьютере,
так как экспериментально установлено, что "ручными" методами (то есть без помощи компьютера)
удается обнаруживать от 30 до 70% программных и аналитических ошибок из общего числа ошибок,
допущенных при программировании!
Вначале обязательно проведите ручную проверку (Desk Checking), которая есть не
что иное, как тщательная проверка Вашей программы за письменным столом. При ручной проверке
программы (или алгоритма) программист по тексту программы мысленно старается восстановить тот
вычислительный процесс, который определяет программа, после чего сверяет его с требуемым процессом.
Самое главное, о чем всегда следует помнить, это то, что ошибки в проверяемой программе обязательно
есть и, чем больше их будет обнаружено за столом, тем легче и быстрее пройдет предстоящий этап
отладки программы на компьютере. На время проверки нужно постараться "забыть" о том, что должен делать
проверяемый участок программы, и "узнавать" об этом по ходу его проверки. Только после окончания
проверки участка и выявления тем самым его действительных функций можно "вспомнить" о том, что он
должен делать, и сравнить реальные действия программы с требуемыми.
Полезно, найдя какую-либо специфическую ошибку, отойти от последовательной проверки и сразу узнать,
нет ли таких же ошибок в аналогичных, в особенности уже проверенных, местах.
Приведем примерный список вопросов, на которые отвечает программист при ручной проверке программы.
- Есть ли обращения к переменным, которым не присвоены значения? Присваивайте начальные значения
переменным перед тем, как они будут использованы. Убедитесь в том, что переменным в программах и
во внутренних циклах присваиваются соответствующие значения при каждом входе в них.
- Не выходит ли значение индекса элемента массива за границы, определенные для соответствующего измерения,
при всех обращениях к массиву?
- Принимает ли каждый индекс целые значения при всех обращениях к массиву? Нецелые индексы
не являются ошибкой для многих языков программирования, но представляют практическую опасность.
- Все ли переменные описаны явно? Отсутствие явного описания не обязательно является ошибкой, но обычно служит источником беспокойства.
- Есть ли переменные со сходными именами (например, VOLT и VOLTS)? Наличие сходных
имен не обязательно является ошибкой, но служит признаком того, что имена могут быть перепутаны где-нибудь внутри программы.
- Возможны ли переполнение или исчезновение порядка во время вычисления значения выражения?
Это означает, что конечный результат может казаться правильным, но промежуточный результат может быть слишком большим
(переполнение) или слишком малым (исчезновение порядка) для машинного представления данных.
- Учтено ли, что делитель при делении может обратиться в нуль?
- Может ли значение переменной выходить за пределы установленного для ее типа диапазона?
- Сравниваются ли величины различных типов?
- Корректны ли операции сравнения? Обычно часто путают такие операции отношения, как "не меньше, чем",
"не больше, чем".
- Каждоe ли логическое выражение сформулировано так, как это предполагалось?
Программисты часто делают ошибки при написании логических выражений, содержащих операции NOT, AND, OR.
- Будет ли каждый цикл в конце концов завершен? Придумайте неформальное доказательство
или аргументы, подтверждающие их завершение. Старайтесь не использовать числа с плавающей
запятой в качестве значений счетчиков. Для дробных величин с плавающей запятой не всегда справедливы
известные правила арифметики [1].
- Будет ли программа или подпрограмма в конечном счете завершена?
- Возможно ли, что некоторый цикл никогда не сможет выполниться? Если это так,
то является ли это оплошностью?
- Совпадают ли количество и тип формальных и фактических параметров используемых подпрограмм?
- Совпадают ли единицы измерения значений соответствующих фактических и формальных
параметров? Например, нет ли случаев, когда значение фактического параметра выражено в градусах,
а в подпрограмме все расчеты проводятся с формальным параметром, выраженным в радианах.
- Не изменяет ли подпрограмма значения переменной, которая используется только как входная величина?
- Все ли файлы открыты перед их использованием?
- Существуют ли смысловые или грамматические ошибки в тексте, выводимом программой на печать или на экран дисплея?
(1) Керниган Б., Плоджер Ф. Элементы стиля программирования. - М.: Радио и связь, 1984.
На следующем шаге мы поговорим о ручной прокрутке.
Предыдущий шаг
Содержание
Следующий шаг