Home | History | Annotate | Line # | Download | only in sanitizer_common
      1 //===-- sanitizer_platform_interceptors.h -----------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file defines macro telling whether sanitizer tools can/should intercept
     11 // given library functions on a given platform.
     12 //
     13 //===----------------------------------------------------------------------===//
     14 #ifndef SANITIZER_PLATFORM_INTERCEPTORS_H
     15 #define SANITIZER_PLATFORM_INTERCEPTORS_H
     16 
     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_FUCHSIA
     94 # define SI_NOT_FUCHSIA 0
     95 #else
     96 # define SI_NOT_FUCHSIA 1
     97 #endif
     98 
     99 #if SANITIZER_RTEMS
    100 # define SI_NOT_RTEMS 0
    101 #else
    102 # define SI_NOT_RTEMS 1
    103 #endif
    104 
    105 #if SANITIZER_SOLARIS
    106 # define SI_SOLARIS 1
    107 #else
    108 # define SI_SOLARIS 0
    109 #endif
    110 
    111 #if SANITIZER_SOLARIS32
    112 # define SI_SOLARIS32 1
    113 #else
    114 # define SI_SOLARIS32 0
    115 #endif
    116 
    117 #if SANITIZER_POSIX && !SANITIZER_MAC
    118 # define SI_POSIX_NOT_MAC 1
    119 #else
    120 # define SI_POSIX_NOT_MAC 0
    121 #endif
    122 
    123 #if SANITIZER_LINUX && !SANITIZER_FREEBSD
    124 # define SI_LINUX_NOT_FREEBSD 1
    125 # else
    126 # define SI_LINUX_NOT_FREEBSD 0
    127 #endif
    128 
    129 #define SANITIZER_INTERCEPT_STRLEN SI_NOT_FUCHSIA
    130 #define SANITIZER_INTERCEPT_STRNLEN (SI_NOT_MAC && SI_NOT_FUCHSIA)
    131 #define SANITIZER_INTERCEPT_STRCMP SI_NOT_FUCHSIA
    132 #define SANITIZER_INTERCEPT_STRSTR SI_NOT_FUCHSIA
    133 #define SANITIZER_INTERCEPT_STRCASESTR SI_POSIX
    134 #define SANITIZER_INTERCEPT_STRTOK SI_NOT_FUCHSIA
    135 #define SANITIZER_INTERCEPT_STRCHR SI_NOT_FUCHSIA
    136 #define SANITIZER_INTERCEPT_STRCHRNUL SI_POSIX_NOT_MAC
    137 #define SANITIZER_INTERCEPT_STRRCHR SI_NOT_FUCHSIA
    138 #define SANITIZER_INTERCEPT_STRSPN SI_NOT_FUCHSIA
    139 #define SANITIZER_INTERCEPT_STRPBRK SI_NOT_FUCHSIA
    140 #define SANITIZER_INTERCEPT_TEXTDOMAIN SI_LINUX_NOT_ANDROID || SI_SOLARIS
    141 #define SANITIZER_INTERCEPT_STRCASECMP SI_POSIX
    142 #define SANITIZER_INTERCEPT_MEMSET 1
    143 #define SANITIZER_INTERCEPT_MEMMOVE 1
    144 #define SANITIZER_INTERCEPT_MEMCPY 1
    145 #define SANITIZER_INTERCEPT_MEMCMP SI_NOT_FUCHSIA
    146 #define SANITIZER_INTERCEPT_STRNDUP SI_POSIX
    147 #define SANITIZER_INTERCEPT___STRNDUP SI_LINUX_NOT_FREEBSD
    148 #if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && \
    149     __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070
    150 # define SI_MAC_DEPLOYMENT_BELOW_10_7 1
    151 #else
    152 # define SI_MAC_DEPLOYMENT_BELOW_10_7 0
    153 #endif
    154 // memmem on Darwin doesn't exist on 10.6
    155 // FIXME: enable memmem on Windows.
    156 #define SANITIZER_INTERCEPT_MEMMEM (SI_POSIX && !SI_MAC_DEPLOYMENT_BELOW_10_7)
    157 #define SANITIZER_INTERCEPT_MEMCHR SI_NOT_FUCHSIA
    158 #define SANITIZER_INTERCEPT_MEMRCHR \
    159   (SI_FREEBSD || SI_LINUX || SI_NETBSD || SI_OPENBSD)
    160 
    161 #define SANITIZER_INTERCEPT_READ SI_POSIX
    162 #define SANITIZER_INTERCEPT_PREAD SI_POSIX
    163 #define SANITIZER_INTERCEPT_WRITE SI_POSIX
    164 #define SANITIZER_INTERCEPT_PWRITE SI_POSIX
    165 
    166 #define SANITIZER_INTERCEPT_FREAD SI_POSIX
    167 #define SANITIZER_INTERCEPT_FWRITE SI_POSIX
    168 #define SANITIZER_INTERCEPT_FGETS SI_POSIX
    169 #define SANITIZER_INTERCEPT_FPUTS SI_POSIX
    170 #define SANITIZER_INTERCEPT_PUTS SI_POSIX
    171 
    172 #define SANITIZER_INTERCEPT_PREAD64 SI_LINUX_NOT_ANDROID || SI_SOLARIS32
    173 #define SANITIZER_INTERCEPT_PWRITE64 SI_LINUX_NOT_ANDROID || SI_SOLARIS32
    174 
    175 #define SANITIZER_INTERCEPT_READV SI_POSIX
    176 #define SANITIZER_INTERCEPT_WRITEV SI_POSIX
    177 
    178 #define SANITIZER_INTERCEPT_PREADV \
    179   (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_LINUX_NOT_ANDROID)
    180 #define SANITIZER_INTERCEPT_PWRITEV SI_LINUX_NOT_ANDROID
    181 #define SANITIZER_INTERCEPT_PREADV64 SI_LINUX_NOT_ANDROID
    182 #define SANITIZER_INTERCEPT_PWRITEV64 SI_LINUX_NOT_ANDROID
    183 
    184 #define SANITIZER_INTERCEPT_PRCTL   SI_LINUX
    185 
    186 #define SANITIZER_INTERCEPT_LOCALTIME_AND_FRIENDS SI_POSIX
    187 #define SANITIZER_INTERCEPT_STRPTIME SI_POSIX
    188 
    189 #define SANITIZER_INTERCEPT_SCANF SI_POSIX
    190 #define SANITIZER_INTERCEPT_ISOC99_SCANF SI_LINUX_NOT_ANDROID
    191 
    192 #ifndef SANITIZER_INTERCEPT_PRINTF
    193 # define SANITIZER_INTERCEPT_PRINTF SI_POSIX
    194 # define SANITIZER_INTERCEPT_PRINTF_L (SI_FREEBSD || SI_NETBSD)
    195 # define SANITIZER_INTERCEPT_ISOC99_PRINTF SI_LINUX_NOT_ANDROID
    196 #endif
    197 
    198 #define SANITIZER_INTERCEPT___PRINTF_CHK \
    199   (SANITIZER_INTERCEPT_PRINTF && SI_LINUX_NOT_ANDROID)
    200 
    201 #define SANITIZER_INTERCEPT_FREXP SI_NOT_FUCHSIA
    202 #define SANITIZER_INTERCEPT_FREXPF_FREXPL SI_POSIX
    203 
    204 #define SANITIZER_INTERCEPT_GETPWNAM_AND_FRIENDS SI_POSIX
    205 #define SANITIZER_INTERCEPT_GETPWNAM_R_AND_FRIENDS                            \
    206   (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_MAC || SI_LINUX_NOT_ANDROID || \
    207   SI_SOLARIS)
    208 #define SANITIZER_INTERCEPT_GETPWENT                                          \
    209   (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_MAC || SI_LINUX_NOT_ANDROID || \
    210   SI_SOLARIS)
    211 #define SANITIZER_INTERCEPT_FGETGRENT_R                                       \
    212   (SI_FREEBSD || SI_OPENBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
    213 #define SANITIZER_INTERCEPT_FGETPWENT SI_LINUX_NOT_ANDROID || SI_SOLARIS
    214 #define SANITIZER_INTERCEPT_GETPWENT_R \
    215   (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
    216 #define SANITIZER_INTERCEPT_FGETPWENT_R \
    217   (SI_FREEBSD || SI_OPENBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
    218 #define SANITIZER_INTERCEPT_SETPWENT \
    219   (SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
    220 #define SANITIZER_INTERCEPT_CLOCK_GETTIME \
    221   (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_LINUX || SI_SOLARIS)
    222 #define SANITIZER_INTERCEPT_GETITIMER SI_POSIX
    223 #define SANITIZER_INTERCEPT_TIME SI_POSIX
    224 #define SANITIZER_INTERCEPT_GLOB SI_LINUX_NOT_ANDROID || SI_SOLARIS
    225 #define SANITIZER_INTERCEPT_GLOB64 SI_LINUX_NOT_ANDROID
    226 #define SANITIZER_INTERCEPT_WAIT SI_POSIX
    227 #define SANITIZER_INTERCEPT_INET SI_POSIX
    228 #define SANITIZER_INTERCEPT_PTHREAD_GETSCHEDPARAM (SI_POSIX && !SI_OPENBSD)
    229 #define SANITIZER_INTERCEPT_GETADDRINFO SI_POSIX
    230 #define SANITIZER_INTERCEPT_GETNAMEINFO SI_POSIX
    231 #define SANITIZER_INTERCEPT_GETSOCKNAME SI_POSIX
    232 #define SANITIZER_INTERCEPT_GETHOSTBYNAME SI_POSIX
    233 #define SANITIZER_INTERCEPT_GETHOSTBYNAME2 SI_POSIX && !SI_SOLARIS
    234 #define SANITIZER_INTERCEPT_GETHOSTBYNAME_R \
    235   (SI_FREEBSD || SI_LINUX || SI_SOLARIS)
    236 #define SANITIZER_INTERCEPT_GETHOSTBYNAME2_R \
    237   (SI_FREEBSD || SI_LINUX_NOT_ANDROID)
    238 #define SANITIZER_INTERCEPT_GETHOSTBYADDR_R \
    239   (SI_FREEBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
    240 #define SANITIZER_INTERCEPT_GETHOSTENT_R \
    241   (SI_FREEBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
    242 #define SANITIZER_INTERCEPT_GETSOCKOPT SI_POSIX
    243 #define SANITIZER_INTERCEPT_ACCEPT SI_POSIX
    244 #define SANITIZER_INTERCEPT_ACCEPT4 \
    245   (SI_LINUX_NOT_ANDROID || SI_NETBSD || SI_OPENBSD)
    246 #define SANITIZER_INTERCEPT_PACCEPT SI_NETBSD
    247 #define SANITIZER_INTERCEPT_MODF SI_POSIX
    248 #define SANITIZER_INTERCEPT_RECVMSG SI_POSIX
    249 #define SANITIZER_INTERCEPT_SENDMSG SI_POSIX
    250 #define SANITIZER_INTERCEPT_RECVMMSG SI_LINUX
    251 #define SANITIZER_INTERCEPT_SENDMMSG SI_LINUX
    252 #define SANITIZER_INTERCEPT_GETPEERNAME SI_POSIX
    253 #define SANITIZER_INTERCEPT_IOCTL SI_POSIX
    254 #define SANITIZER_INTERCEPT_INET_ATON SI_POSIX
    255 #define SANITIZER_INTERCEPT_SYSINFO SI_LINUX
    256 #define SANITIZER_INTERCEPT_READDIR SI_POSIX
    257 #define SANITIZER_INTERCEPT_READDIR64 SI_LINUX_NOT_ANDROID || SI_SOLARIS32
    258 #if SI_LINUX_NOT_ANDROID && \
    259   (defined(__i386) || defined(__x86_64) || defined(__mips64) || \
    260     defined(__powerpc64__) || defined(__aarch64__) || defined(__arm__) || \
    261     defined(__s390__))
    262 #define SANITIZER_INTERCEPT_PTRACE 1
    263 #else
    264 #define SANITIZER_INTERCEPT_PTRACE 0
    265 #endif
    266 #define SANITIZER_INTERCEPT_SETLOCALE SI_POSIX
    267 #define SANITIZER_INTERCEPT_GETCWD SI_POSIX
    268 #define SANITIZER_INTERCEPT_GET_CURRENT_DIR_NAME SI_LINUX_NOT_ANDROID
    269 #define SANITIZER_INTERCEPT_STRTOIMAX SI_POSIX
    270 #define SANITIZER_INTERCEPT_MBSTOWCS SI_POSIX
    271 #define SANITIZER_INTERCEPT_MBSNRTOWCS \
    272   (SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
    273 #define SANITIZER_INTERCEPT_WCSTOMBS SI_POSIX
    274 #define SANITIZER_INTERCEPT_STRXFRM SI_POSIX
    275 #define SANITIZER_INTERCEPT___STRXFRM_L SI_LINUX
    276 #define SANITIZER_INTERCEPT_WCSXFRM SI_POSIX
    277 #define SANITIZER_INTERCEPT___WCSXFRM_L SI_LINUX
    278 #define SANITIZER_INTERCEPT_WCSNRTOMBS                                        \
    279   (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_MAC || SI_LINUX_NOT_ANDROID || \
    280   SI_SOLARIS)
    281 #define SANITIZER_INTERCEPT_WCRTOMB                                           \
    282   (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_MAC || SI_LINUX_NOT_ANDROID || \
    283   SI_SOLARIS)
    284 #define SANITIZER_INTERCEPT_TCGETATTR SI_LINUX_NOT_ANDROID || SI_SOLARIS
    285 #define SANITIZER_INTERCEPT_REALPATH SI_POSIX
    286 #define SANITIZER_INTERCEPT_CANONICALIZE_FILE_NAME \
    287   (SI_LINUX_NOT_ANDROID || SI_SOLARIS)
    288 #define SANITIZER_INTERCEPT_CONFSTR                                           \
    289   (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_MAC || SI_LINUX_NOT_ANDROID || \
    290   SI_SOLARIS)
    291 #define SANITIZER_INTERCEPT_SCHED_GETAFFINITY SI_LINUX_NOT_ANDROID
    292 #define SANITIZER_INTERCEPT_SCHED_GETPARAM SI_LINUX_NOT_ANDROID || SI_SOLARIS
    293 #define SANITIZER_INTERCEPT_STRERROR SI_POSIX
    294 #define SANITIZER_INTERCEPT_STRERROR_R SI_POSIX
    295 #define SANITIZER_INTERCEPT_XPG_STRERROR_R SI_LINUX_NOT_ANDROID
    296 #define SANITIZER_INTERCEPT_SCANDIR \
    297   (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
    298 #define SANITIZER_INTERCEPT_SCANDIR64 SI_LINUX_NOT_ANDROID || SI_SOLARIS32
    299 #define SANITIZER_INTERCEPT_GETGROUPS SI_POSIX
    300 #define SANITIZER_INTERCEPT_POLL SI_POSIX
    301 #define SANITIZER_INTERCEPT_PPOLL SI_LINUX_NOT_ANDROID || SI_SOLARIS
    302 #define SANITIZER_INTERCEPT_WORDEXP \
    303   (SI_FREEBSD || SI_NETBSD || (SI_MAC && !SI_IOS) || SI_LINUX_NOT_ANDROID || \
    304     SI_SOLARIS)
    305 #define SANITIZER_INTERCEPT_SIGWAIT SI_POSIX
    306 #define SANITIZER_INTERCEPT_SIGWAITINFO SI_LINUX_NOT_ANDROID || SI_SOLARIS
    307 #define SANITIZER_INTERCEPT_SIGTIMEDWAIT SI_LINUX_NOT_ANDROID || SI_SOLARIS
    308 #define SANITIZER_INTERCEPT_SIGSETOPS \
    309   (SI_FREEBSD || SI_NETBSD || SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
    310 #define SANITIZER_INTERCEPT_SIGPENDING SI_POSIX
    311 #define SANITIZER_INTERCEPT_SIGPROCMASK SI_POSIX
    312 #define SANITIZER_INTERCEPT_BACKTRACE \
    313   (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
    314 #define SANITIZER_INTERCEPT_GETMNTENT SI_LINUX
    315 #define SANITIZER_INTERCEPT_GETMNTENT_R SI_LINUX_NOT_ANDROID
    316 #define SANITIZER_INTERCEPT_STATFS \
    317   (SI_FREEBSD || SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
    318 #define SANITIZER_INTERCEPT_STATFS64 \
    319   ((SI_MAC && !SI_IOS) || SI_LINUX_NOT_ANDROID)
    320 #define SANITIZER_INTERCEPT_STATVFS \
    321   (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_LINUX_NOT_ANDROID)
    322 #define SANITIZER_INTERCEPT_STATVFS64 SI_LINUX_NOT_ANDROID
    323 #define SANITIZER_INTERCEPT_INITGROUPS SI_POSIX
    324 #define SANITIZER_INTERCEPT_ETHER_NTOA_ATON (SI_POSIX && !SI_OPENBSD)
    325 #define SANITIZER_INTERCEPT_ETHER_HOST \
    326   (SI_FREEBSD || SI_MAC || SI_LINUX_NOT_ANDROID)
    327 #define SANITIZER_INTERCEPT_ETHER_R (SI_FREEBSD || SI_LINUX_NOT_ANDROID)
    328 #define SANITIZER_INTERCEPT_SHMCTL          \
    329   (SI_NETBSD || SI_OPENBSD || SI_SOLARIS || \
    330   ((SI_FREEBSD || SI_LINUX_NOT_ANDROID) && \
    331     SANITIZER_WORDSIZE == 64))  // NOLINT
    332 #define SANITIZER_INTERCEPT_RANDOM_R SI_LINUX_NOT_ANDROID
    333 #define SANITIZER_INTERCEPT_PTHREAD_ATTR_GET SI_POSIX
    334 #define SANITIZER_INTERCEPT_PTHREAD_ATTR_GETINHERITSCHED \
    335   (SI_FREEBSD || SI_NETBSD || SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
    336 #define SANITIZER_INTERCEPT_PTHREAD_ATTR_GETAFFINITY_NP SI_LINUX_NOT_ANDROID
    337 #define SANITIZER_INTERCEPT_PTHREAD_ATTR_GET_SCHED (SI_POSIX && !SI_OPENBSD)
    338 #define SANITIZER_INTERCEPT_PTHREAD_MUTEXATTR_GETPSHARED \
    339   (SI_POSIX && !SI_NETBSD && !SI_OPENBSD)
    340 #define SANITIZER_INTERCEPT_PTHREAD_MUTEXATTR_GETTYPE (SI_POSIX && !SI_OPENBSD)
    341 #define SANITIZER_INTERCEPT_PTHREAD_MUTEXATTR_GETPROTOCOL \
    342   (SI_MAC || SI_NETBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
    343 #define SANITIZER_INTERCEPT_PTHREAD_MUTEXATTR_GETPRIOCEILING \
    344   (SI_MAC || SI_NETBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
    345 #define SANITIZER_INTERCEPT_PTHREAD_MUTEXATTR_GETROBUST \
    346   (SI_LINUX_NOT_ANDROID || SI_SOLARIS)
    347 #define SANITIZER_INTERCEPT_PTHREAD_MUTEXATTR_GETROBUST_NP SI_LINUX_NOT_ANDROID
    348 #define SANITIZER_INTERCEPT_PTHREAD_RWLOCKATTR_GETPSHARED \
    349   (SI_POSIX && !SI_NETBSD && !SI_OPENBSD)
    350 #define SANITIZER_INTERCEPT_PTHREAD_RWLOCKATTR_GETKIND_NP SI_LINUX_NOT_ANDROID
    351 #define SANITIZER_INTERCEPT_PTHREAD_CONDATTR_GETPSHARED \
    352   (SI_POSIX && !SI_NETBSD && !SI_OPENBSD)
    353 #define SANITIZER_INTERCEPT_PTHREAD_CONDATTR_GETCLOCK \
    354   (SI_LINUX_NOT_ANDROID || SI_SOLARIS)
    355 #define SANITIZER_INTERCEPT_PTHREAD_BARRIERATTR_GETPSHARED \
    356   (SI_LINUX_NOT_ANDROID && !SI_NETBSD && !SI_OPENBSD)
    357 #define SANITIZER_INTERCEPT_THR_EXIT SI_FREEBSD
    358 #define SANITIZER_INTERCEPT_TMPNAM SI_POSIX
    359 #define SANITIZER_INTERCEPT_TMPNAM_R SI_LINUX_NOT_ANDROID || SI_SOLARIS
    360 #define SANITIZER_INTERCEPT_TTYNAME_R SI_POSIX
    361 #define SANITIZER_INTERCEPT_TEMPNAM SI_POSIX
    362 #define SANITIZER_INTERCEPT_SINCOS SI_LINUX || SI_SOLARIS
    363 #define SANITIZER_INTERCEPT_REMQUO SI_POSIX
    364 #define SANITIZER_INTERCEPT_REMQUOL (SI_POSIX && !SI_NETBSD)
    365 #define SANITIZER_INTERCEPT_LGAMMA SI_POSIX
    366 #define SANITIZER_INTERCEPT_LGAMMAL (SI_POSIX && !SI_NETBSD)
    367 #define SANITIZER_INTERCEPT_LGAMMA_R (SI_FREEBSD || SI_LINUX || SI_SOLARIS)
    368 #define SANITIZER_INTERCEPT_LGAMMAL_R SI_LINUX_NOT_ANDROID || SI_SOLARIS
    369 #define SANITIZER_INTERCEPT_DRAND48_R SI_LINUX_NOT_ANDROID
    370 #define SANITIZER_INTERCEPT_RAND_R                                            \
    371   (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_MAC || SI_LINUX_NOT_ANDROID || \
    372   SI_SOLARIS)
    373 #define SANITIZER_INTERCEPT_ICONV \
    374   (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
    375 #define SANITIZER_INTERCEPT_TIMES SI_POSIX
    376 
    377 // FIXME: getline seems to be available on OSX 10.7
    378 #define SANITIZER_INTERCEPT_GETLINE \
    379   (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
    380 
    381 #define SANITIZER_INTERCEPT__EXIT \
    382   (SI_LINUX || SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_MAC || SI_SOLARIS)
    383 
    384 #define SANITIZER_INTERCEPT_PTHREAD_MUTEX SI_POSIX
    385 #define SANITIZER_INTERCEPT___PTHREAD_MUTEX SI_LINUX_NOT_ANDROID
    386 #define SANITIZER_INTERCEPT___LIBC_MUTEX SI_NETBSD
    387 #define SANITIZER_INTERCEPT_PTHREAD_SETNAME_NP \
    388   (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
    389 #define SANITIZER_INTERCEPT_PTHREAD_GETNAME_NP \
    390   (SI_FREEBSD || SI_NETBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
    391 
    392 #define SANITIZER_INTERCEPT_TLS_GET_ADDR \
    393   (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
    394 
    395 #define SANITIZER_INTERCEPT_LISTXATTR SI_LINUX
    396 #define SANITIZER_INTERCEPT_GETXATTR SI_LINUX
    397 #define SANITIZER_INTERCEPT_GETRESID SI_LINUX
    398 #define SANITIZER_INTERCEPT_GETIFADDRS                                        \
    399   (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_LINUX_NOT_ANDROID || SI_MAC || \
    400   SI_SOLARIS)
    401 #define SANITIZER_INTERCEPT_IF_INDEXTONAME                                    \
    402   (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_LINUX_NOT_ANDROID || SI_MAC || \
    403   SI_SOLARIS)
    404 #define SANITIZER_INTERCEPT_CAPGET SI_LINUX_NOT_ANDROID
    405 #if SI_LINUX && defined(__arm__)
    406 #define SANITIZER_INTERCEPT_AEABI_MEM 1
    407 #else
    408 #define SANITIZER_INTERCEPT_AEABI_MEM 0
    409 #endif
    410 #define SANITIZER_INTERCEPT___BZERO SI_MAC
    411 #define SANITIZER_INTERCEPT_FTIME \
    412   (!SI_FREEBSD && !SI_NETBSD && !SI_OPENBSD && SI_POSIX)
    413 #define SANITIZER_INTERCEPT_XDR SI_LINUX_NOT_ANDROID || SI_SOLARIS
    414 #define SANITIZER_INTERCEPT_TSEARCH \
    415   (SI_LINUX_NOT_ANDROID || SI_MAC || SI_NETBSD || SI_OPENBSD || SI_SOLARIS)
    416 #define SANITIZER_INTERCEPT_LIBIO_INTERNALS SI_LINUX_NOT_ANDROID
    417 #define SANITIZER_INTERCEPT_FOPEN SI_POSIX
    418 #define SANITIZER_INTERCEPT_FOPEN64 SI_LINUX_NOT_ANDROID || SI_SOLARIS32
    419 #define SANITIZER_INTERCEPT_OPEN_MEMSTREAM \
    420   (SI_LINUX_NOT_ANDROID || SI_NETBSD || SI_OPENBSD || SI_SOLARIS)
    421 #define SANITIZER_INTERCEPT_OBSTACK SI_LINUX_NOT_ANDROID
    422 #define SANITIZER_INTERCEPT_FFLUSH SI_POSIX
    423 #define SANITIZER_INTERCEPT_FCLOSE SI_POSIX
    424 
    425 #ifndef SANITIZER_INTERCEPT_DLOPEN_DLCLOSE
    426 #define SANITIZER_INTERCEPT_DLOPEN_DLCLOSE                                    \
    427   (SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_LINUX_NOT_ANDROID || SI_MAC || \
    428   SI_SOLARIS)
    429 #endif
    430 
    431 #define SANITIZER_INTERCEPT_GETPASS \
    432   (SI_LINUX_NOT_ANDROID || SI_MAC || SI_NETBSD || SI_OPENBSD)
    433 #define SANITIZER_INTERCEPT_TIMERFD SI_LINUX_NOT_ANDROID
    434 
    435 #define SANITIZER_INTERCEPT_MLOCKX SI_POSIX
    436 #define SANITIZER_INTERCEPT_FOPENCOOKIE SI_LINUX_NOT_ANDROID
    437 #define SANITIZER_INTERCEPT_SEM \
    438   (SI_LINUX || SI_FREEBSD || SI_NETBSD || SI_SOLARIS)
    439 #define SANITIZER_INTERCEPT_PTHREAD_SETCANCEL SI_POSIX
    440 #define SANITIZER_INTERCEPT_MINCORE \
    441   (SI_LINUX || SI_NETBSD || SI_OPENBSD || SI_SOLARIS)
    442 #define SANITIZER_INTERCEPT_PROCESS_VM_READV SI_LINUX
    443 #define SANITIZER_INTERCEPT_CTERMID \
    444   (SI_LINUX || SI_MAC || SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_SOLARIS)
    445 #define SANITIZER_INTERCEPT_CTERMID_R (SI_MAC || SI_FREEBSD || SI_SOLARIS)
    446 
    447 #define SANITIZER_INTERCEPTOR_HOOKS \
    448   (SI_LINUX || SI_MAC || SI_WINDOWS || SI_NETBSD)
    449 #define SANITIZER_INTERCEPT_RECV_RECVFROM SI_POSIX
    450 #define SANITIZER_INTERCEPT_SEND_SENDTO SI_POSIX
    451 #define SANITIZER_INTERCEPT_EVENTFD_READ_WRITE SI_LINUX
    452 
    453 #define SANITIZER_INTERCEPT_STAT \
    454   (SI_FREEBSD || SI_MAC || SI_ANDROID || SI_NETBSD || SI_OPENBSD || SI_SOLARIS)
    455 #define SANITIZER_INTERCEPT_LSTAT (SI_NETBSD || SI_FREEBSD)
    456 #define SANITIZER_INTERCEPT___XSTAT (!SANITIZER_INTERCEPT_STAT && SI_POSIX)
    457 #define SANITIZER_INTERCEPT___XSTAT64 SI_LINUX_NOT_ANDROID
    458 #define SANITIZER_INTERCEPT___LXSTAT SANITIZER_INTERCEPT___XSTAT
    459 #define SANITIZER_INTERCEPT___LXSTAT64 SI_LINUX_NOT_ANDROID
    460 
    461 #define SANITIZER_INTERCEPT_UTMP \
    462   (SI_POSIX && !SI_MAC && !SI_FREEBSD && !SI_NETBSD)
    463 #define SANITIZER_INTERCEPT_UTMPX \
    464   (SI_LINUX_NOT_ANDROID || SI_MAC || SI_FREEBSD || SI_NETBSD)
    465 
    466 #define SANITIZER_INTERCEPT_GETLOADAVG \
    467   (SI_LINUX_NOT_ANDROID || SI_MAC || SI_FREEBSD || SI_NETBSD || SI_OPENBSD)
    468 
    469 #define SANITIZER_INTERCEPT_MMAP SI_POSIX
    470 #define SANITIZER_INTERCEPT_MMAP64 SI_LINUX_NOT_ANDROID
    471 #define SANITIZER_INTERCEPT_MALLOPT_AND_MALLINFO \
    472   (!SI_FREEBSD && !SI_MAC && !SI_NETBSD && !SI_OPENBSD && SI_NOT_FUCHSIA && \
    473   SI_NOT_RTEMS)
    474 #define SANITIZER_INTERCEPT_MEMALIGN \
    475   (!SI_FREEBSD && !SI_MAC && !SI_NETBSD && !SI_OPENBSD && SI_NOT_RTEMS)
    476 #define SANITIZER_INTERCEPT_PVALLOC \
    477   (!SI_FREEBSD && !SI_MAC && !SI_NETBSD && !SI_OPENBSD && SI_NOT_FUCHSIA && \
    478   SI_NOT_RTEMS)
    479 #define SANITIZER_INTERCEPT_CFREE \
    480   (!SI_FREEBSD && !SI_MAC && !SI_NETBSD && !SI_OPENBSD && SI_NOT_FUCHSIA && \
    481   SI_NOT_RTEMS)
    482 #define SANITIZER_INTERCEPT_ALIGNED_ALLOC (!SI_MAC && SI_NOT_RTEMS)
    483 #define SANITIZER_INTERCEPT_MALLOC_USABLE_SIZE (!SI_MAC && !SI_OPENBSD)
    484 #define SANITIZER_INTERCEPT_MCHECK_MPROBE SI_LINUX_NOT_ANDROID
    485 #define SANITIZER_INTERCEPT_WCSCAT SI_POSIX
    486 #define SANITIZER_INTERCEPT_SIGNAL_AND_SIGACTION (!SI_WINDOWS && SI_NOT_FUCHSIA)
    487 #define SANITIZER_INTERCEPT_BSD_SIGNAL SI_ANDROID
    488 
    489 #define SANITIZER_INTERCEPT_ACCT (SI_NETBSD || SI_OPENBSD || SI_FREEBSD)
    490 #define SANITIZER_INTERCEPT_USER_FROM_UID SI_NETBSD
    491 #define SANITIZER_INTERCEPT_UID_FROM_USER SI_NETBSD
    492 #define SANITIZER_INTERCEPT_GROUP_FROM_GID SI_NETBSD
    493 #define SANITIZER_INTERCEPT_GID_FROM_GROUP SI_NETBSD
    494 #define SANITIZER_INTERCEPT_ACCESS (SI_NETBSD || SI_OPENBSD || SI_FREEBSD)
    495 #define SANITIZER_INTERCEPT_FACCESSAT (SI_NETBSD || SI_OPENBSD || SI_FREEBSD)
    496 #define SANITIZER_INTERCEPT_GETGROUPLIST (SI_NETBSD || SI_OPENBSD)
    497 #define SANITIZER_INTERCEPT_STRLCPY                                            \
    498   (SI_NETBSD || SI_FREEBSD || SI_OPENBSD || SI_MAC || SI_ANDROID)
    499 
    500 #define SANITIZER_INTERCEPT_NAME_TO_HANDLE_AT SI_LINUX_NOT_ANDROID
    501 #define SANITIZER_INTERCEPT_OPEN_BY_HANDLE_AT SI_LINUX_NOT_ANDROID
    502 
    503 #define SANITIZER_INTERCEPT_READLINK SI_POSIX
    504 #if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && \
    505     __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101000
    506 # define SI_MAC_DEPLOYMENT_BELOW_10_10 1
    507 #else
    508 # define SI_MAC_DEPLOYMENT_BELOW_10_10 0
    509 #endif
    510 #define SANITIZER_INTERCEPT_READLINKAT \
    511   (SI_POSIX && !SI_MAC_DEPLOYMENT_BELOW_10_10)
    512 
    513 #define SANITIZER_INTERCEPT_DEVNAME (SI_NETBSD || SI_OPENBSD || SI_FREEBSD)
    514 #define SANITIZER_INTERCEPT_DEVNAME_R (SI_NETBSD || SI_FREEBSD)
    515 #define SANITIZER_INTERCEPT_FGETLN (SI_NETBSD || SI_FREEBSD)
    516 #define SANITIZER_INTERCEPT_STRMODE (SI_NETBSD || SI_FREEBSD)
    517 #define SANITIZER_INTERCEPT_TTYENT SI_NETBSD
    518 #define SANITIZER_INTERCEPT_PROTOENT SI_NETBSD
    519 #define SANITIZER_INTERCEPT_NETENT SI_NETBSD
    520 #define SANITIZER_INTERCEPT_SETVBUF (SI_NETBSD || SI_FREEBSD || \
    521   SI_LINUX || SI_MAC)
    522 #define SANITIZER_INTERCEPT_GETMNTINFO (SI_NETBSD || SI_FREEBSD || SI_MAC)
    523 #define SANITIZER_INTERCEPT_MI_VECTOR_HASH SI_NETBSD
    524 #define SANITIZER_INTERCEPT_GETVFSSTAT SI_NETBSD
    525 #define SANITIZER_INTERCEPT_REGEX (SI_NETBSD || SI_FREEBSD || SI_LINUX)
    526 #define SANITIZER_INTERCEPT_REGEXSUB SI_NETBSD
    527 #define SANITIZER_INTERCEPT_FTS (SI_NETBSD || SI_FREEBSD)
    528 #define SANITIZER_INTERCEPT_SYSCTL (SI_NETBSD || SI_FREEBSD || SI_MAC)
    529 #define SANITIZER_INTERCEPT_ASYSCTL SI_NETBSD
    530 #define SANITIZER_INTERCEPT_SYSCTLGETMIBINFO SI_NETBSD
    531 #define SANITIZER_INTERCEPT_NL_LANGINFO (SI_NETBSD || SI_FREEBSD || SI_MAC)
    532 #define SANITIZER_INTERCEPT_MODCTL SI_NETBSD
    533 #define SANITIZER_INTERCEPT_CAPSICUM SI_FREEBSD
    534 #define SANITIZER_INTERCEPT_STRTONUM (SI_NETBSD || SI_FREEBSD)
    535 #define SANITIZER_INTERCEPT_FPARSELN SI_NETBSD
    536 #define SANITIZER_INTERCEPT_STATVFS1 SI_NETBSD
    537 #define SANITIZER_INTERCEPT_STRTOI SI_NETBSD
    538 #define SANITIZER_INTERCEPT_CAPSICUM SI_FREEBSD
    539 #define SANITIZER_INTERCEPT_SHA1 SI_NETBSD
    540 #define SANITIZER_INTERCEPT_MD4 SI_NETBSD
    541 #define SANITIZER_INTERCEPT_RMD160 SI_NETBSD
    542 #define SANITIZER_INTERCEPT_MD5 SI_NETBSD
    543 #define SANITIZER_INTERCEPT_FSEEK (SI_NETBSD || SI_FREEBSD)
    544 #define SANITIZER_INTERCEPT_MD2 SI_NETBSD
    545 #define SANITIZER_INTERCEPT_SHA2 SI_NETBSD
    546 #define SANITIZER_INTERCEPT_CDB SI_NETBSD
    547 #define SANITIZER_INTERCEPT_VIS (SI_NETBSD || SI_FREEBSD)
    548 #define SANITIZER_INTERCEPT_GETFSENT (SI_FREEBSD || SI_NETBSD || SI_MAC)
    549 #define SANITIZER_INTERCEPT_ARC4RANDOM (SI_FREEBSD || SI_NETBSD)
    550 
    551 #define SANITIZER_INTERCEPT_POPEN SI_POSIX
    552 #define SANITIZER_INTERCEPT_POPENVE SI_NETBSD
    553 #define SANITIZER_INTERCEPT_PCLOSE SI_POSIX
    554 #define SANITIZER_INTERCEPT_FUNOPEN (SI_NETBSD || SI_FREEBSD)
    555 #define SANITIZER_INTERCEPT_FUNOPEN2 SI_NETBSD
    556 
    557 #endif  // #ifndef SANITIZER_PLATFORM_INTERCEPTORS_H
    558