Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тестирование программного обеспечения. Фундамен...docx
Скачиваний:
0
Добавлен:
10.02.2020
Размер:
935.81 Кб
Скачать

506 Часть III: Управление проектами и группами

программа или центральный процессор разрешают ее тем, что просто уда­ляют из стека самое старое из хранящихся в нем значений и помещают в него новое. После этого из подпрограммы 3 управление передается под­программе 2, из подпрограммы 2 подпрограмме 1. А далее... куда переда­вать управление после завершения подпрограммы I — неизвестно. Такая ситуация называется выходом за нижнюю границу стека (stack underflow).

Выход из подпрограммы по GOTO вместо RETURN

Подпрограмма 1 вызывает подпрограмму 2. Последняя, вместо того чтобы нормально завершиться, осуществляет переход в процедуру 1 по команде GOTO. При этом адрес возврата из процедуры 2 остается в сте­ке. После завершения процедуры 1 выполняется переход по хранящемуся в стеке адресу — обратно в процедуру 1! Как правило, это не намеренное действие программиста, а ошибка. Чтобы ее избежать, процедура 2 долж­на сама удалить из стека свой адрес возврата и только потом осуществить переход в процедуру 1. Такая технология программирования чревата огром­ным количеством ошибок (выходами за нижнюю границу стека, возвратом не в ту процедуру, путаницей с возвращаемыми данными и т.п.), поэтому лучше всего ею не пользоваться.

Прерывания

Прерыванием называется специальный сигнал, по которому компьютер приостанавливает выполнение текущей программы и передает управление процедуре обработки прерываний. Позднее выполнение программы может быть продолжено. Типичными примерами событий, вызывающих прерыва­ния, являются события ввода/вывода, включая сигналы, поступающие от системного таймера.

Неверная таблица прерываний

Получив сигнал прерывания, процессор должен найти процедуру его обработки и передать ей управление. Адрес этой процедуры (возможно, вместе с некоторой дополнительной информацией) хранится в определен­ном месте памяти и называется вектором прерывания. По нему и осуществ­ляется переход. Если компьютер различает несколько типов прерываний, в его памяти хранится список адресов процедур их обработки, называемый таблицей прерываний.

Если таблица прерываний по каким-то причинам содержит неверную информацию, в ответ на прерывания возможны самые разнообразные ошибки. Если, например, векторы прерываний просто поменялись места­ми, программа может вести себя странно, пытаясь, например, отобразить на экране введенный символ в ответ на сигнал от системного таймера или реагировать на нажатия клавиш как на сигналы тайм-аута.

Приложение: Распространенные программные ошибки 507

Ошибки, связанные с модификацией программами таблицы прерываний

Программа может модифицировать таблицу прерываний, записав в нее новые адреса. Если это делается на время работы определенного модуля, перед завершением он должен восстановить исходные векторы прерываний. Возможно также, что программа запишет в таблицу прерываний неверный адрес или вообще ее запортит. В результате после очередного прерывания компьютер перейдет не к той подпрограмме или вообще “зависнет”.

Ошибки, связанные с блокированием прерываний

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

Неудачное возобновление работы программы после прерывания

Выполнение программы было прервано, а затем возобновлено. В неко­торых системах после возобновления программа получает сообщение или иное указание, что она была прервана. В сообщении обычно указывается тип прерывания (от клавиатуры, таймера, модема и т.п.). Это очень полез­но. Например, программа может обновить изображение на экране, предпо­лагая, что в ходе обработки прерывания оно могло быть изменено. Однако во встроенном в программу блоке обработки прерывания программист может допустить ошибку, например, передать дальнейшее управление не той подпрограмме. С ошибками такого рода программисты так же не лю­бят иметь дело, как и с ошибками в блоках обработки ошибок, и так же часто их пропускают.

Завершение работы программы

Некоторые языки программирования останавливают программу, когда в ней происходят ошибки определенных типов. Бывает также, что ни язык программирования, пи программист не предполагали остановки програм­мы, но она все же останавливается.

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