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

#define NCYCLES 32768
#define NSLOTS  4096

struct slot {
  char *ptr;
  size_t size;
};

struct slot s[NSLOTS];

int main(void)
{
  size_t sp, sq;
  char *p, *ep, *q, *eq;
  int r, i, j;
  int ok;
  int err = 0;

  for ( r = 0 ; r < NCYCLES ; r++ ) {
    i = lrand48() % NSLOTS;

    if ( s[i].ptr ) {
      free(s[i].ptr);
      printf("Freed     %8zu bytes at %p\n", s[i].size, s[i].ptr);
      s[i].ptr  = NULL;
      s[i].size = 0;
    } else {
      sp = lrand48();		/* 32-bit random number */
      sp >>= 12+(lrand48() % 20);

      s[i].size = sp;
      s[i].ptr  = p = malloc(sp);
      ep = p+sp;
      ok = 1;
      for ( j = 0 ; j < NSLOTS ; j++ ) {
	q = s[j].ptr;
	if ( i != j && q ) {
	  sq = s[j].size;
	  eq = q+sq;

	  if ( (p < q && ep > q) || (p >= q && p < eq) ) {
	    ok = 0;
	    err = 1;
	    break;
	  }
	}
      }
      printf("Allocated %8zu bytes at %p, ok = %d\n", sp, p, ok);

      if ( p )
	memset(p, 0xee, sp);	/* Poison this memory */
    }
  }
  return err;
}
