Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная 16

.docx
Скачиваний:
4
Добавлен:
18.07.2022
Размер:
100.69 Кб
Скачать

Санкт-Петербургский политехнический университет Петра Великого

Институт компьютерных наук и технологий

Высшая школа интеллектуальных систем и суперкомпьютерных технологий

ЛАБОРАТОРНАЯ РАБОТА №2

«Исключительные ситуации по защите памяти»

по дисциплине «Архитектура вычислительных систем»

Выполнил

студент гр. 3530903/80001 А. В. Шильникова

Руководитель Н. М. Вербова

«___» __________ 2021 г.

Санкт-Петербург

2021

1. Имитация нарушения защиты области памяти

Напишем программу, которая обращается к элементу массива, за его пределами.

int iMas[2] = { 0, 0 };

int main() {

std::cout << iMas[10000] << std::endl;

return 0;

}

Выполнение программы привело к исключению

0x00CE192C – исполнительный адрес

0x00CF411C – недопустимый адрес, выходящий за сегмент

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

2. Реакция на исключительную ситуацию

Обработаем исключение конструкцией __try __except

int iMas[2] = { 0, 0 };

int main() {

__try {

std::cout << iMas[10000] << std::endl;

}__except(EXCEPTION_EXECUTE_HANDLER) {

printf("Exception!\nAddress: %08x\nCode: %08x\n", &iMas[10000],

GetExceptionCode());

}

return 0;

}

Консоль вывела сообщение “Exception!”, недопустимый адрес и код ошибки.

Exception!

Address: 00205d78

Code: c0000005

3. Модификация программы

Модифицируем программу, чтобы она моделировала исключения для четырех случаев:

- обращение к области глобальных данных

- обращение к области локальных данных

- обращение к данным, для которых память выделена динамически

- обращение к области кода.

При доступе

Выделенная память:

Для глобальной переменной: 5964 байт

Для локальной переменной: 252 байт

Для динамической переменной: 8866 байт

Для области кода: 16206 байт

4. Увеличение размеров данных в программе

Увеличим размер переменных в 100 раз.

Выделенная память:

Для глобальной переменной: 6988 байт. Увеличилась на 1024 байт.

Для локальной переменной: 1319 байт. Увеличилась на 1067 байт.

Для динамической переменной: 1202 байт. Уменьшилась на 7664 байт.

Для области кода: 17229 байт. Увеличилась на 1023 байт.

5. Вывод

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