65 lines · c
1#ifndef __SANITIZER_COMMON_SANITIZER_SPECIFIC_H__2#define __SANITIZER_COMMON_SANITIZER_SPECIFIC_H__3 4#include <sanitizer/lsan_interface.h>5 6__attribute__((weak)) int __lsan_do_recoverable_leak_check() { return 0; }7__attribute__((weak)) void __lsan_disable(void) {}8__attribute__((weak)) void __lsan_enable(void) {}9 10#ifndef __has_feature11# define __has_feature(x) 012#endif13 14#if __has_feature(memory_sanitizer)15# include <sanitizer/msan_interface.h>16static void check_mem_is_good(void *p, size_t s) {17 __msan_check_mem_is_initialized(p, s);18}19static void make_mem_good(void *p, size_t s) { __msan_unpoison(p, s); }20static 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>24static void check_mem_is_good(void *p, size_t s) {25 if (__asan_region_is_poisoned(p, s))26 abort();27}28static void make_mem_good(void *p, size_t s) {29 __asan_unpoison_memory_region(p, s);30}31static 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>37static void check_mem_is_good(void *p, size_t s) {38 if (__hwasan_test_shadow(p, s) != -1)39 abort();40}41static void make_mem_good(void *p, size_t s) {42 __hwasan_tag_memory(p, __hwasan_get_tag_from_pointer(p), s);43}44static 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 never48 // 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#else59static void check_mem_is_good(void *p, size_t s) {}60static void make_mem_good(void *p, size_t s) {}61static void make_mem_bad(void *p, size_t s) {}62#endif63 64#endif // __SANITIZER_COMMON_SANITIZER_SPECIFIC_H__65