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

source code of compiler-rt/test/lsan/TestCases/Linux/disabler_in_tsd_destructor.c