Frage

Relevante Code ist dies:

typedef unsigned long int chunk_head;

typedef struct malloc_chunk
{
    // Contains the size of the data in the chunk and the flag byte.
    chunk_head      head;

    // Deliberately left unsized to allow overflow. 
    // Contains the payload of the chunk.
    unsigned int    data[];
};

Und nur als Beispiel, die "get" Makro ist dies:

//Get the size of the data contained within the chunk.
#define GET_CHUNK_SIZE(chunk) ((chunk.head) & 0xFFFFFF)

Das obere Byte Ich verwende die Bits für flags - „inuse“ und „kann verschmolzen werden“, und alle weiteren, die ich nützlich sein wird finden

.

Jetzt, wo ich Hintergrundinformationen getan Bereitstellung, wie ich im Titel angegeben, muss ich der Lage sein, die unteren 3 Bytes zu ändern, wie groß der Brocken ist. Mein erster Instinkt war und der Header mit der Größe bitweise, da sie richtig ausgerichtet werden würden, aber dann merkte ich, es könnte auch das Flag-Bytes überschrieben werden soll, weil es Nullen automatisch vorangestellt, bis sie eine Größe, die lange abgestimmt. Ich bin nicht einmal sicher, dass Sie können bitweise AND ein int und ein langer. Wie auch immer, Hilfe wird sehr geschätzt.

War es hilfreich?

Lösung

Wie wäre:

head = (head & 0xff000000) | (new_size & 0x00ffffff)

Andere Tipps

Aus irgendeinem Grund die meisten der Antworten, die Sie bisher erhalten beharren die potenzielle Größe Überlaufproblem unter den Teppich zu kehren, dh sie sind „und“ die Blockgröße mit 0x00FFFFFF so leise die übermäßige Größe Bits verworfen (falls vorhanden) und dann gehen den völlig bedeutungslos Schwanzteil der Größe in das Feld zu schreiben. Ich weiß nicht, warum jemand so etwas tun würde.

Der vernünftige Code könnte wie folgt aussehen

assert((size & 0xFF000000) == 0);
chunk.head = (chunk.head & 0xFF000000) | size;

Es gibt keinen triftigen Grund „und“ die Größe mit 0x00FFFFFF. Sie sollten entweder abbrechen oder zumindest behaupten, auf übermäßige Größe, nicht leise die überschüssige verwerfen.

Verwenden Bit-Felder, dies zu tun. Es wird vermieden, dass die Makros, schön im Debugger verwenden, auch:

typedef struct chunk_head {
  unsigned size:24;
  unsigned inuse:1;
  unsigned cancoalesce:1;
  // Room for 6 more...
};

typedef struct malloc_chunk {
  struct chunk_head head;
  int data[];
};

chunk.head = (chunk.head & ~0xffffffL) | (new_lower_bits)

// retain the old top 8 bits
chunk.head &= 0xFF00000000

// set the lower 24 bits
chunk.head |= (0x00FFFFFF & new_bits)
#define SET_CHUNK_SIZE(chunk, size) (chunk.head = (chunk.head & 0xFF000000) | (size & 0x00FFFFFF))

Ist das, was Sie gemeint oder habe ich etwas verpasst?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top