#include <stdlib.h>
/* To be run with --freelist-vol=1000000 --freelist-big-blocks=50000 */
static void jumped(void)
{
;
}
int main(int argc, char *argv[])
{
char *semi_big = NULL;
char *big = NULL;
char *small = NULL;
char *other_small = NULL;
int i;
int j;
/* Verify that access via a dangling pointer to a big block bigger than
the free list is found by memcheck (still on the free list). */
semi_big = malloc (900000);
big = malloc (1000015);
free(semi_big);
free(big);
if (big[1000] > 0x0) jumped();
if (semi_big[1000] > 0x0) jumped();
/* Then verify that dangling pointers for small blocks is not hampered
by doing big alloc/free. */
small = malloc (10000);
free(small);
/* We should still have a nice error msg for the semi_big
but not for the big block, which has been removed from the free list
with the malloc of small above. */
if (big[2000] > 0x0) jumped();
if (semi_big[2000] > 0x0) jumped();
big = NULL;
{
big = malloc (1000015);
free(big);
if (small[10] > 0x0) jumped();
/* Do not common up the below in a loop. We
want a different error/stack trace for each of
these. */
if (big[10] > 0x0) jumped();
}
for (i = 0; i < 100; i++) {
other_small = malloc(10000);
for (j = 0; j < 10000; j++)
other_small[j] = 0x1;
}
if (small[10] > 0x0) jumped();
return 0;
}