malloc bug

jschopp jschopp@austin.ibm.com
Wed Mar 28 23:35:00 GMT 2007


A user of newlib 1.15 malloc() on cell seems to have stumbled across a malloc() bug. 
Since malloc is generic across architectures I don't think this is just a cell bug, but 
it's quite a bit more noticeable on cell since we only have 256K of total memory.

Basically allocating and then freeing before the following alloc fails in this sequence:
Allocated 131072 bytes at 0x2eb0
Allocated 16384 bytes at 0x2eb0
Allocated 32768 bytes at 0x2eb0
Allocated 65536 bytes at 0x2eb0
Allocated 131072 bytes at (nil)

But succeeds in this sequence:

Allocated 131072 bytes at 0x2eb0
Allocated 16384 bytes at 0x2eb0
Allocated 65536 bytes at 0x2eb0
Allocated 131072 bytes at 0x2eb0

and if you add an allocation without freeing it to the first sequence just after the first 
alloc but before the first free it works:

Allocated 131072 bytes at 0x2f30
Allocated 16384 bytes before freeing previous allocation, and never freed at 0x22f40
Allocated 16384 bytes at 0x2f30
Allocated 32768 bytes at 0x2f30
Allocated 65536 bytes at 0x2f30
Allocated 131072 bytes at 0x2f30

Anybody got any ideas off the top of their heads before I go spend a week debugging this?

Code for third sequence below, trivial to rearrange to get other 2 sequences:

#include <stdio.h>
#include <stdlib.h>

int main(unsigned long long id)
{
  printf("Hello Cell (0x%llx)\n", id);

  /* Initial trial */
  int block_size;
  void* mem;
  void* mem2;

  block_size = 128*1024;
  mem = malloc(block_size);
  printf("Allocated %d bytes at %p\n", block_size, mem);
  mem2 = malloc(16*1024);
  printf("Allocated %d bytes before freeing previous allocation, and never freed at %p\n", 
16*1024, mem2);

  free(mem);

  block_size = 16*1024;
  mem = malloc(block_size);
  printf("Allocated %d bytes at %p\n", block_size, mem);
  free(mem);

  block_size = 32*1024;
  mem = malloc(block_size);
  printf("Allocated %d bytes at %p\n", block_size, mem);
  free(mem);

  block_size = 64*1024;
  mem = malloc(block_size);
  printf("Allocated %d bytes at %p\n", block_size, mem);
  free(mem);

  block_size = 128*1024;
  mem = malloc(block_size);
  printf("Allocated %d bytes at %p\n", block_size, mem);

  return 0;
}



More information about the Newlib mailing list