Страницы

Поиск по вопросам

воскресенье, 29 декабря 2019 г.

Чем опасен выход за границы массива?

#cpp #массивы


Можно ли оставлять выход за границы массива в программах? Чем это грозит? Что происходит
при выходе за его границы?
    


Ответы

Ответ 1



В современных операционных системах память каждого процесса существует отдельно от других процессов. Программа не может просто так получить доступ к памяти чужого процесса. Проверка осуществляется операционной системой, причём поддержка этого реализована аппаратно в современных процессорах. Это сделано для защиты, чтобы неправильно работающая программа не могла нарушить работу других. Представим память следующим образом: |___память_вашей_программы___массив|___память_чужой_программы___| В данном случае массив расположен в конце области памяти вашей программы. Если произойдёт выход за границу массива, то получится обращение к области памяти чужой программы. Операционная система этого не позволит, произойдёт исключение. А что если массив расположен так: |___сегмент_данных___массив\сегмент_кода___| В каждой программе есть сегмент(ы) кода и сегмент(ы) данных. На уровне операционной системы разным сегментам разрешены разные действия: чтение, запись, исполнение. Это, опять-таки, сделано для обеспечения надёжности. В сегмент кода запись запрещена. Соответственно, и в данном случае, если произойдёт обращение за пределами массива, тоже будет выброшено исключение. Третий вариант: |___сегмент_данных___массив___сегмент_данных___| В этом случае выход за пределы массивы не приведёт к исключению, операционная система не может отследить его своими силами, т. к. процесс имеет полное право писать в свой сегмент данных. Просто при этом будут либо прочитаны данные, не относящиеся к массиву, либо повреждены (переписаны) эти данные.

Комментариев нет:

Отправить комментарий