#include #include #include #define obstack_chunk_alloc malloc #define obstack_chunk_free free //struct obstack *string_obstack; int main(){ struct obstack *string_obstack = (struct obstack *) malloc (sizeof (struct obstack)); obstack_init (string_obstack); printf("address of obstack = %p, chunk_size = %d \n", string_obstack, string_obstack->chunk_size); printf("chunk = %p, object_base = %p next_free = %p \n\n", string_obstack->chunk, string_obstack->object_base, string_obstack->next_free); // Step 1: allocate the first chunk char *s = (char *) obstack_alloc (string_obstack, 4064); printf("======First chunk======\n"); printf("before free: ((void *) lp = %p , (void *) (lp)->limit = %p \n", string_obstack->chunk, (void *) (string_obstack)->chunk->limit); printf("before free : prv = %p\n\n", string_obstack->chunk->prev); // Step 2: allocate the second chunk char *ss = (char *) obstack_alloc (string_obstack, 4064); printf("before free : address of s = %p\n", s); printf("before free : address of ss = %p\n\n", ss); printf("======Second chunk======\n"); printf("before free: ((void *) lp = %p , (void *) (lp)->limit = %p \n", string_obstack->chunk, (void *) (string_obstack)->chunk->limit); printf("before free : prv = %p\n\n", string_obstack->chunk->prev); // Step 3: free the second chunk through obj printf("======Start to free======\n"); char *t = s+4177; printf("before free : obj (string_obstack->chunk) = %p \n", string_obstack->chunk); printf("before free : obj (t) = %p \n\n", t); obstack_free (string_obstack, string_obstack->chunk); //problematic obstack_free (string_obstack, t); printf("======Third chunk======\n"); printf("after free: ((void *) lp = %p , (void *) (lp)->limit = %p \n", (void *) (string_obstack)->chunk, (void *) (string_obstack)->chunk->limit); printf("after free : prv = %p\n", string_obstack->chunk->prev); // Step 4: allocate the third chunk in the location of chunk2 char *sss = (char *) obstack_alloc (string_obstack, 4064); printf("after free : address of s = %p\n", s); printf("after free : address of ss = %p\n", ss); printf("after free : address of sss = %p\n\n", sss); return 0; }