1b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <assert.h>
3b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <stdio.h>
4b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <stdlib.h>
5b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <pthread.h>
6b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <unistd.h>
7b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic char* s_mem;
9b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* wait a second, so as to guarantee that the parent access
11b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   the malloc'd area, then free it. */
12b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void* thread_func(void* arg)
13b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
14b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    sleep(1);
15b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    free(s_mem);
16b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    return NULL;
17b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
18b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
19b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint main(int argc, char** argv)
20b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
21b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    pthread_t tid;
22b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    int quiet;
23b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
24b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    fprintf(stderr, "Start.\n");
25b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
26b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    quiet = argc > 1;
27b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
28b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    s_mem = malloc(10);
29b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    if (0 && !quiet)
30b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        fprintf(stderr, "Pointer to allocated memory: %p\n", s_mem);
31b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    assert(s_mem);
32b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    pthread_create(&tid, NULL, thread_func, NULL);
33b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
34b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    /* Write, which isn't coordinated with the free ==> a race
35b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov       should be reported. */
36b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    char c = s_mem[5];
37b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    __asm__ __volatile__("" : : "r"((long)c) );
38b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
39b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    pthread_join(tid, NULL);
40b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    fprintf(stderr, "Done.\n");
41b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    return 0;
42b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
43