| #ifndef __SANITIZER_COMMON_SANITIZER_SPECIFIC_H__ |
| #define __SANITIZER_COMMON_SANITIZER_SPECIFIC_H__ |
| |
| #include <sanitizer/lsan_interface.h> |
| |
| __attribute__((weak)) int __lsan_do_recoverable_leak_check() { return 0; } |
| __attribute__((weak)) void __lsan_disable(void) {} |
| __attribute__((weak)) void __lsan_enable(void) {} |
| |
| #ifndef __has_feature |
| # define __has_feature(x) 0 |
| #endif |
| |
| #if __has_feature(memory_sanitizer) |
| # include <sanitizer/msan_interface.h> |
| static void check_mem_is_good(void *p, size_t s) { |
| __msan_check_mem_is_initialized(p, s); |
| } |
| static void make_mem_good(void *p, size_t s) { __msan_unpoison(p, s); } |
| static void make_mem_bad(void *p, size_t s) { __msan_poison(p, s); } |
| #elif __has_feature(address_sanitizer) |
| # include <sanitizer/asan_interface.h> |
| # include <stdlib.h> |
| static void check_mem_is_good(void *p, size_t s) { |
| if (__asan_region_is_poisoned(p, s)) |
| abort(); |
| } |
| static void make_mem_good(void *p, size_t s) { |
| __asan_unpoison_memory_region(p, s); |
| } |
| static void make_mem_bad(void *p, size_t s) { |
| __asan_poison_memory_region(p, s); |
| } |
| #elif __has_feature(hwaddress_sanitizer) |
| # include <sanitizer/hwasan_interface.h> |
| # include <stdlib.h> |
| static void check_mem_is_good(void *p, size_t s) { |
| if (__hwasan_test_shadow(p, s) != -1) |
| abort(); |
| } |
| static void make_mem_good(void *p, size_t s) { |
| __hwasan_tag_memory(p, __hwasan_get_tag_from_pointer(p), s); |
| } |
| static void make_mem_bad(void *p, size_t s) { |
| uint8_t tag = ~__hwasan_get_tag_from_pointer(p); |
| if (!tag) { |
| // Nothing wrong with tag zero, but non-zero tags help to detect never |
| // tagged memory. |
| tag = 1; |
| } |
| __hwasan_tag_memory(p, tag, s); |
| // With misaligned `p` or short granules we can't guarantee tag mismatch. |
| if (__hwasan_test_shadow(p, s) != 0) |
| abort(); |
| if (s > 1 && __hwasan_test_shadow(((char *)p) + s - 1, 1) != 0) |
| abort(); |
| } |
| #else |
| static void check_mem_is_good(void *p, size_t s) {} |
| static void make_mem_good(void *p, size_t s) {} |
| static void make_mem_bad(void *p, size_t s) {} |
| #endif |
| |
| #endif // __SANITIZER_COMMON_SANITIZER_SPECIFIC_H__ |