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

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

Запись/чтение за границами структуры данных или ее элемента

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

Чтение за пределами буфера сообщения

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

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

Дополнение переменных до полного слова

Слово — это единица, используемая компилятором для операций с па­мятью. Оно может быть длиной в 12 бит, 1, 2, 3 или 4 байта и т.д. Если длина переменной меньше слова, некоторые компиляторы дополняют ее до полного слова, так что переменная, в которую записано значение 255, на самом деле может хранить 00255. Дополняться могут как отдельные пере­менные или элементы массива, так и массив целиком — правила зависят исключительно от компилятора. Более того, два компилятора одного и того же языка могут действовать по-разному. Так что, если программист рассчи­тывает длину определенной структуры данных и основывает некоторые действия программы на этой информации, а затем меняет компилятор, программа может работать неправильно.

Переполнение и выход за нижнюю границу стека данных

Несколько ранее рассматривались проблемы, связанные с хранением в стеке адресов возврата и параметров вызываемых подпрограмм. Стеки используются программистами не только для этого — в них могут хранить­ся данные.

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

Предположим, что размер стека — 256 байтов, а программист пытает­ся записать в него 300 байтов. Стек переполняется. В нем обычно остаются последние 256 байтов данных, а первые 44 затираются. Когда программа извлекает данные из стека, она получает 256 байтов и выходит на нижнюю границу стека, т.е. обнаруживает, что он пуст.

Затирание кода или данных другого процесса

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

Проблемы с обменом сообщений

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

Отправка сообщения не тому процессу или не в тот порт

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

Ошибка распознавания полученного сообщения

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

Недостающие или несинхронизированные сообщения

Один процесс может посылать сообщения другому в заранее определен­ном порядке. Однако иногда получается, что СООБЩЕНИЕ_1 приходит