1 // Test that dynamically allocated thread-specific storage is included in the root set.
2 // RUN: %clangxx_lsan %s -o %t
3 // RUN: %env_lsan_opts="report_objects=1:use_stacks=0:use_registers=0:use_tls=0" not %run %t 2>&1 | FileCheck %s
4 // RUN: %env_lsan_opts="report_objects=1:use_stacks=0:use_registers=0:use_tls=1" %run %t 2>&1
5 // RUN: %env_lsan_opts="" %run %t 2>&1
7 // Investigate why it does not fail with use_tls=0
8 // UNSUPPORTED: arm-linux || armhf-linux
14 #include "sanitizer_common/print_address.h"
16 // From glibc: this many keys are stored in the thread descriptor directly.
17 const unsigned PTHREAD_KEY_2NDLEVEL_SIZE
= 32;
20 static const unsigned kDummyKeysCount
= PTHREAD_KEY_2NDLEVEL_SIZE
;
22 pthread_key_t dummy_keys
[kDummyKeysCount
];
23 for (unsigned i
= 0; i
< kDummyKeysCount
; i
++) {
24 res
= pthread_key_create(&dummy_keys
[i
], NULL
);
28 res
= pthread_key_create(&key
, NULL
);
29 assert(key
>= PTHREAD_KEY_2NDLEVEL_SIZE
);
31 void *p
= malloc(1337);
32 res
= pthread_setspecific(key
, p
);
34 print_address("Test alloc: ", 1, p
);
37 // CHECK: Test alloc: [[ADDR:0x[0-9,a-f]+]]
38 // CHECK: LeakSanitizer: detected memory leaks
39 // CHECK: [[ADDR]] (1337 bytes)
40 // CHECK: SUMMARY: {{(Leak|Address)}}Sanitizer: