Для отладки malloc рассмотрите возможность размещения отступа между вашей структурой управления и началом пользовательских данных, а также между концом пользовательских данных и контрольной суммой. Один байт заполнения должен быть нулевым байтом 0x00 - поэтому строковые операции останавливаются; рассмотрите возможность добавления другого как 0xFF. Если у вас есть фиксированный шаблон и вы заметили, что он изменился, вы знаете, что что-то вышло за пределы допустимого - но есть большая вероятность, что ваши конфиденциальные контрольные данные не будут растоптаны. Если вы используете 16 байтов заполнения по обе стороны от пространства, выделенного пользователю, вы можете пойти так далеко, чтобы поставить 4 байта с нулями, соответствующим образом выровненных (отсюда и 4-байтовое целое число ноль) и, возможно, 0xFFFFFFFF для -1. Кроме того, поскольку вы, вероятно, округлите запрошенный размер до значения, кратного базовому размеру блока, установите для байтов, которые пользователь не должен использовать, известное значение - и подтвердите, что они остаются неизменными. Это позволит обнаружить модификации «один на выделенной длине» или всего несколько байтов на выделенной длине, которые в противном случае могут остаться незамеченными.
Единственный недостаток нулевого байта в заполнении заключается в том, что вы не сможете легко обнаружить операции чтения, которые не останавливаются в конце выделенной памяти при поиске нулевого байта. Вы можете получить представление об этом, имея альтернативную опцию, которая использует заполнение без нулевых байтов.
Другой вариант, который необходимо рассмотреть, - это попытка полностью отделить данные управления от памяти, возвращаемой пользователю. Конечно, полное разделение невозможно, но, по крайней мере, ведите список распределений (с размерами и указателями) отдельно от выделенных блоков. Опять же, это дает вам защиту, так как ваши драгоценные данные управления будут удалены от неконтролируемых операций по удалению памяти Вы не полностью защищены от ошибочных указателей, но вы защищены лучше. (И вы все еще можете предоставить буферные зоны вокруг выделенного пространства для обнаружения неконтролируемой записи.) Однако этот дизайн заметно отличается от вопроса.
Предполагая, что вы получаете блок памяти из 'malloc ()', вы должны сделать - примерно:
void *my_malloc(size_t nbytes)
{
size_t reqblocks = (nbytes + sizeof(header) - 1) / sizeof(header);
size_t reqspace = (reqblocks + 2) * sizeof(header) + 2 * sizeof(padding);
void *space = malloc(reqspace);
if (space == 0)
return space;
void *retval = (char *)space + sizeof(header) + sizeof(padding);
header *head = space;
head->next = ...next...;
head->size = nbytes;
...set head padding to chosen value...
...set tail padding to chosen value...
...set gap between nbytes and block boundary to chosen value...
return retval;
}
Осталось сделать некоторую интерпретацию ...