1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2020 Google LLC 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkASAN_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define SkASAN_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef> 12*c8dee2aaSAndroid Build Coastguard Worker 13*c8dee2aaSAndroid Build Coastguard Worker #ifdef __SANITIZE_ADDRESS__ 14*c8dee2aaSAndroid Build Coastguard Worker #define SK_SANITIZE_ADDRESS 1 15*c8dee2aaSAndroid Build Coastguard Worker #endif 16*c8dee2aaSAndroid Build Coastguard Worker #if !defined(SK_SANITIZE_ADDRESS) && defined(__has_feature) 17*c8dee2aaSAndroid Build Coastguard Worker #if __has_feature(address_sanitizer) 18*c8dee2aaSAndroid Build Coastguard Worker #define SK_SANITIZE_ADDRESS 1 19*c8dee2aaSAndroid Build Coastguard Worker #endif 20*c8dee2aaSAndroid Build Coastguard Worker #endif 21*c8dee2aaSAndroid Build Coastguard Worker 22*c8dee2aaSAndroid Build Coastguard Worker // Typically declared in LLVM's asan_interface.h. 23*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_SANITIZE_ADDRESS 24*c8dee2aaSAndroid Build Coastguard Worker extern "C" { 25*c8dee2aaSAndroid Build Coastguard Worker void __asan_poison_memory_region(void const volatile *addr, size_t size); 26*c8dee2aaSAndroid Build Coastguard Worker void __asan_unpoison_memory_region(void const volatile *addr, size_t size); 27*c8dee2aaSAndroid Build Coastguard Worker int __asan_address_is_poisoned(void const volatile *addr); 28*c8dee2aaSAndroid Build Coastguard Worker } 29*c8dee2aaSAndroid Build Coastguard Worker #endif 30*c8dee2aaSAndroid Build Coastguard Worker 31*c8dee2aaSAndroid Build Coastguard Worker // Code that implements bespoke allocation arenas can poison the entire arena on creation, then 32*c8dee2aaSAndroid Build Coastguard Worker // unpoison chunks of arena memory as they are parceled out. Consider leaving gaps between blocks 33*c8dee2aaSAndroid Build Coastguard Worker // to detect buffer overrun. sk_asan_poison_memory_region(void const volatile * addr,size_t size)34*c8dee2aaSAndroid Build Coastguard Workerstatic inline void sk_asan_poison_memory_region([[maybe_unused]] void const volatile* addr, 35*c8dee2aaSAndroid Build Coastguard Worker [[maybe_unused]] size_t size) { 36*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_SANITIZE_ADDRESS 37*c8dee2aaSAndroid Build Coastguard Worker __asan_poison_memory_region(addr, size); 38*c8dee2aaSAndroid Build Coastguard Worker #endif 39*c8dee2aaSAndroid Build Coastguard Worker } 40*c8dee2aaSAndroid Build Coastguard Worker sk_asan_unpoison_memory_region(void const volatile * addr,size_t size)41*c8dee2aaSAndroid Build Coastguard Workerstatic inline void sk_asan_unpoison_memory_region([[maybe_unused]] void const volatile* addr, 42*c8dee2aaSAndroid Build Coastguard Worker [[maybe_unused]] size_t size) { 43*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_SANITIZE_ADDRESS 44*c8dee2aaSAndroid Build Coastguard Worker __asan_unpoison_memory_region(addr, size); 45*c8dee2aaSAndroid Build Coastguard Worker #endif 46*c8dee2aaSAndroid Build Coastguard Worker } 47*c8dee2aaSAndroid Build Coastguard Worker sk_asan_address_is_poisoned(void const volatile * addr)48*c8dee2aaSAndroid Build Coastguard Workerstatic inline int sk_asan_address_is_poisoned([[maybe_unused]] void const volatile* addr) { 49*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_SANITIZE_ADDRESS 50*c8dee2aaSAndroid Build Coastguard Worker return __asan_address_is_poisoned(addr); 51*c8dee2aaSAndroid Build Coastguard Worker #else 52*c8dee2aaSAndroid Build Coastguard Worker return 0; 53*c8dee2aaSAndroid Build Coastguard Worker #endif 54*c8dee2aaSAndroid Build Coastguard Worker } 55*c8dee2aaSAndroid Build Coastguard Worker 56*c8dee2aaSAndroid Build Coastguard Worker #endif // SkASAN_DEFINED 57