1 #ifndef __SANITIZER_COMMON_SANITIZER_SPECIFIC_H__
2 #define __SANITIZER_COMMON_SANITIZER_SPECIFIC_H__
3
4 #include <sanitizer/lsan_interface.h>
5
__lsan_do_recoverable_leak_check()6 __attribute__((weak)) int __lsan_do_recoverable_leak_check() { return 0; }
__lsan_disable(void)7 __attribute__((weak)) void __lsan_disable(void) {}
__lsan_enable(void)8 __attribute__((weak)) void __lsan_enable(void) {}
9
10 #ifndef __has_feature
11 # define __has_feature(x) 0
12 #endif
13
14 #if __has_feature(memory_sanitizer)
15 # include <sanitizer/msan_interface.h>
check_mem_is_good(void * p,size_t s)16 static void check_mem_is_good(void *p, size_t s) {
17 __msan_check_mem_is_initialized(p, s);
18 }
make_mem_good(void * p,size_t s)19 static void make_mem_good(void *p, size_t s) { __msan_unpoison(p, s); }
make_mem_bad(void * p,size_t s)20 static void make_mem_bad(void *p, size_t s) { __msan_poison(p, s); }
21 #elif __has_feature(address_sanitizer)
22 # include <sanitizer/asan_interface.h>
23 # include <stdlib.h>
check_mem_is_good(void * p,size_t s)24 static void check_mem_is_good(void *p, size_t s) {
25 if (__asan_region_is_poisoned(p, s))
26 abort();
27 }
make_mem_good(void * p,size_t s)28 static void make_mem_good(void *p, size_t s) {
29 __asan_unpoison_memory_region(p, s);
30 }
make_mem_bad(void * p,size_t s)31 static void make_mem_bad(void *p, size_t s) {
32 __asan_poison_memory_region(p, s);
33 }
34 #elif __has_feature(hwaddress_sanitizer)
35 # include <sanitizer/hwasan_interface.h>
36 # include <stdlib.h>
check_mem_is_good(void * p,size_t s)37 static void check_mem_is_good(void *p, size_t s) {
38 if (__hwasan_test_shadow(p, s) != -1)
39 abort();
40 }
make_mem_good(void * p,size_t s)41 static void make_mem_good(void *p, size_t s) {
42 __hwasan_tag_memory(p, __hwasan_get_tag_from_pointer(p), s);
43 }
make_mem_bad(void * p,size_t s)44 static void make_mem_bad(void *p, size_t s) {
45 uint8_t tag = ~__hwasan_get_tag_from_pointer(p);
46 if (!tag) {
47 // Nothing wrong with tag zero, but non-zero tags help to detect never
48 // tagged memory.
49 tag = 1;
50 }
51 __hwasan_tag_memory(p, tag, s);
52 // With misaligned `p` or short granules we can't guarantee tag mismatch.
53 if (__hwasan_test_shadow(p, s) != 0)
54 abort();
55 if (s > 1 && __hwasan_test_shadow(((char *)p) + s - 1, 1) != 0)
56 abort();
57 }
58 #else
check_mem_is_good(void * p,size_t s)59 static void check_mem_is_good(void *p, size_t s) {}
make_mem_good(void * p,size_t s)60 static void make_mem_good(void *p, size_t s) {}
make_mem_bad(void * p,size_t s)61 static void make_mem_bad(void *p, size_t s) {}
62 #endif
63
64 #endif // __SANITIZER_COMMON_SANITIZER_SPECIFIC_H__
65