1

関連するコードは次のとおりです。

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[];
};

例として、「get」マクロは次のとおりです。

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

フラグのビットを使用している上位バイト-「使用中」と「合体可能」、および私が見つけた追加のものは役に立ちます。

タイトルで述べたように、背景情報の提供が完了したので、下位 3 バイトをチャンクの大きさに変更できるようにする必要があります。私の最初の本能は、ヘッダーとサイズをビットごとに AND することでした。これは、ヘッダーが適切に整列されるためです。しかし、フラグ バイトも上書きされる可能性があることに気付きました。ビットごとに int と long を ANDできるかどうかさえわかりません。とにかく、大歓迎です。

4

6 に答える 6

7

どうですか:

head = (head & 0xff000000) | (new_size & 0x00ffffff)
于 2009-11-27T04:46:40.493 に答える
5

なんらかの理由で、これまでに受け取った回答のほとんどは、潜在的なサイズ オーバーフローの問題をカーペットの下に一掃することを主張しています0x00FFFFFF。サイズの無意味なテール部分をフィールドに入れます。どうしてそんなことをする人がいるのかわからない。

より合理的なコードは次のようになります

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

でサイズを「and」にする正当な理由はありません0x00FFFFFF。過剰なサイズを静かに破棄するのではなく、中止するか、少なくとも過剰なサイズをアサートする必要があります。

于 2009-11-27T05:02:41.477 に答える
3

これを行うには、ビット フィールドを使用します。マクロを使用する必要がなくなり、デバッガーでも使用できます。

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[];
};
于 2009-11-27T05:29:05.853 に答える
0
// retain the old top 8 bits
chunk.head &= 0xFF00000000

// set the lower 24 bits
chunk.head |= (0x00FFFFFF & new_bits)
于 2009-11-27T04:50:36.773 に答える
0

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

于 2009-11-27T04:46:15.490 に答える
0
#define SET_CHUNK_SIZE(chunk, size) (chunk.head = (chunk.head & 0xFF000000) | (size & 0x00FFFFFF))

それはあなたが意味したことですか、それとも私は何かを逃しましたか?

于 2009-11-27T04:46:55.283 に答える