1//===-- sanitizer_platform_interceptors.h -----------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines macro telling whether sanitizer tools can/should intercept
10// given library functions on a given platform.
11//
12//===----------------------------------------------------------------------===//
13#ifndef SANITIZER_PLATFORM_INTERCEPTORS_H
14#define SANITIZER_PLATFORM_INTERCEPTORS_H
15
16#include "sanitizer_glibc_version.h"
17#include "sanitizer_internal_defs.h"
18
19#if SANITIZER_POSIX
20# define SI_POSIX 1
21#else
22# define SI_POSIX 0
23#endif
24
25#if !SANITIZER_WINDOWS
26# define SI_WINDOWS 0
27#else
28# define SI_WINDOWS 1
29#endif
30
31#if SI_WINDOWS && SI_POSIX
32# error "Windows is not POSIX!"
33#endif
34
35#if SI_POSIX
36# include "sanitizer_platform_limits_freebsd.h"
37# include "sanitizer_platform_limits_netbsd.h"
38# include "sanitizer_platform_limits_openbsd.h"
39# include "sanitizer_platform_limits_posix.h"
40# include "sanitizer_platform_limits_solaris.h"
41#endif
42
43#if SANITIZER_LINUX && !SANITIZER_ANDROID
44# define SI_LINUX_NOT_ANDROID 1
45#else
46# define SI_LINUX_NOT_ANDROID 0
47#endif
48
49#if SANITIZER_ANDROID
50# define SI_ANDROID 1
51#else
52# define SI_ANDROID 0
53#endif
54
55#if SANITIZER_FREEBSD
56# define SI_FREEBSD 1
57#else
58# define SI_FREEBSD 0
59#endif
60
61#if SANITIZER_NETBSD
62# define SI_NETBSD 1
63#else
64# define SI_NETBSD 0
65#endif
66
67#if SANITIZER_OPENBSD
68#define SI_OPENBSD 1
69#else
70#define SI_OPENBSD 0
71#endif
72
73#if SANITIZER_LINUX
74# define SI_LINUX 1
75#else
76# define SI_LINUX 0
77#endif
78
79#if SANITIZER_MAC
80# define SI_MAC 1
81# define SI_NOT_MAC 0
82#else
83# define SI_MAC 0
84# define SI_NOT_MAC 1
85#endif
86
87#if SANITIZER_IOS
88# define SI_IOS 1
89#else
90# define SI_IOS 0
91#endif
92
93#if SANITIZER_IOSSIM
94# define SI_IOSSIM 1
95#else
96# define SI_IOSSIM 0
97#endif
98
99#if SANITIZER_WATCHOS
100# define SI_WATCHOS 1
101#else
102# define SI_WATCHOS 0
103#endif
104
105#if SANITIZER_TVOS
106# define SI_TVOS 1
107#else
108# define SI_TVOS 0
109#endif
110
111#if SANITIZER_FUCHSIA
112# define SI_NOT_FUCHSIA 0
113#else
114# define SI_NOT_FUCHSIA 1
115#endif
116
117#if SANITIZER_RTEMS
118# define SI_NOT_RTEMS 0
119#else
120# define SI_NOT_RTEMS 1
121#endif
122
123#if SANITIZER_SOLARIS
124# define SI_SOLARIS 1
125#else
126# define SI_SOLARIS 0
127#endif
128
129#if SANITIZER_SOLARIS32
130# define SI_SOLARIS32 1
131#else
132# define SI_SOLARIS32 0
133#endif
134
135#if SANITIZER_POSIX && !SANITIZER_MAC
136# define SI_POSIX_NOT_MAC 1
137#else
138# define SI_POSIX_NOT_MAC 0
139#endif
140
141#if SANITIZER_LINUX && !SANITIZER_FREEBSD
142# define SI_LINUX_NOT_FREEBSD 1
143# else
144# define SI_LINUX_NOT_FREEBSD 0
145#endif
146
147#define SANITIZER_INTERCEPT_STRLEN SI_NOT_FUCHSIA
148#define SANITIZER_INTERCEPT_STRNLEN (SI_NOT_MAC && SI_NOT_FUCHSIA)
149#define SANITIZER_INTERCEPT_STRCMP SI_NOT_FUCHSIA
150#define SANITIZER_INTERCEPT_STRSTR SI_NOT_FUCHSIA
151#define SANITIZER_INTERCEPT_STRCASESTR SI_POSIX
152#define SANITIZER_INTERCEPT_STRTOK SI_NOT_FUCHSIA
153#define SANITIZER_INTERCEPT_STRCHR SI_NOT_FUCHSIA
154#define SANITIZER_INTERCEPT_STRCHRNUL SI_POSIX_NOT_MAC
155#define SANITIZER_INTERCEPT_STRRCHR SI_NOT_FUCHSIA
156#define SANITIZER_INTERCEPT_STRSPN SI_NOT_FUCHSIA
157#define SANITIZER_INTERCEPT_STRPBRK SI_NOT_FUCHSIA
158#define SANITIZER_INTERCEPT_TEXTDOMAIN SI_LINUX_NOT_ANDROID || SI_SOLARIS
159#define SANITIZER_INTERCEPT_STRCASECMP SI_POSIX
160#define SANITIZER_INTERCEPT_MEMSET 1
161#define SANITIZER_INTERCEPT_MEMMOVE 1
162#define SANITIZER_INTERCEPT_MEMCPY 1
163#define SANITIZER_INTERCEPT_MEMCMP SI_NOT_FUCHSIA
164#define SANITIZER_INTERCEPT_BCMP \
165  SANITIZER_INTERCEPT_MEMCMP &&  \
166      ((SI_POSIX && _GNU_SOURCE) || SI_NETBSD || SI_OPENBSD || SI_FREEBSD)
167#define SANITIZER_INTERCEPT_STRNDUP SI_POSIX
168#define SANITIZER_INTERCEPT___STRNDUP SI_LINUX_NOT_FREEBSD
169#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && \
170    __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070
171# define SI_MAC_DEPLOYMENT_BELOW_10_7 1
172#else
173# define SI_MAC_DEPLOYMENT_BELOW_10_7 0
174#endif
175// memmem on Darwin doesn't exist on 10.6
176// FIXME: enable memmem on Windows.
177#define SANITIZER_INTERCEPT_MEMMEM (SI_POSIX && !SI_MAC_DEPLOYMENT_BELOW_10_7)
178#define SANITIZER_INTERCEPT_MEMCHR SI_NOT_FUCHSIA
179#define SANITIZER_INTERCEPT_MEMRCHR \
180  (SI_FREEBSD || SI_LINUX || SI_NETBSD || SI_OPENBSD)
181
182#define SANITIZER_INTERCEPT_READ SI_POSIX
183#define SANITIZER_INTERCEPT_PREAD SI_POSIX
184#define SANITIZER_INTERCEPT_WRITE SI_POSIX
185#define SANITIZER_INTERCEPT_PWRITE SI_POSIX
186
187#define SANITIZER_INTERCEPT_FREAD SI_POSIX
188#define SANITIZER_INTERCEPT_FWRITE SI_POSIX
189#define SANITIZER_INTERCEPT_FGETS SI_POSIX
190#define SANITIZER_INTERCEPT_FPUTS SI_POSIX
191#define SANITIZER_INTERCEPT_PUTS SI_POSIX
192
193#define SANITIZER_INTERCEPT_PREAD64 SI_LINUX_NOT_ANDROID || SI_SOLARIS32
194#define SANITIZER_INTERCEPT_PWRITE64 SI_LINUX_NOT_ANDROID || SI_SOLARIS32
195
196#define SANITIZER_INTERCEPT_READV SI_POSIX
197#define SANITIZER_INTERCEPT_WRITEV SI_POSIX
198
199#define SANITIZER_INTERCEPT_PREADV \
200  (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_LINUX_NOT_ANDROID)
201#define SANITIZER_INTERCEPT_PWRITEV SI_LINUX_NOT_ANDROID
202#define SANITIZER_INTERCEPT_PREADV64 SI_LINUX_NOT_ANDROID
203#define SANITIZER_INTERCEPT_PWRITEV64 SI_LINUX_NOT_ANDROID
204
205#define SANITIZER_INTERCEPT_PRCTL   SI_LINUX
206
207#define SANITIZER_INTERCEPT_LOCALTIME_AND_FRIENDS SI_POSIX
208#define SANITIZER_INTERCEPT_STRPTIME SI_POSIX
209
210#define SANITIZER_INTERCEPT_SCANF SI_POSIX
211#define SANITIZER_INTERCEPT_ISOC99_SCANF SI_LINUX_NOT_ANDROID
212
213#ifndef SANITIZER_INTERCEPT_PRINTF
214# define SANITIZER_INTERCEPT_PRINTF SI_POSIX
215# define SANITIZER_INTERCEPT_PRINTF_L (SI_FREEBSD || SI_NETBSD)
216# define SANITIZER_INTERCEPT_ISOC99_PRINTF SI_LINUX_NOT_ANDROID
217#endif
218
219#define SANITIZER_INTERCEPT___PRINTF_CHK \
220  (SANITIZER_INTERCEPT_PRINTF && SI_LINUX_NOT_ANDROID)
221
222#define SANITIZER_INTERCEPT_FREXP SI_NOT_FUCHSIA
223#define SANITIZER_INTERCEPT_FREXPF_FREXPL SI_POSIX
224
225#define SANITIZER_INTERCEPT_GETPWNAM_AND_FRIENDS SI_POSIX
226#define SANITIZER_INTERCEPT_GETPWNAM_R_AND_FRIENDS                            \
227  (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_MAC || SI_LINUX_NOT_ANDROID || \
228  SI_SOLARIS)
229#define SANITIZER_INTERCEPT_GETPWENT                                          \
230  (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_MAC || SI_LINUX_NOT_ANDROID || \
231  SI_SOLARIS)
232#define SANITIZER_INTERCEPT_FGETGRENT_R                                       \
233  (SI_FREEBSD || SI_OPENBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
234#define SANITIZER_INTERCEPT_FGETPWENT SI_LINUX_NOT_ANDROID || SI_SOLARIS
235#define SANITIZER_INTERCEPT_GETPWENT_R \
236  (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
237#define SANITIZER_INTERCEPT_FGETPWENT_R \
238  (SI_FREEBSD || SI_OPENBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
239#define SANITIZER_INTERCEPT_SETPWENT \
240  (SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
241#define SANITIZER_INTERCEPT_CLOCK_GETTIME \
242  (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_LINUX || SI_SOLARIS)
243#define SANITIZER_INTERCEPT_CLOCK_GETCPUCLOCKID SI_LINUX
244#define SANITIZER_INTERCEPT_GETITIMER SI_POSIX
245#define SANITIZER_INTERCEPT_TIME SI_POSIX
246#define SANITIZER_INTERCEPT_GLOB SI_LINUX_NOT_ANDROID || SI_SOLARIS
247#define SANITIZER_INTERCEPT_GLOB64 SI_LINUX_NOT_ANDROID
248#define SANITIZER_INTERCEPT_WAIT SI_POSIX
249#define SANITIZER_INTERCEPT_INET SI_POSIX
250#define SANITIZER_INTERCEPT_PTHREAD_GETSCHEDPARAM (SI_POSIX && !SI_OPENBSD)
251#define SANITIZER_INTERCEPT_GETADDRINFO SI_POSIX
252#define SANITIZER_INTERCEPT_GETNAMEINFO SI_POSIX
253#define SANITIZER_INTERCEPT_GETSOCKNAME SI_POSIX
254#define SANITIZER_INTERCEPT_GETHOSTBYNAME SI_POSIX
255#define SANITIZER_INTERCEPT_GETHOSTBYNAME2 SI_POSIX && !SI_SOLARIS
256#define SANITIZER_INTERCEPT_GETHOSTBYNAME_R \
257  (SI_FREEBSD || SI_LINUX || SI_SOLARIS)
258#define SANITIZER_INTERCEPT_GETHOSTBYNAME2_R \
259  (SI_FREEBSD || SI_LINUX_NOT_ANDROID)
260#define SANITIZER_INTERCEPT_GETHOSTBYADDR_R \
261  (SI_FREEBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
262#define SANITIZER_INTERCEPT_GETHOSTENT_R \
263  (SI_FREEBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
264#define SANITIZER_INTERCEPT_GETSOCKOPT SI_POSIX
265#define SANITIZER_INTERCEPT_ACCEPT SI_POSIX
266#define SANITIZER_INTERCEPT_ACCEPT4 \
267  (SI_LINUX_NOT_ANDROID || SI_NETBSD || SI_OPENBSD)
268#define SANITIZER_INTERCEPT_PACCEPT SI_NETBSD
269#define SANITIZER_INTERCEPT_MODF SI_POSIX
270#define SANITIZER_INTERCEPT_RECVMSG SI_POSIX
271#define SANITIZER_INTERCEPT_SENDMSG SI_POSIX
272#define SANITIZER_INTERCEPT_RECVMMSG SI_LINUX
273#define SANITIZER_INTERCEPT_SENDMMSG SI_LINUX
274#define SANITIZER_INTERCEPT_SYSMSG SI_LINUX_NOT_ANDROID
275#define SANITIZER_INTERCEPT_GETPEERNAME SI_POSIX
276#define SANITIZER_INTERCEPT_IOCTL SI_POSIX
277#define SANITIZER_INTERCEPT_INET_ATON SI_POSIX
278#define SANITIZER_INTERCEPT_SYSINFO SI_LINUX
279#define SANITIZER_INTERCEPT_READDIR SI_POSIX
280#define SANITIZER_INTERCEPT_READDIR64 SI_LINUX_NOT_ANDROID || SI_SOLARIS32
281#if SI_LINUX_NOT_ANDROID && \
282  (defined(__i386) || defined(__x86_64) || defined(__mips64) || \
283    defined(__powerpc64__) || defined(__aarch64__) || defined(__arm__) || \
284    defined(__s390__))
285#define SANITIZER_INTERCEPT_PTRACE 1
286#else
287#define SANITIZER_INTERCEPT_PTRACE 0
288#endif
289#define SANITIZER_INTERCEPT_SETLOCALE SI_POSIX
290#define SANITIZER_INTERCEPT_GETCWD SI_POSIX
291#define SANITIZER_INTERCEPT_GET_CURRENT_DIR_NAME SI_LINUX_NOT_ANDROID
292#define SANITIZER_INTERCEPT_STRTOIMAX SI_POSIX
293#define SANITIZER_INTERCEPT_MBSTOWCS SI_POSIX
294#define SANITIZER_INTERCEPT_MBSNRTOWCS \
295  (SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
296#define SANITIZER_INTERCEPT_WCSTOMBS SI_POSIX
297#define SANITIZER_INTERCEPT_STRXFRM SI_POSIX
298#define SANITIZER_INTERCEPT___STRXFRM_L SI_LINUX
299#define SANITIZER_INTERCEPT_WCSXFRM SI_POSIX
300#define SANITIZER_INTERCEPT___WCSXFRM_L SI_LINUX
301#define SANITIZER_INTERCEPT_WCSNRTOMBS                                        \
302  (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_MAC || SI_LINUX_NOT_ANDROID || \
303  SI_SOLARIS)
304#define SANITIZER_INTERCEPT_WCRTOMB                                           \
305  (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_MAC || SI_LINUX_NOT_ANDROID || \
306  SI_SOLARIS)
307#define SANITIZER_INTERCEPT_WCTOMB                                           \
308  (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_MAC || SI_LINUX_NOT_ANDROID || \
309  SI_SOLARIS)
310#define SANITIZER_INTERCEPT_TCGETATTR SI_LINUX_NOT_ANDROID || SI_SOLARIS
311#define SANITIZER_INTERCEPT_REALPATH SI_POSIX
312#define SANITIZER_INTERCEPT_CANONICALIZE_FILE_NAME \
313  (SI_LINUX_NOT_ANDROID || SI_SOLARIS)
314#define SANITIZER_INTERCEPT_CONFSTR                                           \
315  (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_MAC || SI_LINUX_NOT_ANDROID || \
316  SI_SOLARIS)
317#define SANITIZER_INTERCEPT_SCHED_GETAFFINITY SI_LINUX_NOT_ANDROID
318#define SANITIZER_INTERCEPT_SCHED_GETPARAM SI_LINUX_NOT_ANDROID || SI_SOLARIS
319#define SANITIZER_INTERCEPT_STRERROR SI_POSIX
320#define SANITIZER_INTERCEPT_STRERROR_R SI_POSIX
321#define SANITIZER_INTERCEPT_XPG_STRERROR_R SI_LINUX_NOT_ANDROID
322#define SANITIZER_INTERCEPT_SCANDIR \
323  (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
324#define SANITIZER_INTERCEPT_SCANDIR64 SI_LINUX_NOT_ANDROID || SI_SOLARIS32
325#define SANITIZER_INTERCEPT_GETGROUPS SI_POSIX
326#define SANITIZER_INTERCEPT_POLL SI_POSIX
327#define SANITIZER_INTERCEPT_PPOLL SI_LINUX_NOT_ANDROID || SI_SOLARIS
328#define SANITIZER_INTERCEPT_WORDEXP \
329  (SI_FREEBSD || SI_NETBSD || (SI_MAC && !SI_IOS) || SI_LINUX_NOT_ANDROID || \
330    SI_SOLARIS)
331#define SANITIZER_INTERCEPT_SIGWAIT SI_POSIX
332#define SANITIZER_INTERCEPT_SIGWAITINFO SI_LINUX_NOT_ANDROID || SI_SOLARIS
333#define SANITIZER_INTERCEPT_SIGTIMEDWAIT SI_LINUX_NOT_ANDROID || SI_SOLARIS
334#define SANITIZER_INTERCEPT_SIGSETOPS \
335  (SI_FREEBSD || SI_NETBSD || SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
336#define SANITIZER_INTERCEPT_SIGPENDING SI_POSIX
337#define SANITIZER_INTERCEPT_SIGPROCMASK SI_POSIX
338#define SANITIZER_INTERCEPT_PTHREAD_SIGMASK SI_POSIX
339#define SANITIZER_INTERCEPT_BACKTRACE \
340  (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
341#define SANITIZER_INTERCEPT_GETMNTENT SI_LINUX
342#define SANITIZER_INTERCEPT_GETMNTENT_R SI_LINUX_NOT_ANDROID
343#define SANITIZER_INTERCEPT_STATFS \
344  (SI_FREEBSD || SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
345#define SANITIZER_INTERCEPT_STATFS64 \
346  (((SI_MAC && !TARGET_CPU_ARM64) && !SI_IOS) || SI_LINUX_NOT_ANDROID)
347#define SANITIZER_INTERCEPT_STATVFS \
348  (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_LINUX_NOT_ANDROID)
349#define SANITIZER_INTERCEPT_STATVFS64 SI_LINUX_NOT_ANDROID
350#define SANITIZER_INTERCEPT_INITGROUPS SI_POSIX
351#define SANITIZER_INTERCEPT_ETHER_NTOA_ATON (SI_POSIX && !SI_OPENBSD)
352#define SANITIZER_INTERCEPT_ETHER_HOST \
353  (SI_FREEBSD || SI_MAC || SI_LINUX_NOT_ANDROID)
354#define SANITIZER_INTERCEPT_ETHER_R (SI_FREEBSD || SI_LINUX_NOT_ANDROID)
355#define SANITIZER_INTERCEPT_SHMCTL                                       \
356  (((SI_FREEBSD || SI_LINUX_NOT_ANDROID) && SANITIZER_WORDSIZE == 64) || \
357   SI_NETBSD || SI_OPENBSD || SI_SOLARIS)  // NOLINT
358#define SANITIZER_INTERCEPT_RANDOM_R SI_LINUX_NOT_ANDROID
359#define SANITIZER_INTERCEPT_PTHREAD_ATTR_GET SI_POSIX
360#define SANITIZER_INTERCEPT_PTHREAD_ATTR_GETINHERITSCHED \
361  (SI_FREEBSD || SI_NETBSD || SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
362#define SANITIZER_INTERCEPT_PTHREAD_ATTR_GETAFFINITY_NP SI_LINUX_NOT_ANDROID
363#define SANITIZER_INTERCEPT_PTHREAD_ATTR_GET_SCHED (SI_POSIX && !SI_OPENBSD)
364#define SANITIZER_INTERCEPT_PTHREAD_MUTEXATTR_GETPSHARED \
365  (SI_POSIX && !SI_NETBSD && !SI_OPENBSD)
366#define SANITIZER_INTERCEPT_PTHREAD_MUTEXATTR_GETTYPE (SI_POSIX && !SI_OPENBSD)
367#define SANITIZER_INTERCEPT_PTHREAD_MUTEXATTR_GETPROTOCOL \
368  (SI_MAC || SI_NETBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
369#define SANITIZER_INTERCEPT_PTHREAD_MUTEXATTR_GETPRIOCEILING \
370  (SI_MAC || SI_NETBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
371#define SANITIZER_INTERCEPT_PTHREAD_MUTEXATTR_GETROBUST \
372  (SI_LINUX_NOT_ANDROID || SI_SOLARIS)
373#define SANITIZER_INTERCEPT_PTHREAD_MUTEXATTR_GETROBUST_NP SI_LINUX_NOT_ANDROID
374#define SANITIZER_INTERCEPT_PTHREAD_RWLOCKATTR_GETPSHARED \
375  (SI_POSIX && !SI_NETBSD && !SI_OPENBSD)
376#define SANITIZER_INTERCEPT_PTHREAD_RWLOCKATTR_GETKIND_NP SI_LINUX_NOT_ANDROID
377#define SANITIZER_INTERCEPT_PTHREAD_CONDATTR_GETPSHARED \
378  (SI_POSIX && !SI_NETBSD && !SI_OPENBSD)
379#define SANITIZER_INTERCEPT_PTHREAD_CONDATTR_GETCLOCK \
380  (SI_LINUX_NOT_ANDROID || SI_SOLARIS)
381#define SANITIZER_INTERCEPT_PTHREAD_BARRIERATTR_GETPSHARED \
382  (SI_LINUX_NOT_ANDROID && !SI_NETBSD && !SI_OPENBSD)
383#define SANITIZER_INTERCEPT_THR_EXIT SI_FREEBSD
384#define SANITIZER_INTERCEPT_TMPNAM SI_POSIX
385#define SANITIZER_INTERCEPT_TMPNAM_R SI_LINUX_NOT_ANDROID || SI_SOLARIS
386#define SANITIZER_INTERCEPT_TTYNAME SI_POSIX
387#define SANITIZER_INTERCEPT_TTYNAME_R SI_POSIX
388#define SANITIZER_INTERCEPT_TEMPNAM SI_POSIX
389#define SANITIZER_INTERCEPT_SINCOS SI_LINUX || SI_SOLARIS
390#define SANITIZER_INTERCEPT_REMQUO SI_POSIX
391#define SANITIZER_INTERCEPT_REMQUOL (SI_POSIX && !SI_NETBSD)
392#define SANITIZER_INTERCEPT_LGAMMA SI_POSIX
393#define SANITIZER_INTERCEPT_LGAMMAL (SI_POSIX && !SI_NETBSD)
394#define SANITIZER_INTERCEPT_LGAMMA_R (SI_FREEBSD || SI_LINUX || SI_SOLARIS)
395#define SANITIZER_INTERCEPT_LGAMMAL_R SI_LINUX_NOT_ANDROID || SI_SOLARIS
396#define SANITIZER_INTERCEPT_DRAND48_R SI_LINUX_NOT_ANDROID
397#define SANITIZER_INTERCEPT_RAND_R                                            \
398  (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_MAC || SI_LINUX_NOT_ANDROID || \
399  SI_SOLARIS)
400#define SANITIZER_INTERCEPT_ICONV \
401  (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
402#define SANITIZER_INTERCEPT_TIMES SI_POSIX
403
404// FIXME: getline seems to be available on OSX 10.7
405#define SANITIZER_INTERCEPT_GETLINE \
406  (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
407
408#define SANITIZER_INTERCEPT__EXIT \
409  (SI_LINUX || SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_MAC || SI_SOLARIS)
410
411#define SANITIZER_INTERCEPT_PTHREAD_MUTEX SI_POSIX
412#define SANITIZER_INTERCEPT___PTHREAD_MUTEX SI_LINUX_NOT_ANDROID
413#define SANITIZER_INTERCEPT___LIBC_MUTEX SI_NETBSD
414#define SANITIZER_INTERCEPT_PTHREAD_SETNAME_NP \
415  (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
416#define SANITIZER_INTERCEPT_PTHREAD_GETNAME_NP \
417  (SI_FREEBSD || SI_NETBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
418
419#define SANITIZER_INTERCEPT_TLS_GET_ADDR \
420  (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
421
422#define SANITIZER_INTERCEPT_LISTXATTR SI_LINUX
423#define SANITIZER_INTERCEPT_GETXATTR SI_LINUX
424#define SANITIZER_INTERCEPT_GETRESID SI_LINUX
425#define SANITIZER_INTERCEPT_GETIFADDRS                                        \
426  (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_LINUX_NOT_ANDROID || SI_MAC || \
427  SI_SOLARIS)
428#define SANITIZER_INTERCEPT_IF_INDEXTONAME                                    \
429  (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_LINUX_NOT_ANDROID || SI_MAC || \
430  SI_SOLARIS)
431#define SANITIZER_INTERCEPT_CAPGET SI_LINUX_NOT_ANDROID
432#if SI_LINUX && defined(__arm__)
433#define SANITIZER_INTERCEPT_AEABI_MEM 1
434#else
435#define SANITIZER_INTERCEPT_AEABI_MEM 0
436#endif
437#define SANITIZER_INTERCEPT___BZERO SI_MAC || SI_LINUX_NOT_ANDROID
438#define SANITIZER_INTERCEPT_BZERO SI_LINUX_NOT_ANDROID
439#define SANITIZER_INTERCEPT_FTIME \
440  (!SI_FREEBSD && !SI_NETBSD && !SI_OPENBSD && SI_POSIX)
441#define SANITIZER_INTERCEPT_XDR SI_LINUX_NOT_ANDROID || SI_SOLARIS
442#define SANITIZER_INTERCEPT_TSEARCH \
443  (SI_LINUX_NOT_ANDROID || SI_MAC || SI_NETBSD || SI_OPENBSD || SI_SOLARIS)
444#define SANITIZER_INTERCEPT_LIBIO_INTERNALS SI_LINUX_NOT_ANDROID
445#define SANITIZER_INTERCEPT_FOPEN SI_POSIX
446#define SANITIZER_INTERCEPT_FOPEN64 SI_LINUX_NOT_ANDROID || SI_SOLARIS32
447#define SANITIZER_INTERCEPT_OPEN_MEMSTREAM \
448  (SI_LINUX_NOT_ANDROID || SI_NETBSD || SI_OPENBSD || SI_SOLARIS)
449#define SANITIZER_INTERCEPT_OBSTACK SI_LINUX_NOT_ANDROID
450#define SANITIZER_INTERCEPT_FFLUSH SI_POSIX
451#define SANITIZER_INTERCEPT_FCLOSE SI_POSIX
452
453#ifndef SANITIZER_INTERCEPT_DLOPEN_DLCLOSE
454#define SANITIZER_INTERCEPT_DLOPEN_DLCLOSE                                    \
455  (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_LINUX_NOT_ANDROID || SI_MAC || \
456  SI_SOLARIS)
457#endif
458
459#define SANITIZER_INTERCEPT_GETPASS \
460  (SI_LINUX_NOT_ANDROID || SI_MAC || SI_NETBSD || SI_OPENBSD)
461#define SANITIZER_INTERCEPT_TIMERFD SI_LINUX_NOT_ANDROID
462
463#define SANITIZER_INTERCEPT_MLOCKX SI_POSIX
464#define SANITIZER_INTERCEPT_FOPENCOOKIE SI_LINUX_NOT_ANDROID
465#define SANITIZER_INTERCEPT_SEM \
466  (SI_LINUX || SI_FREEBSD || SI_NETBSD || SI_SOLARIS)
467#define SANITIZER_INTERCEPT_PTHREAD_SETCANCEL SI_POSIX
468#define SANITIZER_INTERCEPT_MINCORE \
469  (SI_LINUX || SI_NETBSD || SI_OPENBSD || SI_SOLARIS)
470#define SANITIZER_INTERCEPT_PROCESS_VM_READV SI_LINUX
471#define SANITIZER_INTERCEPT_CTERMID \
472  (SI_LINUX || SI_MAC || SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_SOLARIS)
473#define SANITIZER_INTERCEPT_CTERMID_R (SI_MAC || SI_FREEBSD || SI_SOLARIS)
474
475#define SANITIZER_INTERCEPTOR_HOOKS \
476  (SI_LINUX || SI_MAC || SI_WINDOWS || SI_NETBSD)
477#define SANITIZER_INTERCEPT_RECV_RECVFROM SI_POSIX
478#define SANITIZER_INTERCEPT_SEND_SENDTO SI_POSIX
479#define SANITIZER_INTERCEPT_EVENTFD_READ_WRITE SI_LINUX
480
481#define SANITIZER_INTERCEPT_STAT \
482  (SI_FREEBSD || SI_MAC || SI_ANDROID || SI_NETBSD || SI_OPENBSD || SI_SOLARIS)
483#define SANITIZER_INTERCEPT_LSTAT (SI_NETBSD || SI_FREEBSD)
484#define SANITIZER_INTERCEPT___XSTAT (!SANITIZER_INTERCEPT_STAT && SI_POSIX)
485#define SANITIZER_INTERCEPT___XSTAT64 SI_LINUX_NOT_ANDROID
486#define SANITIZER_INTERCEPT___LXSTAT SANITIZER_INTERCEPT___XSTAT
487#define SANITIZER_INTERCEPT___LXSTAT64 SI_LINUX_NOT_ANDROID
488
489#define SANITIZER_INTERCEPT_UTMP \
490  (SI_POSIX && !SI_MAC && !SI_FREEBSD && !SI_NETBSD)
491#define SANITIZER_INTERCEPT_UTMPX \
492  (SI_LINUX_NOT_ANDROID || SI_MAC || SI_FREEBSD || SI_NETBSD)
493
494#define SANITIZER_INTERCEPT_GETLOADAVG \
495  (SI_LINUX_NOT_ANDROID || SI_MAC || SI_FREEBSD || SI_NETBSD || SI_OPENBSD)
496
497#define SANITIZER_INTERCEPT_MMAP SI_POSIX
498#define SANITIZER_INTERCEPT_MMAP64 SI_LINUX_NOT_ANDROID
499#define SANITIZER_INTERCEPT_MALLOPT_AND_MALLINFO \
500  (!SI_FREEBSD && !SI_MAC && !SI_NETBSD && !SI_OPENBSD && SI_NOT_FUCHSIA && \
501  SI_NOT_RTEMS)
502#define SANITIZER_INTERCEPT_MEMALIGN \
503  (!SI_FREEBSD && !SI_MAC && !SI_NETBSD && !SI_OPENBSD && SI_NOT_RTEMS)
504#define SANITIZER_INTERCEPT_PVALLOC \
505  (!SI_FREEBSD && !SI_MAC && !SI_NETBSD && !SI_OPENBSD && SI_NOT_FUCHSIA && \
506  SI_NOT_RTEMS)
507#define SANITIZER_INTERCEPT_CFREE \
508  (!SI_FREEBSD && !SI_MAC && !SI_NETBSD && !SI_OPENBSD && SI_NOT_FUCHSIA && \
509  SI_NOT_RTEMS)
510#define SANITIZER_INTERCEPT_REALLOCARRAY SI_POSIX
511#define SANITIZER_INTERCEPT_ALIGNED_ALLOC (!SI_MAC && SI_NOT_RTEMS)
512#define SANITIZER_INTERCEPT_MALLOC_USABLE_SIZE \
513  (!SI_MAC && !SI_OPENBSD && !SI_NETBSD)
514#define SANITIZER_INTERCEPT_MCHECK_MPROBE SI_LINUX_NOT_ANDROID
515#define SANITIZER_INTERCEPT_WCSCAT SI_POSIX
516#define SANITIZER_INTERCEPT_WCSDUP SI_POSIX
517#define SANITIZER_INTERCEPT_SIGNAL_AND_SIGACTION (!SI_WINDOWS && SI_NOT_FUCHSIA)
518#define SANITIZER_INTERCEPT_BSD_SIGNAL SI_ANDROID
519
520#define SANITIZER_INTERCEPT_ACCT (SI_NETBSD || SI_OPENBSD || SI_FREEBSD)
521#define SANITIZER_INTERCEPT_USER_FROM_UID SI_NETBSD
522#define SANITIZER_INTERCEPT_UID_FROM_USER SI_NETBSD
523#define SANITIZER_INTERCEPT_GROUP_FROM_GID SI_NETBSD
524#define SANITIZER_INTERCEPT_GID_FROM_GROUP SI_NETBSD
525#define SANITIZER_INTERCEPT_ACCESS (SI_NETBSD || SI_OPENBSD || SI_FREEBSD)
526#define SANITIZER_INTERCEPT_FACCESSAT (SI_NETBSD || SI_OPENBSD || SI_FREEBSD)
527#define SANITIZER_INTERCEPT_GETGROUPLIST (SI_NETBSD || SI_OPENBSD)
528#define SANITIZER_INTERCEPT_STRLCPY                                            \
529  (SI_NETBSD || SI_FREEBSD || SI_OPENBSD || SI_MAC || SI_ANDROID)
530
531#define SANITIZER_INTERCEPT_NAME_TO_HANDLE_AT SI_LINUX_NOT_ANDROID
532#define SANITIZER_INTERCEPT_OPEN_BY_HANDLE_AT SI_LINUX_NOT_ANDROID
533
534#define SANITIZER_INTERCEPT_READLINK SI_POSIX
535#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && \
536    __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101000
537# define SI_MAC_DEPLOYMENT_BELOW_10_10 1
538#else
539# define SI_MAC_DEPLOYMENT_BELOW_10_10 0
540#endif
541#define SANITIZER_INTERCEPT_READLINKAT \
542  (SI_POSIX && !SI_MAC_DEPLOYMENT_BELOW_10_10)
543
544#define SANITIZER_INTERCEPT_DEVNAME (SI_NETBSD || SI_OPENBSD || SI_FREEBSD)
545#define SANITIZER_INTERCEPT_DEVNAME_R (SI_NETBSD || SI_FREEBSD)
546#define SANITIZER_INTERCEPT_FGETLN (SI_NETBSD || SI_FREEBSD)
547#define SANITIZER_INTERCEPT_STRMODE (SI_NETBSD || SI_FREEBSD)
548#define SANITIZER_INTERCEPT_TTYENT SI_NETBSD
549#define SANITIZER_INTERCEPT_PROTOENT (SI_NETBSD || SI_LINUX)
550#define SANITIZER_INTERCEPT_PROTOENT_R (SI_LINUX_NOT_ANDROID)
551#define SANITIZER_INTERCEPT_NETENT SI_NETBSD
552#define SANITIZER_INTERCEPT_SETVBUF (SI_NETBSD || SI_FREEBSD || \
553  SI_LINUX || SI_MAC)
554#define SANITIZER_INTERCEPT_GETMNTINFO (SI_NETBSD || SI_FREEBSD || SI_MAC)
555#define SANITIZER_INTERCEPT_MI_VECTOR_HASH SI_NETBSD
556#define SANITIZER_INTERCEPT_GETVFSSTAT SI_NETBSD
557#define SANITIZER_INTERCEPT_REGEX (SI_NETBSD || SI_FREEBSD || SI_LINUX)
558#define SANITIZER_INTERCEPT_REGEXSUB SI_NETBSD
559#define SANITIZER_INTERCEPT_FTS (SI_NETBSD || SI_FREEBSD)
560#define SANITIZER_INTERCEPT_SYSCTL (SI_NETBSD || SI_FREEBSD || SI_MAC)
561#define SANITIZER_INTERCEPT_ASYSCTL SI_NETBSD
562#define SANITIZER_INTERCEPT_SYSCTLGETMIBINFO SI_NETBSD
563#define SANITIZER_INTERCEPT_NL_LANGINFO (SI_NETBSD || SI_FREEBSD || SI_MAC)
564#define SANITIZER_INTERCEPT_MODCTL SI_NETBSD
565#define SANITIZER_INTERCEPT_CAPSICUM SI_FREEBSD
566#define SANITIZER_INTERCEPT_STRTONUM (SI_NETBSD || SI_FREEBSD)
567#define SANITIZER_INTERCEPT_FPARSELN SI_NETBSD
568#define SANITIZER_INTERCEPT_STATVFS1 SI_NETBSD
569#define SANITIZER_INTERCEPT_STRTOI SI_NETBSD
570#define SANITIZER_INTERCEPT_CAPSICUM SI_FREEBSD
571#define SANITIZER_INTERCEPT_SHA1 SI_NETBSD
572#define SANITIZER_INTERCEPT_MD4 SI_NETBSD
573#define SANITIZER_INTERCEPT_RMD160 SI_NETBSD
574#define SANITIZER_INTERCEPT_MD5 SI_NETBSD
575#define SANITIZER_INTERCEPT_FSEEK (SI_NETBSD || SI_FREEBSD)
576#define SANITIZER_INTERCEPT_MD2 SI_NETBSD
577#define SANITIZER_INTERCEPT_SHA2 SI_NETBSD
578#define SANITIZER_INTERCEPT_CDB SI_NETBSD
579#define SANITIZER_INTERCEPT_VIS (SI_NETBSD || SI_FREEBSD)
580#define SANITIZER_INTERCEPT_POPEN SI_POSIX
581#define SANITIZER_INTERCEPT_POPENVE SI_NETBSD
582#define SANITIZER_INTERCEPT_PCLOSE SI_POSIX
583#define SANITIZER_INTERCEPT_FUNOPEN (SI_NETBSD || SI_FREEBSD)
584#define SANITIZER_INTERCEPT_FUNOPEN2 SI_NETBSD
585#define SANITIZER_INTERCEPT_GETFSENT (SI_FREEBSD || SI_NETBSD || SI_MAC)
586#define SANITIZER_INTERCEPT_ARC4RANDOM (SI_FREEBSD || SI_NETBSD || SI_MAC)
587#define SANITIZER_INTERCEPT_FDEVNAME SI_FREEBSD
588#define SANITIZER_INTERCEPT_GETUSERSHELL (SI_POSIX && !SI_ANDROID)
589#define SANITIZER_INTERCEPT_SL_INIT (SI_FREEBSD || SI_NETBSD)
590#define SANITIZER_INTERCEPT_CRYPT (SI_POSIX && !SI_ANDROID)
591#define SANITIZER_INTERCEPT_CRYPT_R (SI_LINUX && !SI_ANDROID)
592
593#define SANITIZER_INTERCEPT_GETRANDOM \
594  ((SI_LINUX && __GLIBC_PREREQ(2, 25)) || SI_FREEBSD)
595#define SANITIZER_INTERCEPT___CXA_ATEXIT SI_NETBSD
596#define SANITIZER_INTERCEPT_ATEXIT SI_NETBSD
597#define SANITIZER_INTERCEPT_PTHREAD_ATFORK SI_NETBSD
598#define SANITIZER_INTERCEPT_GETENTROPY SI_FREEBSD
599#define SANITIZER_INTERCEPT_QSORT \
600  (SI_POSIX && !SI_IOSSIM && !SI_WATCHOS && !SI_TVOS && !SI_ANDROID)
601#define SANITIZER_INTERCEPT_QSORT_R (SI_LINUX && !SI_ANDROID)
602// sigaltstack on i386 macOS cannot be intercepted due to setjmp()
603// calling it and assuming that it does not clobber registers.
604#define SANITIZER_INTERCEPT_SIGALTSTACK \
605  (SI_POSIX && !(SANITIZER_MAC && SANITIZER_I386))
606#define SANITIZER_INTERCEPT_UNAME (SI_POSIX && !SI_FREEBSD)
607#define SANITIZER_INTERCEPT___XUNAME SI_FREEBSD
608
609#endif  // #ifndef SANITIZER_PLATFORM_INTERCEPTORS_H
610