xref: /aosp_15_r20/external/compiler-rt/lib/asan/asan_interceptors.h (revision 7c3d14c8b49c529e04be81a3ce6f5cc23712e4c6)
1*7c3d14c8STreehugger Robot //===-- asan_interceptors.h -------------------------------------*- C++ -*-===//
2*7c3d14c8STreehugger Robot //
3*7c3d14c8STreehugger Robot //                     The LLVM Compiler Infrastructure
4*7c3d14c8STreehugger Robot //
5*7c3d14c8STreehugger Robot // This file is distributed under the University of Illinois Open Source
6*7c3d14c8STreehugger Robot // License. See LICENSE.TXT for details.
7*7c3d14c8STreehugger Robot //
8*7c3d14c8STreehugger Robot //===----------------------------------------------------------------------===//
9*7c3d14c8STreehugger Robot //
10*7c3d14c8STreehugger Robot // This file is a part of AddressSanitizer, an address sanity checker.
11*7c3d14c8STreehugger Robot //
12*7c3d14c8STreehugger Robot // ASan-private header for asan_interceptors.cc
13*7c3d14c8STreehugger Robot //===----------------------------------------------------------------------===//
14*7c3d14c8STreehugger Robot #ifndef ASAN_INTERCEPTORS_H
15*7c3d14c8STreehugger Robot #define ASAN_INTERCEPTORS_H
16*7c3d14c8STreehugger Robot 
17*7c3d14c8STreehugger Robot #include "asan_internal.h"
18*7c3d14c8STreehugger Robot #include "interception/interception.h"
19*7c3d14c8STreehugger Robot #include "sanitizer_common/sanitizer_platform_interceptors.h"
20*7c3d14c8STreehugger Robot 
21*7c3d14c8STreehugger Robot // Use macro to describe if specific function should be
22*7c3d14c8STreehugger Robot // intercepted on a given platform.
23*7c3d14c8STreehugger Robot #if !SANITIZER_WINDOWS
24*7c3d14c8STreehugger Robot # define ASAN_INTERCEPT_ATOLL_AND_STRTOLL 1
25*7c3d14c8STreehugger Robot # define ASAN_INTERCEPT__LONGJMP 1
26*7c3d14c8STreehugger Robot # define ASAN_INTERCEPT_INDEX 1
27*7c3d14c8STreehugger Robot # define ASAN_INTERCEPT_PTHREAD_CREATE 1
28*7c3d14c8STreehugger Robot # define ASAN_INTERCEPT_FORK 1
29*7c3d14c8STreehugger Robot #else
30*7c3d14c8STreehugger Robot # define ASAN_INTERCEPT_ATOLL_AND_STRTOLL 0
31*7c3d14c8STreehugger Robot # define ASAN_INTERCEPT__LONGJMP 0
32*7c3d14c8STreehugger Robot # define ASAN_INTERCEPT_INDEX 0
33*7c3d14c8STreehugger Robot # define ASAN_INTERCEPT_PTHREAD_CREATE 0
34*7c3d14c8STreehugger Robot # define ASAN_INTERCEPT_FORK 0
35*7c3d14c8STreehugger Robot #endif
36*7c3d14c8STreehugger Robot 
37*7c3d14c8STreehugger Robot #if SANITIZER_FREEBSD || SANITIZER_LINUX
38*7c3d14c8STreehugger Robot # define ASAN_USE_ALIAS_ATTRIBUTE_FOR_INDEX 1
39*7c3d14c8STreehugger Robot #else
40*7c3d14c8STreehugger Robot # define ASAN_USE_ALIAS_ATTRIBUTE_FOR_INDEX 0
41*7c3d14c8STreehugger Robot #endif
42*7c3d14c8STreehugger Robot 
43*7c3d14c8STreehugger Robot #if SANITIZER_LINUX && !SANITIZER_ANDROID
44*7c3d14c8STreehugger Robot # define ASAN_INTERCEPT_SWAPCONTEXT 1
45*7c3d14c8STreehugger Robot #else
46*7c3d14c8STreehugger Robot # define ASAN_INTERCEPT_SWAPCONTEXT 0
47*7c3d14c8STreehugger Robot #endif
48*7c3d14c8STreehugger Robot 
49*7c3d14c8STreehugger Robot #if !SANITIZER_WINDOWS
50*7c3d14c8STreehugger Robot # define ASAN_INTERCEPT_SIGNAL_AND_SIGACTION 1
51*7c3d14c8STreehugger Robot #else
52*7c3d14c8STreehugger Robot # define ASAN_INTERCEPT_SIGNAL_AND_SIGACTION 0
53*7c3d14c8STreehugger Robot #endif
54*7c3d14c8STreehugger Robot 
55*7c3d14c8STreehugger Robot #if !SANITIZER_WINDOWS
56*7c3d14c8STreehugger Robot # define ASAN_INTERCEPT_SIGLONGJMP 1
57*7c3d14c8STreehugger Robot #else
58*7c3d14c8STreehugger Robot # define ASAN_INTERCEPT_SIGLONGJMP 0
59*7c3d14c8STreehugger Robot #endif
60*7c3d14c8STreehugger Robot 
61*7c3d14c8STreehugger Robot // Android bug: https://code.google.com/p/android/issues/detail?id=61799
62*7c3d14c8STreehugger Robot #if ASAN_HAS_EXCEPTIONS && !SANITIZER_WINDOWS && \
63*7c3d14c8STreehugger Robot     !(SANITIZER_ANDROID && defined(__i386))
64*7c3d14c8STreehugger Robot # define ASAN_INTERCEPT___CXA_THROW 1
65*7c3d14c8STreehugger Robot #else
66*7c3d14c8STreehugger Robot # define ASAN_INTERCEPT___CXA_THROW 0
67*7c3d14c8STreehugger Robot #endif
68*7c3d14c8STreehugger Robot 
69*7c3d14c8STreehugger Robot #if !SANITIZER_WINDOWS
70*7c3d14c8STreehugger Robot # define ASAN_INTERCEPT___CXA_ATEXIT 1
71*7c3d14c8STreehugger Robot #else
72*7c3d14c8STreehugger Robot # define ASAN_INTERCEPT___CXA_ATEXIT 0
73*7c3d14c8STreehugger Robot #endif
74*7c3d14c8STreehugger Robot 
75*7c3d14c8STreehugger Robot #if SANITIZER_LINUX && !SANITIZER_ANDROID
76*7c3d14c8STreehugger Robot # define ASAN_INTERCEPT___STRDUP 1
77*7c3d14c8STreehugger Robot #else
78*7c3d14c8STreehugger Robot # define ASAN_INTERCEPT___STRDUP 0
79*7c3d14c8STreehugger Robot #endif
80*7c3d14c8STreehugger Robot 
81*7c3d14c8STreehugger Robot DECLARE_REAL(int, memcmp, const void *a1, const void *a2, uptr size)
82*7c3d14c8STreehugger Robot DECLARE_REAL(void*, memcpy, void *to, const void *from, uptr size)
83*7c3d14c8STreehugger Robot DECLARE_REAL(void*, memset, void *block, int c, uptr size)
84*7c3d14c8STreehugger Robot DECLARE_REAL(char*, strchr, const char *str, int c)
85*7c3d14c8STreehugger Robot DECLARE_REAL(SIZE_T, strlen, const char *s)
86*7c3d14c8STreehugger Robot DECLARE_REAL(char*, strncpy, char *to, const char *from, uptr size)
87*7c3d14c8STreehugger Robot DECLARE_REAL(uptr, strnlen, const char *s, uptr maxlen)
88*7c3d14c8STreehugger Robot DECLARE_REAL(char*, strstr, const char *s1, const char *s2)
89*7c3d14c8STreehugger Robot struct sigaction;
DECLARE_REAL(int,sigaction,int signum,const struct sigaction * act,struct sigaction * oldact)90*7c3d14c8STreehugger Robot DECLARE_REAL(int, sigaction, int signum, const struct sigaction *act,
91*7c3d14c8STreehugger Robot                              struct sigaction *oldact)
92*7c3d14c8STreehugger Robot 
93*7c3d14c8STreehugger Robot #if !SANITIZER_MAC
94*7c3d14c8STreehugger Robot #define ASAN_INTERCEPT_FUNC(name)                                        \
95*7c3d14c8STreehugger Robot   do {                                                                   \
96*7c3d14c8STreehugger Robot     if ((!INTERCEPT_FUNCTION(name) || !REAL(name)))                      \
97*7c3d14c8STreehugger Robot       VReport(1, "AddressSanitizer: failed to intercept '" #name "'\n"); \
98*7c3d14c8STreehugger Robot   } while (0)
99*7c3d14c8STreehugger Robot #define ASAN_INTERCEPT_FUNC_VER(name, ver)                                     \
100*7c3d14c8STreehugger Robot   do {                                                                         \
101*7c3d14c8STreehugger Robot     if ((!INTERCEPT_FUNCTION_VER(name, ver) || !REAL(name)))                   \
102*7c3d14c8STreehugger Robot       VReport(                                                                 \
103*7c3d14c8STreehugger Robot           1, "AddressSanitizer: failed to intercept '" #name "@@" #ver "'\n"); \
104*7c3d14c8STreehugger Robot   } while (0)
105*7c3d14c8STreehugger Robot #else
106*7c3d14c8STreehugger Robot // OS X interceptors don't need to be initialized with INTERCEPT_FUNCTION.
107*7c3d14c8STreehugger Robot #define ASAN_INTERCEPT_FUNC(name)
108*7c3d14c8STreehugger Robot #endif  // SANITIZER_MAC
109*7c3d14c8STreehugger Robot 
110*7c3d14c8STreehugger Robot namespace __asan {
111*7c3d14c8STreehugger Robot 
112*7c3d14c8STreehugger Robot void InitializeAsanInterceptors();
113*7c3d14c8STreehugger Robot void InitializePlatformInterceptors();
114*7c3d14c8STreehugger Robot 
115*7c3d14c8STreehugger Robot #define ENSURE_ASAN_INITED() do { \
116*7c3d14c8STreehugger Robot   CHECK(!asan_init_is_running); \
117*7c3d14c8STreehugger Robot   if (UNLIKELY(!asan_inited)) { \
118*7c3d14c8STreehugger Robot     AsanInitFromRtl(); \
119*7c3d14c8STreehugger Robot   } \
120*7c3d14c8STreehugger Robot } while (0)
121*7c3d14c8STreehugger Robot 
122*7c3d14c8STreehugger Robot }  // namespace __asan
123*7c3d14c8STreehugger Robot 
124*7c3d14c8STreehugger Robot #endif  // ASAN_INTERCEPTORS_H
125