Как MMU обнаруживает двойное освобождение указателя? - PullRequest
4 голосов
/ 13 февраля 2010

Как блок управления памятью (MMU) обнаруживает двойное освобождение указателя?

Я знаю, что рекомендуется делать указатель NULL сразу после его освобождения, но предположим, что программист этого не делает. Есть ли механизм MMU для его обнаружения?

Ответы [ 4 ]

13 голосов
/ 13 февраля 2010

MMU не имеет к этому никакого отношения. Если вы освободите указатель, выделенный с помощью malloc дважды, вы, вероятно, повредите кучу C времени выполнения. Куча (не MMU) в принципе может защитить себя от таких вещей, но большинство этого не делает. Обратите внимание, что это не имеет ничего общего с операционной системой - ни malloc (), ни free () не являются системными вызовами.

5 голосов
/ 13 февраля 2010
Как блок управления памятью (MMU) обнаруживает двойное освобождение указателя?

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

Как ОС обнаруживает двойное освобождение? Какой механизм ??

Он просматривает список / растровое изображение / ... выделенных блоков, видит, что нет выделенного блока с адресом, который вы ему передали, поэтому он обнаруживает, что это двойное освобождение.

Однако, если этот блок уже был перераспределен, он находит его и правильно освобождает его => но теперь код, который использовал перераспределенный блок, сойдет с ума, так как память, которую он правильно получил и что он не ' Выпуск стал нераспределенным.

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

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

(Спасибо Паскалю Куоку за указание на мою ошибку.)

3 голосов
/ 13 февраля 2010

Нет, нет механизма MMU для его обнаружения. Как правило, вызов free по уже свободному адресу вызывает сбой программы, поскольку внедрение free делает что-то неожиданное и вызывает ошибку сегментации.

Запуск valgrind - хороший способ проверки проблем с управлением памятью, таких как двойное освобождение указателя.

1 голос
/ 13 февраля 2010

Установка его в NULL на самом деле не очень хорошая практика, она скрывает ошибки. Особенно double free () s. Проверьте карту памяти ОС, обычно хорошо что-то вроде 0xfeeefeee или 0xdeadbeef.

Вы можете диагностировать double free () с помощью распределителя отладки. У большинства приличных ЭЛТ есть один.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...