xref: /llvm-project/compiler-rt/test/sanitizer_common/sanitizer_specific.h (revision c636b186bc0f8e11e804deb3edd0d72cb0fd157c)
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