1//===-- asan_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 is a part of AddressSanitizer, an address sanity checker. 10// 11// ASan-private header for asan_interceptors.cpp 12//===----------------------------------------------------------------------===// 13#ifndef ASAN_INTERCEPTORS_H 14#define ASAN_INTERCEPTORS_H 15 16#include "asan_internal.h" 17#include "asan_interceptors_memintrinsics.h" 18#include "interception/interception.h" 19#include "sanitizer_common/sanitizer_platform_interceptors.h" 20 21namespace __asan { 22 23void InitializeAsanInterceptors(); 24void InitializePlatformInterceptors(); 25 26#define ENSURE_ASAN_INITED() \ 27 do { \ 28 CHECK(!asan_init_is_running); \ 29 if (UNLIKELY(!asan_inited)) { \ 30 AsanInitFromRtl(); \ 31 } \ 32 } while (0) 33 34} // namespace __asan 35 36// There is no general interception at all on Fuchsia and RTEMS. 37// Only the functions in asan_interceptors_memintrinsics.h are 38// really defined to replace libc functions. 39#if !SANITIZER_FUCHSIA && !SANITIZER_RTEMS 40 41// Use macro to describe if specific function should be 42// intercepted on a given platform. 43#if !SANITIZER_WINDOWS 44# define ASAN_INTERCEPT_ATOLL_AND_STRTOLL 1 45# define ASAN_INTERCEPT__LONGJMP 1 46# define ASAN_INTERCEPT_INDEX 1 47# define ASAN_INTERCEPT_PTHREAD_CREATE 1 48#else 49# define ASAN_INTERCEPT_ATOLL_AND_STRTOLL 0 50# define ASAN_INTERCEPT__LONGJMP 0 51# define ASAN_INTERCEPT_INDEX 0 52# define ASAN_INTERCEPT_PTHREAD_CREATE 0 53#endif 54 55#if SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_NETBSD || \ 56 SANITIZER_SOLARIS 57# define ASAN_USE_ALIAS_ATTRIBUTE_FOR_INDEX 1 58#else 59# define ASAN_USE_ALIAS_ATTRIBUTE_FOR_INDEX 0 60#endif 61 62#if (SANITIZER_LINUX && !SANITIZER_ANDROID) || SANITIZER_SOLARIS 63# define ASAN_INTERCEPT_SWAPCONTEXT 1 64#else 65# define ASAN_INTERCEPT_SWAPCONTEXT 0 66#endif 67 68#if !SANITIZER_WINDOWS 69# define ASAN_INTERCEPT_SIGLONGJMP 1 70#else 71# define ASAN_INTERCEPT_SIGLONGJMP 0 72#endif 73 74#if SANITIZER_LINUX && !SANITIZER_ANDROID 75# define ASAN_INTERCEPT___LONGJMP_CHK 1 76#else 77# define ASAN_INTERCEPT___LONGJMP_CHK 0 78#endif 79 80#if ASAN_HAS_EXCEPTIONS && !SANITIZER_WINDOWS && !SANITIZER_SOLARIS && \ 81 !SANITIZER_NETBSD 82# define ASAN_INTERCEPT___CXA_THROW 1 83# define ASAN_INTERCEPT___CXA_RETHROW_PRIMARY_EXCEPTION 1 84# if defined(_GLIBCXX_SJLJ_EXCEPTIONS) || (SANITIZER_IOS && defined(__arm__)) 85# define ASAN_INTERCEPT__UNWIND_SJLJ_RAISEEXCEPTION 1 86# else 87# define ASAN_INTERCEPT__UNWIND_RAISEEXCEPTION 1 88# endif 89#else 90# define ASAN_INTERCEPT___CXA_THROW 0 91# define ASAN_INTERCEPT___CXA_RETHROW_PRIMARY_EXCEPTION 0 92# define ASAN_INTERCEPT__UNWIND_RAISEEXCEPTION 0 93# define ASAN_INTERCEPT__UNWIND_SJLJ_RAISEEXCEPTION 0 94#endif 95 96#if !SANITIZER_WINDOWS 97# define ASAN_INTERCEPT___CXA_ATEXIT 1 98#else 99# define ASAN_INTERCEPT___CXA_ATEXIT 0 100#endif 101 102#if SANITIZER_NETBSD 103# define ASAN_INTERCEPT_ATEXIT 1 104#else 105# define ASAN_INTERCEPT_ATEXIT 0 106#endif 107 108#if SANITIZER_LINUX && !SANITIZER_ANDROID 109# define ASAN_INTERCEPT___STRDUP 1 110#else 111# define ASAN_INTERCEPT___STRDUP 0 112#endif 113 114#if SANITIZER_LINUX && (defined(__arm__) || defined(__aarch64__) || \ 115 defined(__i386__) || defined(__x86_64__)) 116# define ASAN_INTERCEPT_VFORK 1 117#else 118# define ASAN_INTERCEPT_VFORK 0 119#endif 120 121#if SANITIZER_NETBSD 122# define ASAN_INTERCEPT_PTHREAD_ATFORK 1 123#else 124# define ASAN_INTERCEPT_PTHREAD_ATFORK 0 125#endif 126 127DECLARE_REAL(int, memcmp, const void *a1, const void *a2, uptr size) 128DECLARE_REAL(char*, strchr, const char *str, int c) 129DECLARE_REAL(SIZE_T, strlen, const char *s) 130DECLARE_REAL(char*, strncpy, char *to, const char *from, uptr size) 131DECLARE_REAL(uptr, strnlen, const char *s, uptr maxlen) 132DECLARE_REAL(char*, strstr, const char *s1, const char *s2) 133 134#if !SANITIZER_MAC 135#define ASAN_INTERCEPT_FUNC(name) \ 136 do { \ 137 if (!INTERCEPT_FUNCTION(name)) \ 138 VReport(1, "AddressSanitizer: failed to intercept '%s'\n'", #name); \ 139 } while (0) 140#define ASAN_INTERCEPT_FUNC_VER(name, ver) \ 141 do { \ 142 if (!INTERCEPT_FUNCTION_VER(name, ver)) \ 143 VReport(1, "AddressSanitizer: failed to intercept '%s@@%s'\n", #name, \ 144 #ver); \ 145 } while (0) 146#else 147// OS X interceptors don't need to be initialized with INTERCEPT_FUNCTION. 148#define ASAN_INTERCEPT_FUNC(name) 149#endif // SANITIZER_MAC 150 151#endif // !SANITIZER_FUCHSIA 152 153#endif // ASAN_INTERCEPTORS_H 154