xref: /aosp_15_r20/external/skia/include/private/base/SkASAN.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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 Worker static 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 Worker static 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 Worker static 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