2012-06-18 2 views
1

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

Я сомневаюсь, что будет переносное решение, но какой лучший метод для платформы, использующий Microsoft C на Windows и GCC на Linux соответственно?

+1

Там же [функция Windows API, который фактически используется, чтобы сделать что-то подобное] (http://blogs.msdn.com/b/oldnewthing/archive/2012/02/10/10266256. aspx), хотя поведение было удалено в Windows Vista, потому что люди сообщали об этом как уязвимость безопасности, даже если это не так. –

+1

Блок управления памятью работает в гранулярности страниц, и вы можете выделять массивы, которые не заканчиваются на границах страниц - в этом случае недопустимый доступ к памяти между концом массива и границей страницы не будет обнаружен. – smichak

+0

А, похоже, механизм, используемый этой функцией, все еще доступен? Это похоже на решение для Windows. - И да, я полагаю, что мне нужно будет выделить соответствующие массивы на границах страниц. – rwallace

ответ

2

На самом деле есть переносной способ обнаружения перераспределения памяти в программном обеспечении. Dmalloc обеспечивает обнаружение fencepost перезапись

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

http://dmalloc.com/docs/latest/online/dmalloc_17.html#SEC22

+0

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

+0

Существует также http://valgrind.org/ –

+0

Вы также можете расширить или настроить компилятор GCC для своей цели (с плагином или расширением MELT). http://gcc-melt.org/ может быть подходящим инструментом для этого. –

Смежные вопросы