Verwenden Sie zum Debuggen von malloc möglicherweise Padding-Platz zwischen Ihrer Kontrollstruktur und dem Start der Benutzerdaten sowie zwischen dem Ende der Benutzerdaten und der Prüfsumme. Ein Byte des Auffüllens sollte ein Nullbyte 0x00 sein - so stoppen Zeichenkettenoperationen; überlege, einen anderen als 0xFF zu setzen. Wenn Sie ein festes Muster haben und feststellen, dass es sich geändert hat, wissen Sie, dass etwas in den Grenzbereich gerutscht ist - aber es besteht eine größere Chance, dass Ihre sensiblen Kontrolldaten nicht mit Füßen getreten wurden. Wenn Sie auf beiden Seiten des dem Benutzer zugewiesenen Speicherplatzes 16 Byte Padding verwenden, können Sie so weit gehen, 4 Bytes von Nullen passend ausgerichtet (also eine ganze Zahl von 4 Byte) und vielleicht 0xFFFFFFFF für -1 zu setzen. Da Sie die angeforderte Größe wahrscheinlich auf ein Vielfaches Ihrer Basisblockgröße aufgerundet haben, legen Sie die Bytes, die der Benutzer nicht verwenden soll, auf einen bekannten Wert fest - und bestätigen Sie, dass sie unverändert bleiben. Dadurch werden Änderungen von "Eins über die zugewiesene Länge" oder nur wenige Byte über die zugewiesene Länge erkannt, die ansonsten unerkannt bleiben könnten.
Der einzige Nachteil des Null-Byte in Padding ist, dass Sie Leseoperationen nicht erkennen, die nicht am Ende des reservierten Speichers anhalten, wenn Sie nach einem Nullbyte suchen. Sie könnten Einblick in diese erhalten, indem Sie eine alternative Option verwenden, die Padding ohne Nullbytes verwendet.
Eine andere Option, die in Betracht gezogen werden sollte, besteht darin, die Steuerdaten vollständig vom Speicher zu trennen, der an den Benutzer zurückgegeben wird. Natürlich ist eine vollständige Trennung unmöglich, aber zumindest eine Liste von Zuordnungen (mit Größen und Zeigern) getrennt von den zugewiesenen Blöcken. Auch dies schützt Sie, indem Sie Ihre wertvollen Kontrolldaten vor unkontrollierten Speichertrampeln schützen. Sie sind nicht vollständig vor fehlerhaften Zeigern geschützt, aber Sie sind besser geschützt. (Und Sie können weiterhin Pufferzonen um den zugewiesenen Speicherplatz herum bereitstellen, um außer Kontrolle geratenes Schreiben zu erkennen.) Dieses Design unterscheidet sich jedoch deutlich von der Frage.
Vorausgesetzt, dass Sie Ihren Speicherblock Suche von 'malloc()', dann würden Sie tun - etwa:
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;
}
Es gibt einige Interpretation noch zu tun ...
sieht aus wie Hausaufgaben mir. – jldupont
Ich habe keinen Code angefordert! – BumbleBee
HappierUser, wenn das Hausaufgaben sind .. bitte einfach als solches markieren (Ich werde diesen Beitrag nicht bearbeiten). Sie haben selbst viel Arbeit geleistet und verstehen offensichtlich, was Sie zu implementieren versuchen. Sie werden keine Probleme haben, hilfreiche Antworten zu erhalten. Bitte denken Sie darüber nach, die Tags erneut zu markieren, wenn dies tatsächlich Hausaufgaben sind, oder Sie bemerken, dass es sonst nicht in Ihrer Frage steht. –