Для отладки malloc рассмотрите возможность размещения пробела между вашей структурой управления и началом пользовательских данных, а также между конечными данными пользователя и контрольной суммой. Один байт заполнения должен быть нулевым байтом 0x00, поэтому операции с строкой останавливаются; подумайте о том, чтобы положить другой как 0xFF. Если у вас есть фиксированный паттерн и пятно, которое оно изменило, вы знаете, что что-то вышло из-под контроля - но есть больше шансов, что ваши конфиденциальные данные управления не будут растоптаны. Если вы используете 16 байт заполнения любой стороны пространства, выделенного для пользователя, вы можете дойти до 4 байтов нулей, подходящим образом выровненных (следовательно, нулевое 4-байтовое целое число) и, возможно, 0xFFFFFFFF для -1. Кроме того, поскольку вы, вероятно, округлите запрошенный размер до кратного вашего базового размера блока, установите байты, которые не для пользователя, использовать с известным значением, и подтвердите, что они остаются неизменными. Это обнаружит модификации «один над выделенной длиной» или всего несколько байтов по выделенной длине, которые в противном случае могут остаться незамеченными.
Единственным недостатком нулевого байта в заполнении является то, что вы не будете легко обнаруживать операции чтения, которые не останавливаются в конце выделенной памяти при поиске нулевого байта. Вы могли бы получить представление об этом, имея альтернативный вариант, который использует заполнение без нулевых байтов в нем.
Еще один вариант, который следует рассмотреть, состоит в том, чтобы полностью удалить ваши управляющие данные из памяти, возвращенной пользователю. Конечно, полное разделение невозможно, но, по крайней мере, поддерживать список распределений (с размерами и указателями) отдельно от выделенных блоков. Опять же, это дает вам защиту, помещая ваши драгоценные данные управления дальше от неконтролируемых операций по потере памяти. Вы не полностью защищены от странных указателей, но вы лучше защищены. (И вы все равно можете создавать буферные зоны вокруг выделенного пространства для обнаружения записи без контроля). Однако этот дизайн заметно отличается от вопроса.
Предполагая, что вы получите ваш блок памяти из «таНос()», то вы могли бы сделать - грубо:
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;
}
Существует некоторая интерпретация осталось сделать ...
выглядит как домашнее задание мне. – jldupont
Я не просил ни одного кода! – BumbleBee
HappierUser, если это домашнее задание .. просто отметьте его как таковое (я не буду редактировать этот пост). Вы проделали большую работу самостоятельно и, очевидно, понимаете, что вы пытаетесь реализовать, у вас не будет проблем с получением полезных ответов. Пожалуйста, подумайте о повторной пометке, если это (действительно) домашнее задание или что оно не в вашем вопросе иначе. –