• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Regression test. Disabler should not depend on TSD validity.
2 // RUN: LSAN_BASE="report_objects=1:use_registers=0:use_stacks=0:use_globals=0:use_tls=1:use_ld_allocations=0"
3 // RUN: %clang_lsan %s -o %t
4 // RUN: LSAN_OPTIONS=$LSAN_BASE %run %t
5 
6 #include <assert.h>
7 #include <pthread.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10 
11 #include "sanitizer/lsan_interface.h"
12 
13 pthread_key_t key;
14 
key_destructor(void * arg)15 void key_destructor(void *arg) {
16   __lsan_disable();
17   void *p = malloc(1337);
18   // Break optimization.
19   fprintf(stderr, "Test alloc: %p.\n", p);
20   pthread_setspecific(key, 0);
21   __lsan_enable();
22 }
23 
thread_func(void * arg)24 void *thread_func(void *arg) {
25   int res = pthread_setspecific(key, (void*)1);
26   assert(res == 0);
27   return 0;
28 }
29 
main()30 int main() {
31   int res = pthread_key_create(&key, &key_destructor);
32   assert(res == 0);
33   pthread_t thread_id;
34   res = pthread_create(&thread_id, 0, thread_func, 0);
35   assert(res == 0);
36   res = pthread_join(thread_id, 0);
37   assert(res == 0);
38   return 0;
39 }
40