#include <assert.h> #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> static char* s_mem; /* wait a second, so as to guarantee that the parent access the malloc'd area, then free it. */ static void* thread_func(void* arg) { sleep(1); free(s_mem); return NULL; } int main(int argc, char** argv) { pthread_t tid; int quiet; fprintf(stderr, "Start.\n"); quiet = argc > 1; s_mem = malloc(10); if (0 && !quiet) fprintf(stderr, "Pointer to allocated memory: %p\n", s_mem); assert(s_mem); pthread_create(&tid, NULL, thread_func, NULL); /* Write, which isn't coordinated with the free ==> a race should be reported. */ char c = s_mem[5]; __asm__ __volatile__("" : : "r"((long)c) ); pthread_join(tid, NULL); fprintf(stderr, "Done.\n"); return 0; }