|
Для подавляющего большинства программистов характерно систематическое повторение в разных программах ошибок определенного типа. Это может быть использование неразрешенных индексов, неправильное применение операторов условного перехода, установление начального значения, равного единице, там, где оно должно быть равно нулю, и т. п. Повторение ошибок наблюдается особенно часто в тех случаях, когда программист работает с двумя или более языками: поскольку каждый язык имеет свои правила, их легко перепутать. Во избежание такой ситуации программисту полезно иметь список своих характерных ошибок, который он может использовать в качестве вспомогательного средства отладки.
Ниже приводятся две категории наиболее распространенных ошибок программирования. К первой из них относятся ошибки общего (несинтаксического) характера, которые остаются в программах после выполнения синтаксического контроля. Вторая категория включает ошибки специального вида, которые особенно трудны для выявления.
ОШИБКИ ОБЩЕГО ХАРАКТЕРА Логические ошибки
1. Неверное указание ветви алгоритма после проверки некоторого условия.
2. Неполный учет возможных условий.
3. Пропуск в программе одного или более блоков составленного алгоритма.
4. Ответвление по неверной метке.
Ошибки в циклах
1. Неправильное указание начала цикла.
2. Неправильное указание условий окончания цикла.
3. Неправильное указание числа повторений цикла.
4. Неверное индексирование цикла.
5. Бесконечные или замкнутые циклы.
Ошибки при работе с данными
1. Определение не всех возможных типов данных.
2. Отсутствие редактирования неверных данных.
3. Организация считывания меньшего или большего объема данных, чем требуется.
4. Неправильное редактирование данных или несоответствие действительных полей данных их описаниям.
Ошибки в описании переменных
1. Использование переменных без указания их начальных значений.
2. Не предусмотрено изменение содержимого счетчика или накопителя.
3. Неправильная установка значения программного ключа.
4. Использование неверного наименования переменной (т. е. ошибочное указание другой переменной).
Ошибки при работе с массивами
1. Отсутствие возможности присвоения нулевого значения массиву.
2. Неправильное описание достаточно больших массивов.
3. Неправильный порядок следования индексов.
Ошибки арифметических операций (см. также Ошибки в описании переменных)
1. Неверное указание типа переменной (например, целочисленной вместо действительной).
2. Переполнение и потеря значимости.
3. Использование неверных констант.
4. Неверное определение порядка действий.
5. Деление на нуль.
6. Извлечение квадратного корня из отрицательного числа.
7. Потеря значащих разрядов числа.
Сшибки в подпрограммах^
1. Неправильное описание функции.
2. Неправильное указание требуемых параметров подпрограммы.
3. Неверное число параметров.
4. Неверные значения параметров.
Ошибки ввода-вывода (см. также Ошибки при работе с данными)
1. Неправильный выбор спецификаций формата ввода-вывода.
2. Невыполнение операций перемотки (или установки) магнитной ленты перед чтением или записью информации.
3. Использование записей неправильной длины или неверного формата.
Ошибки в цепочках символов
1. Указание неверной длины цепочки символов.
2. Обращение к символу за пределами строки.
Ошибки логических операций
1. Неправильное применение логического оператора.
2. Сравнение переменных разного типа.
3. Пропуск оператора ELSE в сложных операторах IF, включающих множество условий.
Ошибки машинных операций
1. Неправильный сдвиг числа.
2. Неверное использование машинной константы (например, в десятичной форме вместо требуемой шестнадцатеричной).
Ошибки в применении разделителей
1. Отсутствие признака конца оператора.
2. Отсутствие признака окончания комментария.
3. Использование открывающих кавычек вместо закрывающих и наоборот.
4. Несогласованность кавычек в пределах строки.
5. Преждевременное появление символа признака конца.
Прочие ошибки
1. Неправильное использование полей операторов.
2. Использование неподходящей функции.
ОШИБКИ СПЕЦИАЛЬНОГО ВИДА
Семантические ошибки
Вызываются неглубоким пониманием действия той или иной команды, например убежденностью в том, что результаты арифметических операций округляются. Другим примером подобных ошибок может служить неправильное предположение, что цикл не будет выполняться, если конечное значение переменной цикла меньше начального. В ФОРТРАНе фирмы IBM при использовании оператора DO циклы выполняются всегда.
Ошибки в расстановке семафоров
Этот тип ошибок имеет место в тех случаях, когда в ходе вычислений процесс А ожидает выполнения процесса В, а процесс В— выполнения процесса А. Характерен для систем большой сложности, таких, как операционные системы. Складывающаяся в результате указанных ошибок аварийная ситуация называется самозамыканием или клинчем (deadly embrace).
Ошибки в синхронизации операций
Такие ошибки возникают в тех случаях, когда две операции зависят друг от друга по времени, т. е. операция В не может начаться, пока -не будет завершена операция А. Если же операция В начинается преждевременно, то возможно появление ошибок синхронизации. Ошибки этого типа, так же как и ошибки в расстановке семафоров, называются ситуационными.
Ошибки, связанные с неправильным результатом операции
Возникают в результате машинных ошибок. Иногда неопытные программисты забывают о том, что машина выполняет арифметические операции в двоичной системе счисления; это приводит к тому, что, например, выражение
1.0/5.0* 5.0
не равно единице. Появляющаяся здесь машинная ошибка распознается при прогоне теста следующего содержания:
А = 5.0 В = 5.0
If'(1.0/A*B .EQ. 1.0) ...
В результате выполнения последнего условного оператора возникает непредусмотренная ситуация, и возможно зацикливание.
Исчезающие ошибки
Еще один тип ошибок, обычно не проявляющий себя до начала эксплуатации программы в рабочем режиме, — это так называемые исчезающие ошибки, которые внезапно появляются и затем могут не давать о себе знать в течение нескольких месяцев. Эти ошибки не повторяются даже в том случае, если новые прогоны программы выполняются с идентичными данными и на той же самой машине. Примером таких ошибок может служить программный ключ, не установленный в начальное положение, но сохраняющий обычно правильное значение благодаря специфике работы машины, которая в данной области памяти хранит нули.
Может случиться и так, что подобные ошибки будут исчезать с включением средств отладки. Автору, например, пришлось однажды безрезультатно потратить два месяца на поиски исчезающей ошибки и в конце концов переписать программу заново.
Ошибки с восстановлением
Эти ошибки имеют место при отказах оборудования или системного программного обеспечения. Термин "ошибки с восстановлением" подчеркивает, что в случае нарушения нормального функционирования системы по той или иной причине (исчезновение питающего напряжения, поломка диска и т. п.) нежелательно полное разрушение или частичное повреждение файлов.
Ошибки, связанные с перегрузкой системы
Ошибки подобного рода имеют место лишь тогда, когда превышается объем внутренних таблиц, буферных накопителей или прочих участков памяти. Эти ошибки губительно действуют на системы, работающие в режиме реального времени, но могут не проявляться годами, пока не создастся соответствующая ситуация. Трудно, например, ответить на вопрос о том, что произойдет, если все пользователи системы, работающей в режиме с разделением времени, попытаются одновременно получить доступ к одному и тому же диску?
⇐4.25. Утверждения || Оглавление || 4.27. Двумерность программ⇒
|