1 #include "config.h" 2 3 #define _GNU_SOURCE 4 #include <stdio.h> 5 #include <pthread.h> 6 #include <string.h> 7 #include <stdlib.h> 8 #if defined(HAVE_SYS_PRCTL_H) 9 #include <sys/prctl.h> 10 #endif /* HAVE_SYS_PRCTL_H */ 11 #include <sys/types.h> 12 #include <unistd.h> 13 #include <assert.h> 14 #include "valgrind.h" 15 16 static pthread_t children[3]; 17 18 void bad_things(int offset) 19 { 20 char* m = malloc(sizeof(char)*offset); 21 m[offset] = 0; 22 free(m); 23 } 24 25 void* child_fn_2 ( void* arg ) 26 { 27 const char* threadname = "012345678901234"; 28 29 # if !defined(VGO_darwin) 30 pthread_setname_np(pthread_self(), threadname); 31 # else 32 pthread_setname_np(threadname); 33 # endif 34 35 bad_things(4); 36 37 return NULL; 38 } 39 40 void* child_fn_1 ( void* arg ) 41 { 42 const char* threadname = "try1"; 43 int r; 44 45 # if !defined(VGO_darwin) 46 pthread_setname_np(pthread_self(), threadname); 47 # else 48 pthread_setname_np(threadname); 49 # endif 50 51 bad_things(3); 52 VALGRIND_PRINTF("%s", "I am in child_fn_1\n"); 53 54 r = pthread_create(&children[2], NULL, child_fn_2, NULL); 55 assert(!r); 56 57 r = pthread_join(children[2], NULL); 58 assert(!r); 59 60 return NULL; 61 } 62 63 void* child_fn_0 ( void* arg ) 64 { 65 int r; 66 67 bad_things(2); 68 69 r = pthread_create(&children[1], NULL, child_fn_1, NULL); 70 assert(!r); 71 72 r = pthread_join(children[1], NULL); 73 assert(!r); 74 75 return NULL; 76 } 77 78 int main(int argc, const char** argv) 79 { 80 int r; 81 82 bad_things(1); 83 84 r = pthread_create(&children[0], NULL, child_fn_0, NULL); 85 assert(!r); 86 87 r = pthread_join(children[0], NULL); 88 assert(!r); 89 90 bad_things(5); 91 92 return 0; 93 } 94 95