Лабораторная 16
.docxСанкт-Петербургский политехнический университет Петра Великого
Институт компьютерных наук и технологий
Высшая школа интеллектуальных систем и суперкомпьютерных технологий
ЛАБОРАТОРНАЯ РАБОТА №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. Вывод
В ходе работы были разобраны способы защиты от исключительных ситуаций, связанных с доступом к памяти, а также рассмотрена возможность доступа и изменения различных областей памяти.