Защитный байт
Защитный байт [ нужна ссылка ] — это часть компьютерной программы , памяти которая помогает разработчикам программного обеспечения обнаруживать переполнение буфера во время разработки программы.
Принцип
[ редактировать ]Когда программа компилируется , для отладки все выделения памяти предваряются и постфиксируются защитными байтами. выделения памяти Специальные процедуры могут затем выполнять дополнительные задачи для определения нежелательных попыток чтения и записи за пределами выделенной памяти. Эти дополнительные байты помогают обнаружить, что программа записывает (или даже читает) неподходящие области памяти, что может привести к переполнению буфера . В случае доступа к этим байтам с помощью алгоритма программы программист получает предупреждение с информацией, помогающей обнаружить проблему.
Проверка несанкционированного доступа к защитным байтам может осуществляться двумя способами:
- установив в памяти точку останова при условии записи и/или чтения этих байтов, или
- путем предварительной инициализации защитных байтов определенными значениями и проверки значений при освобождении.
Первый способ возможен только с помощью отладчика , который обрабатывает такие точки останова, но значительно увеличивает вероятность обнаружения проблемы. Второй способ не требует никаких отладчиков или специальных сред и может быть реализован даже на других компьютерах, но о переполнении программист предупреждается только при освобождении, которое иногда происходит довольно поздно.
Поскольку защитные байты требуют выполнения дополнительного кода и выделения дополнительной памяти, они используются только при компиляции программы для отладки. При компиляции в виде релиза защитные байты вообще не используются, как и подпрограммы, работающие с ними.
Пример
[ редактировать ]Программист хочет выделить буфер из 100 байт памяти во время отладки. выделения системной памяти Вместо этого процедура выделит 108 байтов, добавив 4 ведущих и 4 конечных защитных байта, и вернет указатель , сдвинутый на 4 ведущих защитных байта вправо, скрывая их от программиста. Затем программист должен работать с полученным указателем, не зная о наличии защитных байтов.
Если алгоритм программиста записывает прямо за пределы назначенного пространства, он перезапишет защитные байты. Позже, после освобождения, процедура освобождения проверит, изменены ли защитные байты, и при необходимости сообщит об ошибке.
Проблемы
[ редактировать ]Процедуры выделения памяти заполняют защитные байты значениями, которые не должны использоваться алгоритмами программиста. Однако это непредсказуемо. Когда алгоритм использует эти значения и перезаписывает ими защитные байты (имеет значение только последняя запись перед освобождением), переполнение невозможно обнаружить, поскольку байты фактически не изменились. Вместо этого можно использовать опцию точки останова памяти, устанавливаемую при условии доступа к этим байтам в отладчике.