brintos

brintos / llvm-project-archived public Read only

0
0
Text · 28.2 KiB · ed60671 Raw
700 lines · c
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-exception6//7//===----------------------------------------------------------------------===//8//9// This file defines macro telling whether sanitizer tools can/should intercept10// given library functions on a given platform.11//12//===----------------------------------------------------------------------===//13#ifndef SANITIZER_PLATFORM_INTERCEPTORS_H14#define SANITIZER_PLATFORM_INTERCEPTORS_H15 16#include "sanitizer_glibc_version.h"17#include "sanitizer_internal_defs.h"18#include "sanitizer_platform.h"19 20#if SANITIZER_POSIX21#define SI_POSIX 122#else23#define SI_POSIX 024#endif25 26#if !SANITIZER_WINDOWS27#define SI_WINDOWS 028#else29#define SI_WINDOWS 130#endif31 32#if SI_WINDOWS && SI_POSIX33#error "Windows is not POSIX!"34#endif35 36#if SI_POSIX37#include "sanitizer_platform_limits_freebsd.h"38#include "sanitizer_platform_limits_netbsd.h"39#include "sanitizer_platform_limits_posix.h"40#include "sanitizer_platform_limits_solaris.h"41#endif42 43#if SANITIZER_LINUX && !SANITIZER_ANDROID44#define SI_LINUX_NOT_ANDROID 145#else46#define SI_LINUX_NOT_ANDROID 047#endif48 49#if SANITIZER_GLIBC50#define SI_GLIBC 151#else52#define SI_GLIBC 053#endif54 55#if SANITIZER_ANDROID56#define SI_ANDROID 157#else58#define SI_ANDROID 059#endif60 61#if SANITIZER_FREEBSD62#define SI_FREEBSD 163#else64#define SI_FREEBSD 065#endif66 67#if SANITIZER_NETBSD68#define SI_NETBSD 169#else70#define SI_NETBSD 071#endif72 73#if SANITIZER_LINUX74#define SI_LINUX 175#else76#define SI_LINUX 077#endif78 79#if SANITIZER_APPLE80#define SI_MAC 181#define SI_NOT_MAC 082#else83#define SI_MAC 084#define SI_NOT_MAC 185#endif86 87#if SANITIZER_APPLE88#  include <Availability.h>89 90// aligned_alloc was introduced in OSX 10.1591// Linking will fail when using an older SDK92#  if defined(__MAC_10_15)93// macOS 10.15 is greater than our minimal deployment target.  To ensure we94// generate a weak reference so the dylib continues to work on older95// systems, we need to forward declare the intercepted function as "weak96// imports".97SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,98                                          __sanitizer::usize __size);99#    define SI_MAC_SDK_10_15_AVAILABLE 1100#  else101#    define SI_MAC_SDK_10_15_AVAILABLE 0102#  endif  // defined(__MAC_10_15)103 104#endif  // SANITIZER_APPLE105 106#if SANITIZER_IOS107#define SI_IOS 1108#else109#define SI_IOS 0110#endif111 112#if SANITIZER_IOSSIM113#define SI_IOSSIM 1114#else115#define SI_IOSSIM 0116#endif117 118#if SANITIZER_WATCHOS119#define SI_WATCHOS 1120#else121#define SI_WATCHOS 0122#endif123 124#if SANITIZER_TVOS125#define SI_TVOS 1126#else127#define SI_TVOS 0128#endif129 130#if SANITIZER_FUCHSIA131#define SI_NOT_FUCHSIA 0132#define SI_FUCHSIA 1133#else134#define SI_NOT_FUCHSIA 1135#define SI_FUCHSIA 0136#endif137 138#if SANITIZER_SOLARIS139#define SI_SOLARIS 1140#else141#define SI_SOLARIS 0142#endif143 144#if SANITIZER_AIX145#  define SI_NOT_AIX 0146#else147#  define SI_NOT_AIX 1148#endif149 150#if SANITIZER_SOLARIS32151#define SI_SOLARIS32 1152#else153#define SI_SOLARIS32 0154#endif155 156#if SANITIZER_POSIX && !SANITIZER_APPLE157#define SI_POSIX_NOT_MAC 1158#else159#define SI_POSIX_NOT_MAC 0160#endif161 162#if SANITIZER_LINUX && !SANITIZER_FREEBSD163#define SI_LINUX_NOT_FREEBSD 1164#else165#define SI_LINUX_NOT_FREEBSD 0166#endif167 168#define SANITIZER_INTERCEPT_STRLEN SI_NOT_FUCHSIA169#define SANITIZER_INTERCEPT_STRNLEN (SI_NOT_MAC && SI_NOT_FUCHSIA)170#define SANITIZER_INTERCEPT_STRCMP (SI_NOT_FUCHSIA && SI_NOT_AIX)171#define SANITIZER_INTERCEPT_STRSTR SI_NOT_FUCHSIA172#define SANITIZER_INTERCEPT_STRCASESTR (SI_POSIX && SI_NOT_AIX)173#define SANITIZER_INTERCEPT_STRTOK SI_NOT_FUCHSIA174#define SANITIZER_INTERCEPT_STRCHR SI_NOT_FUCHSIA175#define SANITIZER_INTERCEPT_STRCHRNUL (SI_POSIX_NOT_MAC && SI_NOT_AIX)176#define SANITIZER_INTERCEPT_STRRCHR SI_NOT_FUCHSIA177#define SANITIZER_INTERCEPT_STRSPN SI_NOT_FUCHSIA178#define SANITIZER_INTERCEPT_STRPBRK SI_NOT_FUCHSIA179#define SANITIZER_INTERCEPT_TEXTDOMAIN SI_LINUX_NOT_ANDROID || SI_SOLARIS180#define SANITIZER_INTERCEPT_STRCASECMP SI_POSIX181#define SANITIZER_INTERCEPT_MEMSET 1182#define SANITIZER_INTERCEPT_MEMMOVE SI_NOT_AIX183#define SANITIZER_INTERCEPT_MEMCPY SI_NOT_AIX184#define SANITIZER_INTERCEPT_MEMCMP SI_NOT_FUCHSIA185#define SANITIZER_INTERCEPT_BCMP \186  SANITIZER_INTERCEPT_MEMCMP &&  \187      ((SI_POSIX && _GNU_SOURCE) || SI_NETBSD || SI_FREEBSD)188#define SANITIZER_INTERCEPT_STRNDUP SI_POSIX189#define SANITIZER_INTERCEPT___STRNDUP SI_GLIBC190#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && \191    __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070192#define SI_MAC_DEPLOYMENT_BELOW_10_7 1193#else194#define SI_MAC_DEPLOYMENT_BELOW_10_7 0195#endif196// memmem on Darwin doesn't exist on 10.6197// FIXME: enable memmem on Windows.198#define SANITIZER_INTERCEPT_MEMMEM (SI_POSIX && !SI_MAC_DEPLOYMENT_BELOW_10_7)199#define SANITIZER_INTERCEPT_MEMCHR SI_NOT_FUCHSIA200#define SANITIZER_INTERCEPT_MEMRCHR (SI_FREEBSD || SI_LINUX || SI_NETBSD)201 202#define SANITIZER_INTERCEPT_READ SI_POSIX203#define SANITIZER_INTERCEPT_PREAD SI_POSIX204#define SANITIZER_INTERCEPT_WRITE SI_POSIX205#define SANITIZER_INTERCEPT_PWRITE SI_POSIX206 207#define SANITIZER_INTERCEPT_FREAD SI_POSIX208#define SANITIZER_INTERCEPT_FWRITE SI_POSIX209#define SANITIZER_INTERCEPT_FGETS SI_POSIX210#define SANITIZER_INTERCEPT_FPUTS SI_POSIX211#define SANITIZER_INTERCEPT_PUTS SI_POSIX212 213#define SANITIZER_INTERCEPT_CREAT64 (SI_GLIBC || SI_SOLARIS32)214#define SANITIZER_INTERCEPT_FCNTL64 (SI_GLIBC || SI_SOLARIS32)215#define SANITIZER_INTERCEPT_OPEN64 (SI_GLIBC || SI_SOLARIS32)216#define SANITIZER_INTERCEPT_OPENAT64 (SI_GLIBC || SI_SOLARIS32)217 218#define SANITIZER_INTERCEPT_PREAD64 (SI_GLIBC || SI_SOLARIS32)219#define SANITIZER_INTERCEPT_PWRITE64 (SI_GLIBC || SI_SOLARIS32)220 221#define SANITIZER_INTERCEPT_LSEEK64 (SI_GLIBC || SI_SOLARIS32)222 223#define SANITIZER_INTERCEPT_READV SI_POSIX224#define SANITIZER_INTERCEPT_WRITEV SI_POSIX225 226#define SANITIZER_INTERCEPT_PREADV \227  (SI_FREEBSD || SI_NETBSD || SI_LINUX_NOT_ANDROID)228#define SANITIZER_INTERCEPT_PWRITEV \229  (SI_FREEBSD || SI_NETBSD || SI_LINUX_NOT_ANDROID)230#define SANITIZER_INTERCEPT_PREADV64 SI_GLIBC231#define SANITIZER_INTERCEPT_PWRITEV64 SI_GLIBC232 233#define SANITIZER_INTERCEPT_PRCTL SI_LINUX234 235#define SANITIZER_INTERCEPT_LOCALTIME_AND_FRIENDS SI_POSIX236#define SANITIZER_INTERCEPT_STRPTIME SI_POSIX237 238#define SANITIZER_INTERCEPT_SCANF SI_POSIX239#define SANITIZER_INTERCEPT_ISOC99_SCANF SI_GLIBC240 241#ifndef SANITIZER_INTERCEPT_PRINTF242#  define SANITIZER_INTERCEPT_ASPRINTF SI_NOT_AIX243#  define SANITIZER_INTERCEPT_VASPRINTF SI_NOT_AIX244#  define SANITIZER_INTERCEPT_PRINTF SI_POSIX245#  define SANITIZER_INTERCEPT_PRINTF_L (SI_FREEBSD || SI_NETBSD)246#  define SANITIZER_INTERCEPT_ISOC99_PRINTF SI_GLIBC247#endif248 249#define SANITIZER_INTERCEPT_SETPROCTITLE (SI_FREEBSD || SI_NETBSD)250 251#define SANITIZER_INTERCEPT___PRINTF_CHK \252  (SANITIZER_INTERCEPT_PRINTF && SI_GLIBC)253 254// AIX libc does not export FREXP and FREXPF.255#define SANITIZER_INTERCEPT_FREXP (SI_NOT_FUCHSIA && SI_NOT_AIX)256#define SANITIZER_INTERCEPT_FREXPF (SI_POSIX && SI_NOT_AIX)257#define SANITIZER_INTERCEPT_FREXPL SI_POSIX258 259#define SANITIZER_INTERCEPT_GETPWNAM_AND_FRIENDS SI_POSIX260#define SANITIZER_INTERCEPT_GETPWNAM_R_AND_FRIENDS \261  (SI_FREEBSD || SI_NETBSD || SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS)262#define SANITIZER_INTERCEPT_GETPWENT \263  (SI_FREEBSD || SI_NETBSD || SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS)264#define SANITIZER_INTERCEPT_FGETGRENT_R (SI_GLIBC || SI_SOLARIS)265#define SANITIZER_INTERCEPT_FGETPWENT SI_LINUX_NOT_ANDROID || SI_SOLARIS266#define SANITIZER_INTERCEPT_GETPWENT_R \267  (SI_FREEBSD || SI_NETBSD || SI_GLIBC || SI_SOLARIS)268#define SANITIZER_INTERCEPT_FGETPWENT_R (SI_FREEBSD || SI_GLIBC || SI_SOLARIS)269#define SANITIZER_INTERCEPT_SETPWENT \270  (SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS)271#define SANITIZER_INTERCEPT_CLOCK_GETTIME \272  (SI_FREEBSD || SI_NETBSD || SI_LINUX || SI_SOLARIS)273#define SANITIZER_INTERCEPT_CLOCK_GETCPUCLOCKID \274  (SI_LINUX || SI_FREEBSD || SI_NETBSD)275// TODO: This should be SI_POSIX, adding glibc first until I have time276// to verify all timer_t typedefs on other platforms.277#define SANITIZER_INTERCEPT_TIMER_CREATE SI_GLIBC278#define SANITIZER_INTERCEPT_GETITIMER SI_POSIX279#define SANITIZER_INTERCEPT_TIME SI_POSIX280#define SANITIZER_INTERCEPT_TIMESPEC_GET SI_LINUX281#define SANITIZER_INTERCEPT_GLOB (SI_GLIBC || SI_SOLARIS)282#define SANITIZER_INTERCEPT_GLOB64 SI_GLIBC283#define SANITIZER_INTERCEPT___B64_TO SI_LINUX_NOT_ANDROID284#define SANITIZER_INTERCEPT_DN_COMP_EXPAND SI_LINUX_NOT_ANDROID285#define SANITIZER_INTERCEPT_POSIX_SPAWN SI_POSIX286#define SANITIZER_INTERCEPT_WAIT SI_POSIX287#define SANITIZER_INTERCEPT_INET SI_POSIX288#define SANITIZER_INTERCEPT_PTHREAD_GETSCHEDPARAM SI_POSIX289#define SANITIZER_INTERCEPT_GETADDRINFO SI_POSIX290#define SANITIZER_INTERCEPT_GETNAMEINFO SI_POSIX291#define SANITIZER_INTERCEPT_GETSOCKNAME SI_POSIX292#define SANITIZER_INTERCEPT_GETHOSTBYNAME SI_POSIX293#define SANITIZER_INTERCEPT_GETHOSTBYNAME2 SI_POSIX && !SI_SOLARIS294#define SANITIZER_INTERCEPT_GETHOSTBYNAME_R \295  (SI_FREEBSD || SI_LINUX || SI_SOLARIS)296#define SANITIZER_INTERCEPT_GETHOSTBYNAME2_R \297  (SI_FREEBSD || SI_LINUX_NOT_ANDROID)298#define SANITIZER_INTERCEPT_GETHOSTBYADDR_R \299  (SI_FREEBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)300#define SANITIZER_INTERCEPT_GETHOSTENT_R (SI_FREEBSD || SI_GLIBC || SI_SOLARIS)301#define SANITIZER_INTERCEPT_GETSOCKOPT SI_POSIX302#define SANITIZER_INTERCEPT_ACCEPT SI_POSIX303#define SANITIZER_INTERCEPT_ACCEPT4 \304  (SI_LINUX_NOT_ANDROID || SI_NETBSD || SI_FREEBSD)305#define SANITIZER_INTERCEPT_PACCEPT SI_NETBSD306#define SANITIZER_INTERCEPT_MODF (SI_POSIX && SI_NOT_AIX)307#define SANITIZER_INTERCEPT_RECVMSG SI_POSIX308#define SANITIZER_INTERCEPT_SENDMSG SI_POSIX309#define SANITIZER_INTERCEPT_RECVMMSG SI_LINUX310#define SANITIZER_INTERCEPT_SENDMMSG SI_LINUX311#define SANITIZER_INTERCEPT_SYSMSG SI_LINUX_NOT_ANDROID312#define SANITIZER_INTERCEPT_GETPEERNAME SI_POSIX313#define SANITIZER_INTERCEPT_IOCTL SI_POSIX314#define SANITIZER_INTERCEPT_INET_ATON SI_POSIX315#define SANITIZER_INTERCEPT_SYSINFO SI_LINUX316#define SANITIZER_INTERCEPT_READDIR SI_POSIX317#define SANITIZER_INTERCEPT_READDIR64 SI_GLIBC || SI_SOLARIS32318#if SI_LINUX_NOT_ANDROID &&                                                \319    (defined(__i386) || defined(__x86_64) || defined(__mips64) ||          \320     defined(__powerpc64__) || defined(__aarch64__) || defined(__arm__) || \321     defined(__s390__) || defined(__loongarch__) || SANITIZER_RISCV64 ||   \322     defined(__sparc__))323#  define SANITIZER_INTERCEPT_PTRACE 1324#else325#define SANITIZER_INTERCEPT_PTRACE 0326#endif327#define SANITIZER_INTERCEPT_SETLOCALE SI_POSIX328#define SANITIZER_INTERCEPT_GETCWD SI_POSIX329#define SANITIZER_INTERCEPT_GET_CURRENT_DIR_NAME SI_LINUX_NOT_ANDROID330#define SANITIZER_INTERCEPT_STRTOIMAX SI_POSIX331#define SANITIZER_INTERCEPT_MBSTOWCS SI_POSIX332#define SANITIZER_INTERCEPT_MBSNRTOWCS \333  (SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS)334#define SANITIZER_INTERCEPT_WCSTOMBS SI_POSIX335#define SANITIZER_INTERCEPT_STRXFRM SI_POSIX336#define SANITIZER_INTERCEPT___STRXFRM_L SI_LINUX337#define SANITIZER_INTERCEPT_WCSXFRM SI_POSIX338#define SANITIZER_INTERCEPT___WCSXFRM_L SI_LINUX339#define SANITIZER_INTERCEPT_WCSNRTOMBS \340  (SI_FREEBSD || SI_NETBSD || SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS)341#define SANITIZER_INTERCEPT_WCRTOMB                                           \342  (SI_FREEBSD || SI_NETBSD || SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS || \343   !SI_NOT_AIX)344#define SANITIZER_INTERCEPT_WCTOMB \345  (SI_FREEBSD || SI_NETBSD || SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS)346#define SANITIZER_INTERCEPT_TCGETATTR SI_LINUX_NOT_ANDROID || SI_SOLARIS347#define SANITIZER_INTERCEPT_REALPATH SI_POSIX348#define SANITIZER_INTERCEPT_CANONICALIZE_FILE_NAME (SI_GLIBC || SI_SOLARIS)349#define SANITIZER_INTERCEPT_CONFSTR \350  (SI_FREEBSD || SI_NETBSD || SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS)351#define SANITIZER_INTERCEPT_SCHED_GETAFFINITY \352  (SI_LINUX_NOT_ANDROID || SI_FREEBSD)353#define SANITIZER_INTERCEPT_SCHED_GETPARAM SI_LINUX_NOT_ANDROID || SI_SOLARIS354#define SANITIZER_INTERCEPT_STRERROR SI_POSIX355#define SANITIZER_INTERCEPT_STRERROR_R SI_POSIX356#define SANITIZER_INTERCEPT_XPG_STRERROR_R SI_LINUX_NOT_ANDROID357#define SANITIZER_INTERCEPT_SCANDIR \358  (SI_FREEBSD || SI_NETBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)359#define SANITIZER_INTERCEPT_SCANDIR64 SI_GLIBC || SI_SOLARIS32360#define SANITIZER_INTERCEPT_GETGROUPS SI_POSIX361#define SANITIZER_INTERCEPT_POLL SI_POSIX362#define SANITIZER_INTERCEPT_PPOLL SI_LINUX_NOT_ANDROID || SI_SOLARIS363#define SANITIZER_INTERCEPT_EPOLL (SI_LINUX)364#define SANITIZER_INTERCEPT_KQUEUE (SI_FREEBSD || SI_NETBSD || SI_MAC)365#define SANITIZER_INTERCEPT_WORDEXP                                          \366  (SI_FREEBSD || SI_NETBSD || (SI_MAC && !SI_IOS) || SI_LINUX_NOT_ANDROID || \367   SI_SOLARIS)368#define SANITIZER_INTERCEPT_SIGWAIT SI_POSIX369#define SANITIZER_INTERCEPT_SIGWAITINFO SI_LINUX_NOT_ANDROID || SI_SOLARIS370#define SANITIZER_INTERCEPT_SIGTIMEDWAIT SI_LINUX_NOT_ANDROID || SI_SOLARIS371#define SANITIZER_INTERCEPT_SIGSETOPS \372  (SI_FREEBSD || SI_NETBSD || SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS)373#define SANITIZER_INTERCEPT_SIGSET_LOGICOPS SI_LINUX_NOT_ANDROID374#define SANITIZER_INTERCEPT_SIGPENDING SI_POSIX375#define SANITIZER_INTERCEPT_SIGPROCMASK SI_POSIX376#define SANITIZER_INTERCEPT_PTHREAD_SIGMASK SI_POSIX377#define SANITIZER_INTERCEPT_BACKTRACE \378  (SI_FREEBSD || SI_NETBSD || SI_GLIBC || SI_SOLARIS)379#define SANITIZER_INTERCEPT_GETMNTENT SI_LINUX380#define SANITIZER_INTERCEPT_GETMNTENT_R SI_LINUX_NOT_ANDROID381#define SANITIZER_INTERCEPT_STATFS \382  (SI_FREEBSD || SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS)383#define SANITIZER_INTERCEPT_STATFS64 \384  ((SI_GLIBC || !SI_NOT_AIX) && SANITIZER_HAS_STATFS64)385#define SANITIZER_INTERCEPT_STATVFS \386  (SI_FREEBSD || SI_NETBSD || SI_LINUX_NOT_ANDROID)387#define SANITIZER_INTERCEPT_STATVFS64 SI_GLIBC388#define SANITIZER_INTERCEPT_INITGROUPS SI_POSIX389#define SANITIZER_INTERCEPT_ETHER_NTOA_ATON SI_POSIX390#define SANITIZER_INTERCEPT_ETHER_HOST \391  (SI_FREEBSD || SI_MAC || SI_LINUX_NOT_ANDROID)392#define SANITIZER_INTERCEPT_ETHER_R (SI_FREEBSD || SI_LINUX_NOT_ANDROID)393#define SANITIZER_INTERCEPT_SHMCTL                                       \394  (((SI_FREEBSD || SI_LINUX_NOT_ANDROID) && SANITIZER_WORDSIZE == 64) || \395   SI_NETBSD || SI_SOLARIS)396#define SANITIZER_INTERCEPT_RANDOM_R SI_GLIBC397#define SANITIZER_INTERCEPT_PTHREAD_ATTR_GET SI_POSIX398#define SANITIZER_INTERCEPT_PTHREAD_ATTR_GETINHERITSCHED \399  (SI_FREEBSD || SI_NETBSD || SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS)400#define SANITIZER_INTERCEPT_PTHREAD_ATTR_GETAFFINITY_NP SI_GLIBC401#define SANITIZER_INTERCEPT_PTHREAD_GETAFFINITY_NP \402  (SI_LINUX_NOT_ANDROID || SI_FREEBSD)403#define SANITIZER_INTERCEPT_PTHREAD_ATTR_GET_SCHED SI_POSIX404#define SANITIZER_INTERCEPT_PTHREAD_MUTEXATTR_GETPSHARED \405  (SI_POSIX && !SI_NETBSD)406#define SANITIZER_INTERCEPT_PTHREAD_MUTEXATTR_GETTYPE SI_POSIX407#define SANITIZER_INTERCEPT_PTHREAD_MUTEXATTR_GETPROTOCOL \408  (SI_MAC || SI_NETBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)409#define SANITIZER_INTERCEPT_PTHREAD_MUTEXATTR_GETPRIOCEILING \410  (SI_MAC || SI_NETBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)411#define SANITIZER_INTERCEPT_PTHREAD_MUTEXATTR_GETROBUST \412  (SI_LINUX_NOT_ANDROID || SI_SOLARIS)413#define SANITIZER_INTERCEPT_PTHREAD_MUTEXATTR_GETROBUST_NP SI_LINUX_NOT_ANDROID414#define SANITIZER_INTERCEPT_PTHREAD_RWLOCKATTR_GETPSHARED \415  (SI_POSIX && !SI_NETBSD)416#define SANITIZER_INTERCEPT_PTHREAD_RWLOCKATTR_GETKIND_NP SI_GLIBC417#define SANITIZER_INTERCEPT_PTHREAD_CONDATTR_GETPSHARED (SI_POSIX && !SI_NETBSD)418#define SANITIZER_INTERCEPT_PTHREAD_CONDATTR_GETCLOCK \419  (SI_LINUX_NOT_ANDROID || SI_SOLARIS)420#define SANITIZER_INTERCEPT_PTHREAD_BARRIERATTR_GETPSHARED \421  (SI_LINUX_NOT_ANDROID && !SI_NETBSD)422#define SANITIZER_INTERCEPT_TRYJOIN SI_GLIBC423#define SANITIZER_INTERCEPT_TIMEDJOIN SI_GLIBC424#define SANITIZER_INTERCEPT_THR_EXIT SI_FREEBSD425#define SANITIZER_INTERCEPT_TMPNAM SI_POSIX426#define SANITIZER_INTERCEPT_TMPNAM_R (SI_GLIBC || SI_SOLARIS)427#define SANITIZER_INTERCEPT_PTSNAME SI_LINUX428#define SANITIZER_INTERCEPT_PTSNAME_R SI_LINUX429#define SANITIZER_INTERCEPT_TTYNAME SI_POSIX430#define SANITIZER_INTERCEPT_TTYNAME_R SI_POSIX431#define SANITIZER_INTERCEPT_TEMPNAM SI_POSIX432#define SANITIZER_INTERCEPT_SINCOS SI_LINUX || SI_SOLARIS433#define SANITIZER_INTERCEPT_REMQUO (SI_POSIX && SI_NOT_AIX)434#define SANITIZER_INTERCEPT_REMQUOL (SI_POSIX && !SI_NETBSD && SI_NOT_AIX)435#define SANITIZER_INTERCEPT_LGAMMA (SI_POSIX && SI_NOT_AIX)436#define SANITIZER_INTERCEPT_LGAMMAL (SI_POSIX && !SI_NETBSD && SI_NOT_AIX)437#define SANITIZER_INTERCEPT_LGAMMA_R (SI_FREEBSD || SI_LINUX || SI_SOLARIS)438#define SANITIZER_INTERCEPT_LGAMMAL_R SI_LINUX_NOT_ANDROID || SI_SOLARIS439#define SANITIZER_INTERCEPT_DRAND48_R SI_GLIBC440#define SANITIZER_INTERCEPT_RAND_R \441  (SI_FREEBSD || SI_NETBSD || SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS)442#define SANITIZER_INTERCEPT_ICONV \443  (SI_FREEBSD || SI_NETBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)444#define SANITIZER_INTERCEPT_TIMES SI_POSIX445 446// FIXME: getline seems to be available on OSX 10.7447#define SANITIZER_INTERCEPT_GETLINE \448  (SI_FREEBSD || SI_NETBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)449 450#define SANITIZER_INTERCEPT__EXIT \451  (SI_LINUX || SI_FREEBSD || SI_NETBSD || SI_MAC || SI_SOLARIS)452 453#define SANITIZER_INTERCEPT___LIBC_MUTEX SI_NETBSD454#define SANITIZER_INTERCEPT_PTHREAD_SETNAME_NP \455  (SI_FREEBSD || SI_NETBSD || SI_GLIBC || SI_SOLARIS)456#define SANITIZER_INTERCEPT_PTHREAD_GETNAME_NP \457  (SI_FREEBSD || SI_NETBSD || SI_GLIBC || SI_SOLARIS)458 459#define SANITIZER_INTERCEPT_TLS_GET_ADDR \460  (SI_FREEBSD || SI_NETBSD || SI_LINUX_NOT_ANDROID)461 462#define SANITIZER_INTERCEPT_LISTXATTR SI_LINUX463#define SANITIZER_INTERCEPT_GETXATTR SI_LINUX464#define SANITIZER_INTERCEPT_GETRESID SI_LINUX465#define SANITIZER_INTERCEPT_GETIFADDRS \466  (SI_FREEBSD || SI_NETBSD || SI_LINUX_NOT_ANDROID || SI_MAC || SI_SOLARIS)467#define SANITIZER_INTERCEPT_IF_INDEXTONAME \468  (SI_FREEBSD || SI_NETBSD || SI_LINUX_NOT_ANDROID || SI_MAC || SI_SOLARIS)469#define SANITIZER_INTERCEPT_CAPGET SI_LINUX_NOT_ANDROID470#if SI_LINUX && defined(__arm__)471#define SANITIZER_INTERCEPT_AEABI_MEM 1472#else473#define SANITIZER_INTERCEPT_AEABI_MEM 0474#endif475#define SANITIZER_INTERCEPT___BZERO SI_MAC || SI_GLIBC476#define SANITIZER_INTERCEPT_BZERO SI_LINUX_NOT_ANDROID477#define SANITIZER_INTERCEPT_FTIME (!SI_FREEBSD && !SI_NETBSD && SI_POSIX)478#define SANITIZER_INTERCEPT_XDR (SI_GLIBC || SI_SOLARIS)479#define SANITIZER_INTERCEPT_XDRREC SI_GLIBC480#define SANITIZER_INTERCEPT_TSEARCH \481  (SI_LINUX_NOT_ANDROID || SI_MAC || SI_NETBSD || SI_SOLARIS)482#define SANITIZER_INTERCEPT_LIBIO_INTERNALS SI_GLIBC483#define SANITIZER_INTERCEPT_FOPEN SI_POSIX484#define SANITIZER_INTERCEPT_FOPEN64 (SI_GLIBC || SI_SOLARIS32)485#define SANITIZER_INTERCEPT_OPEN_MEMSTREAM \486  (SI_LINUX_NOT_ANDROID || SI_NETBSD || SI_SOLARIS)487#define SANITIZER_INTERCEPT_OBSTACK SI_GLIBC488#define SANITIZER_INTERCEPT_FFLUSH SI_POSIX489#define SANITIZER_INTERCEPT_FCLOSE SI_POSIX490 491#ifndef SANITIZER_INTERCEPT_DLOPEN_DLCLOSE492#define SANITIZER_INTERCEPT_DLOPEN_DLCLOSE \493  (SI_FREEBSD || SI_NETBSD || SI_LINUX_NOT_ANDROID || SI_MAC || SI_SOLARIS)494#endif495 496#define SANITIZER_INTERCEPT_GETPASS \497  (SI_LINUX_NOT_ANDROID || SI_MAC || SI_NETBSD)498#define SANITIZER_INTERCEPT_TIMERFD SI_LINUX_NOT_ANDROID499 500#define SANITIZER_INTERCEPT_MLOCKX SI_POSIX501#define SANITIZER_INTERCEPT_FOPENCOOKIE SI_LINUX_NOT_ANDROID502#define SANITIZER_INTERCEPT_SEM \503  (SI_LINUX || SI_FREEBSD || SI_NETBSD || SI_SOLARIS)504#define SANITIZER_INTERCEPT_PTHREAD_SETCANCEL SI_POSIX505#define SANITIZER_INTERCEPT_MINCORE \506  (SI_LINUX || SI_NETBSD || SI_FREEBSD || SI_SOLARIS)507#define SANITIZER_INTERCEPT_PROCESS_VM_READV SI_LINUX508#define SANITIZER_INTERCEPT_CTERMID \509  (SI_LINUX || SI_MAC || SI_FREEBSD || SI_NETBSD || SI_SOLARIS)510#define SANITIZER_INTERCEPT_CTERMID_R (SI_MAC || SI_FREEBSD || SI_SOLARIS)511 512#define SANITIZER_INTERCEPTOR_HOOKS \513  (SI_LINUX || SI_MAC || SI_WINDOWS || SI_FREEBSD || SI_NETBSD || SI_SOLARIS)514#define SANITIZER_INTERCEPT_RECV_RECVFROM SI_POSIX515#define SANITIZER_INTERCEPT_SEND_SENDTO SI_POSIX516#define SANITIZER_INTERCEPT_EVENTFD_READ_WRITE (SI_LINUX || SI_FREEBSD)517 518#define SI_STAT_LINUX (SI_LINUX && __GLIBC_PREREQ(2, 33))519#define SANITIZER_INTERCEPT_STAT                                    \520  (SI_FREEBSD || SI_MAC || SI_ANDROID || SI_NETBSD || SI_SOLARIS || \521   SI_STAT_LINUX || !SI_NOT_AIX)522#define SANITIZER_INTERCEPT_STAT64 \523  ((SI_STAT_LINUX || !SI_NOT_AIX) && SANITIZER_HAS_STAT64)524#define SANITIZER_INTERCEPT_LSTAT \525  (SI_NETBSD || SI_FREEBSD || SI_STAT_LINUX || !SI_NOT_AIX)526#define SANITIZER_INTERCEPT___XSTAT \527  ((!SANITIZER_INTERCEPT_STAT && SI_POSIX) || SI_STAT_LINUX)528#define SANITIZER_INTERCEPT___XSTAT64 SI_GLIBC529#define SANITIZER_INTERCEPT___LXSTAT SANITIZER_INTERCEPT___XSTAT530#define SANITIZER_INTERCEPT___LXSTAT64 SI_GLIBC531 532#define SANITIZER_INTERCEPT_UTMP \533  (SI_POSIX && !SI_MAC && !SI_FREEBSD && !SI_NETBSD)534#define SANITIZER_INTERCEPT_UTMPX \535  (SI_LINUX_NOT_ANDROID || SI_MAC || SI_FREEBSD || SI_NETBSD)536 537#define SANITIZER_INTERCEPT_GETLOADAVG \538  (SI_LINUX_NOT_ANDROID || SI_MAC || SI_FREEBSD || SI_NETBSD)539 540#define SANITIZER_INTERCEPT_MMAP SI_POSIX541#define SANITIZER_INTERCEPT_MMAP64 SI_GLIBC || SI_SOLARIS542#define SANITIZER_INTERCEPT_MALLOPT_AND_MALLINFO \543  (SI_GLIBC || SI_ANDROID || SI_FUCHSIA)544#define SANITIZER_INTERCEPT_MEMALIGN (!SI_FREEBSD && !SI_MAC && !SI_NETBSD)545#define SANITIZER_INTERCEPT___LIBC_MEMALIGN SI_GLIBC546#define SANITIZER_INTERCEPT_PVALLOC (SI_GLIBC || SI_ANDROID)547#define SANITIZER_INTERCEPT_CFREE (SI_GLIBC && !SANITIZER_RISCV64)548#define SANITIZER_INTERCEPT_REALLOCARRAY SI_POSIX549#define SANITIZER_INTERCEPT_ALIGNED_ALLOC \550  (!SI_MAC || SI_MAC_SDK_10_15_AVAILABLE)551#define SANITIZER_INTERCEPT_MALLOC_USABLE_SIZE (!SI_MAC && !SI_NETBSD)552#define SANITIZER_INTERCEPT_MCHECK_MPROBE SI_LINUX_NOT_ANDROID553#define SANITIZER_INTERCEPT_WCSLEN 1554#define SANITIZER_INTERCEPT_WCSNLEN 1555#define SANITIZER_INTERCEPT_WCSCAT (SI_POSIX || SI_WINDOWS)556#define SANITIZER_INTERCEPT_WCSDUP SI_POSIX557#define SANITIZER_INTERCEPT_SIGNAL_AND_SIGACTION (!SI_WINDOWS && SI_NOT_FUCHSIA)558#define SANITIZER_INTERCEPT_BSD_SIGNAL SI_ANDROID559 560#define SANITIZER_INTERCEPT_ACCT (SI_NETBSD || SI_FREEBSD)561#define SANITIZER_INTERCEPT_USER_FROM_UID SI_NETBSD562#define SANITIZER_INTERCEPT_UID_FROM_USER SI_NETBSD563#define SANITIZER_INTERCEPT_GROUP_FROM_GID SI_NETBSD564#define SANITIZER_INTERCEPT_GID_FROM_GROUP SI_NETBSD565#define SANITIZER_INTERCEPT_ACCESS (SI_NETBSD || SI_FREEBSD)566#define SANITIZER_INTERCEPT_FACCESSAT (SI_NETBSD || SI_FREEBSD)567#define SANITIZER_INTERCEPT_GETGROUPLIST \568  (SI_NETBSD || SI_FREEBSD || SI_LINUX)569#define SANITIZER_INTERCEPT_STRLCPY \570  (SI_NETBSD || SI_FREEBSD || SI_MAC || SI_ANDROID)571 572#define SANITIZER_INTERCEPT_NAME_TO_HANDLE_AT SI_LINUX_NOT_ANDROID573#define SANITIZER_INTERCEPT_OPEN_BY_HANDLE_AT SI_LINUX_NOT_ANDROID574 575#define SANITIZER_INTERCEPT_READLINK SI_POSIX576#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && \577    __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101000578#define SI_MAC_DEPLOYMENT_BELOW_10_10 1579#else580#define SI_MAC_DEPLOYMENT_BELOW_10_10 0581#endif582#define SANITIZER_INTERCEPT_READLINKAT \583  (SI_POSIX && !SI_MAC_DEPLOYMENT_BELOW_10_10)584 585#define SANITIZER_INTERCEPT_DEVNAME (SI_NETBSD || SI_FREEBSD)586#define SANITIZER_INTERCEPT_DEVNAME_R (SI_NETBSD || SI_FREEBSD)587#define SANITIZER_INTERCEPT_FGETLN (SI_NETBSD || SI_FREEBSD)588#define SANITIZER_INTERCEPT_STRMODE (SI_NETBSD || SI_FREEBSD)589#define SANITIZER_INTERCEPT_TTYENT (SI_NETBSD || SI_FREEBSD)590#define SANITIZER_INTERCEPT_TTYENTPATH SI_NETBSD591#define SANITIZER_INTERCEPT_PROTOENT (SI_LINUX || SI_NETBSD || SI_FREEBSD)592#define SANITIZER_INTERCEPT_PROTOENT_R SI_GLIBC593#define SANITIZER_INTERCEPT_NETENT (SI_LINUX || SI_NETBSD || SI_FREEBSD)594#define SANITIZER_INTERCEPT_SETVBUF \595  (SI_NETBSD || SI_FREEBSD || SI_LINUX || SI_MAC || !SI_NOT_AIX)596#define SANITIZER_INTERCEPT_GETMNTINFO (SI_NETBSD || SI_FREEBSD || SI_MAC)597#define SANITIZER_INTERCEPT_MI_VECTOR_HASH SI_NETBSD598#define SANITIZER_INTERCEPT_GETVFSSTAT SI_NETBSD599#define SANITIZER_INTERCEPT_REGEX (SI_NETBSD || SI_FREEBSD || SI_LINUX)600#define SANITIZER_INTERCEPT_REGEXSUB SI_NETBSD601#define SANITIZER_INTERCEPT_FTS (SI_NETBSD || SI_FREEBSD)602#define SANITIZER_INTERCEPT_SYSCTL (SI_NETBSD || SI_FREEBSD || SI_MAC)603#define SANITIZER_INTERCEPT_ASYSCTL SI_NETBSD604#define SANITIZER_INTERCEPT_SYSCTLGETMIBINFO SI_NETBSD605#define SANITIZER_INTERCEPT_NL_LANGINFO (SI_NETBSD || SI_FREEBSD || SI_MAC)606#define SANITIZER_INTERCEPT_MODCTL SI_NETBSD607#define SANITIZER_INTERCEPT_CAPSICUM SI_FREEBSD608#define SANITIZER_INTERCEPT_STRTONUM (SI_NETBSD || SI_FREEBSD)609#define SANITIZER_INTERCEPT_FPARSELN (SI_NETBSD || SI_FREEBSD)610#define SANITIZER_INTERCEPT_STATVFS1 SI_NETBSD611#define SANITIZER_INTERCEPT_STRTOI SI_NETBSD612#define SANITIZER_INTERCEPT_CAPSICUM SI_FREEBSD613#define SANITIZER_INTERCEPT_SHA1 SI_NETBSD614#define SANITIZER_INTERCEPT_MD4 SI_NETBSD615#define SANITIZER_INTERCEPT_RMD160 SI_NETBSD616#define SANITIZER_INTERCEPT_FSEEK SI_POSIX617#define SANITIZER_INTERCEPT_MD2 SI_NETBSD618#define SANITIZER_INTERCEPT_CDB SI_NETBSD619#define SANITIZER_INTERCEPT_VIS (SI_NETBSD || SI_FREEBSD)620#define SANITIZER_INTERCEPT_POPEN SI_POSIX621#define SANITIZER_INTERCEPT_POPENVE SI_NETBSD622#define SANITIZER_INTERCEPT_PCLOSE SI_POSIX623#define SANITIZER_INTERCEPT_FUNOPEN (SI_NETBSD || SI_FREEBSD)624#define SANITIZER_INTERCEPT_FUNOPEN2 SI_NETBSD625#define SANITIZER_INTERCEPT_GETFSENT (SI_FREEBSD || SI_NETBSD || SI_MAC)626#define SANITIZER_INTERCEPT_ARC4RANDOM (SI_FREEBSD || SI_NETBSD || SI_MAC)627#define SANITIZER_INTERCEPT_FDEVNAME SI_FREEBSD628#define SANITIZER_INTERCEPT_GETUSERSHELL (SI_POSIX && !SI_ANDROID)629#define SANITIZER_INTERCEPT_SL_INIT (SI_FREEBSD || SI_NETBSD)630 631#define SANITIZER_INTERCEPT_GETRANDOM \632  ((SI_LINUX && __GLIBC_PREREQ(2, 25)) || SI_FREEBSD || SI_SOLARIS)633#define SANITIZER_INTERCEPT___CXA_ATEXIT SI_NETBSD634#define SANITIZER_INTERCEPT_ATEXIT SI_NETBSD635#define SANITIZER_INTERCEPT_PTHREAD_ATFORK SI_NETBSD636#define SANITIZER_INTERCEPT_GETENTROPY \637  ((SI_LINUX && __GLIBC_PREREQ(2, 25)) || SI_FREEBSD || SI_SOLARIS)638#define SANITIZER_INTERCEPT_QSORT \639  (SI_POSIX && !SI_IOSSIM && !SI_WATCHOS && !SI_TVOS && !SI_ANDROID)640#define SANITIZER_INTERCEPT_QSORT_R SI_GLIBC641#define SANITIZER_INTERCEPT_BSEARCH \642  (SI_POSIX && !SI_IOSSIM && !SI_WATCHOS && !SI_TVOS && !SI_ANDROID)643// sigaltstack on i386 macOS cannot be intercepted due to setjmp()644// calling it and assuming that it does not clobber registers.645#define SANITIZER_INTERCEPT_SIGALTSTACK \646  (SI_POSIX && !(SANITIZER_APPLE && SANITIZER_I386))647#define SANITIZER_INTERCEPT_UNAME (SI_POSIX && !SI_FREEBSD)648#define SANITIZER_INTERCEPT___XUNAME SI_FREEBSD649#define SANITIZER_INTERCEPT_FLOPEN SI_FREEBSD650#define SANITIZER_INTERCEPT_PROCCTL SI_FREEBSD651#define SANITIZER_INTERCEPT_ARGP_PARSE SI_GLIBC652#define SANITIZER_INTERCEPT_CPUSET_GETAFFINITY SI_FREEBSD653// FIXME: also available from musl 1.2.5654#define SANITIZER_INTERCEPT_PREADV2 (SI_LINUX && __GLIBC_PREREQ(2, 26))655#define SANITIZER_INTERCEPT_PWRITEV2 (SI_LINUX && __GLIBC_PREREQ(2, 26))656#if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && \657    __MAC_OS_X_VERSION_MIN_REQUIRED >= 130000658#  define SI_MAC_OS_DEPLOYMENT_MIN_13_00 1659#else660#  define SI_MAC_OS_DEPLOYMENT_MIN_13_00 0661#endif662#define SANITIZER_INTERCEPT_FREADLINK (SI_MAC && SI_MAC_OS_DEPLOYMENT_MIN_13_00)663#define SANITIZER_INTERCEPT_GETSERVENT_R SI_GLIBC664#define SANITIZER_INTERCEPT_GETSERVBYNAME_R SI_GLIBC665#define SANITIZER_INTERCEPT_GETSERVBYPORT_R SI_GLIBC666 667// Until free_sized and free_aligned_sized are more generally available,668// we can only unconditionally intercept on ELF-based platforms where it669// is okay to have undefined weak symbols.670#ifdef __ELF__671#  define SANITIZER_INTERCEPT_FREE_SIZED 1672#  define SANITIZER_INTERCEPT_FREE_ALIGNED_SIZED 1673#else674#  define SANITIZER_INTERCEPT_FREE_SIZED 0675#  define SANITIZER_INTERCEPT_FREE_ALIGNED_SIZED 0676#endif677 678// This macro gives a way for downstream users to override the above679// interceptor macros irrespective of the platform they are on. They have680// to do two things:681// 1. Build compiler-rt with -DSANITIZER_OVERRIDE_INTERCEPTORS.682// 2. Provide a header file named sanitizer_intercept_overriders.h in the683//    include path for their compiler-rt build.684// An example of an overrider for strlen interceptor that one can list in685// sanitizer_intercept_overriders.h is as follows:686//687// #ifdef SANITIZER_INTERCEPT_STRLEN688// #undef SANITIZER_INTERCEPT_STRLEN689// #define SANITIZER_INTERCEPT_STRLEN <value of choice>690// #endif691//692// This "feature" is useful for downstream users who do not want some of693// their libc funtions to be intercepted. They can selectively disable694// interception of those functions.695#ifdef SANITIZER_OVERRIDE_INTERCEPTORS696#include <sanitizer_intercept_overriders.h>697#endif698 699#endif  // #ifndef SANITIZER_PLATFORM_INTERCEPTORS_H700