asan_internal.h revision 3891ce634380845d337cd865e559f4abbdc8ebdb
11e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany//===-- asan_internal.h -----------------------------------------*- C++ -*-===// 21e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// 31e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// The LLVM Compiler Infrastructure 41e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// 51e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// This file is distributed under the University of Illinois Open Source 61e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// License. See LICENSE.TXT for details. 71e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// 81e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany//===----------------------------------------------------------------------===// 91e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// 101e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// This file is a part of AddressSanitizer, an address sanity checker. 111e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// 121e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// ASan-private header which defines various general utilities. 131e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany//===----------------------------------------------------------------------===// 141e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#ifndef ASAN_INTERNAL_H 151e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#define ASAN_INTERNAL_H 161e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 177ed1d2b699767dd1875994cb625d51a95b44221aAlexey Samsonov#include "asan_flags.h" 1847657ce6cbac2fa93d0fd765c5d2872443b50e87Alexey Samsonov#include "sanitizer_common/sanitizer_common.h" 1994b5036ee6ba866e1702848855b6d687d1e70afaAlexey Samsonov#include "sanitizer_common/sanitizer_internal_defs.h" 2016e0075746b21ed866ec3be21ef0d1e46f0efed5Kostya Serebryany#include "sanitizer_common/sanitizer_libc.h" 21b3cedf98a3c8545da2234c2d35cb5d687984035fKostya Serebryany 226f0452914ec76c786eb865983793bc03b00fc7b6Alexander Potapenko#if !defined(__linux__) && !defined(__APPLE__) && !defined(_WIN32) 23d6567c5166412f6acdde851e767c26f332d51d3dKostya Serebryany# error "This operating system is not supported by AddressSanitizer" 24d6567c5166412f6acdde851e767c26f332d51d3dKostya Serebryany#endif 25d6567c5166412f6acdde851e767c26f332d51d3dKostya Serebryany 26858220837f85db7eb5eedd5ea68603803b5eb3c9Kostya Serebryany#if defined(_WIN32) 2771d3b398a39663c771918747762142215a1dc87dAlexander Potapenkoextern "C" void* _ReturnAddress(void); 2871d3b398a39663c771918747762142215a1dc87dAlexander Potapenko# pragma intrinsic(_ReturnAddress) 29adf2b036127d7e887392d9be5b02069b777ee280Alexey Samsonov#endif // defined(_WIN32) 301e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 31b823e3c5f7891dbbde1eb288237f5f3d5ed64d85Alexey Samsonov#define ASAN_DEFAULT_FAILURE_EXITCODE 1 32b823e3c5f7891dbbde1eb288237f5f3d5ed64d85Alexey Samsonov 333e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov#if defined(__linux__) 343e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov# define ASAN_LINUX 1 353e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov#else 363e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov# define ASAN_LINUX 0 373e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov#endif 383e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov 393e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov#if defined(__APPLE__) 403e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov# define ASAN_MAC 1 413e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov#else 423e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov# define ASAN_MAC 0 433e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov#endif 443e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov 453e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov#if defined(_WIN32) 463e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov# define ASAN_WINDOWS 1 473e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov#else 483e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov# define ASAN_WINDOWS 0 493e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov#endif 503e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov 513891ce634380845d337cd865e559f4abbdc8ebdbEvgeniy Stepanov#if defined(__ANDROID__) || defined(ANDROID) 523891ce634380845d337cd865e559f4abbdc8ebdbEvgeniy Stepanov# define ASAN_ANDROID 1 533891ce634380845d337cd865e559f4abbdc8ebdbEvgeniy Stepanov#else 543891ce634380845d337cd865e559f4abbdc8ebdbEvgeniy Stepanov# define ASAN_ANDROID 0 553891ce634380845d337cd865e559f4abbdc8ebdbEvgeniy Stepanov#endif 563891ce634380845d337cd865e559f4abbdc8ebdbEvgeniy Stepanov 573891ce634380845d337cd865e559f4abbdc8ebdbEvgeniy Stepanov 5834a3202a2c22816a6da66959e266a2d078ded37bAlexey Samsonov#define ASAN_POSIX (ASAN_LINUX || ASAN_MAC) 5934a3202a2c22816a6da66959e266a2d078ded37bAlexey Samsonov 60850a49ecb344a71d62347bbee8042ae13b624033Kostya Serebryany#if __has_feature(address_sanitizer) 611e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany# error "The AddressSanitizer run-time should not be" 621e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany " instrumented by AddressSanitizer" 631e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#endif 641e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 65c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany// Build-time configuration options. 66c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany 67c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany// If set, asan will install its own SEGV signal handler. 68c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany#ifndef ASAN_NEEDS_SEGV 69c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany# define ASAN_NEEDS_SEGV 1 70c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany#endif 71c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany 72c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany// If set, asan will intercept C++ exception api call(s). 73c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany#ifndef ASAN_HAS_EXCEPTIONS 74c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany# define ASAN_HAS_EXCEPTIONS 1 75c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany#endif 76c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany 77c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany// If set, asan uses the values of SHADOW_SCALE and SHADOW_OFFSET 78c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany// provided by the instrumented objects. Otherwise constants are used. 79c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany#ifndef ASAN_FLEXIBLE_MAPPING_AND_OFFSET 80c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany# define ASAN_FLEXIBLE_MAPPING_AND_OFFSET 0 81c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany#endif 82c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany 838ae44ac678644265ba82a1b5696a402c9301a85cEvgeniy Stepanov// If set, values like allocator chunk size, as well as defaults for some flags 848ae44ac678644265ba82a1b5696a402c9301a85cEvgeniy Stepanov// will be changed towards less memory overhead. 858ae44ac678644265ba82a1b5696a402c9301a85cEvgeniy Stepanov#ifndef ASAN_LOW_MEMORY 868ae44ac678644265ba82a1b5696a402c9301a85cEvgeniy Stepanov# define ASAN_LOW_MEMORY 0 878ae44ac678644265ba82a1b5696a402c9301a85cEvgeniy Stepanov#endif 888ae44ac678644265ba82a1b5696a402c9301a85cEvgeniy Stepanov 891e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// All internal functions in asan reside inside the __asan namespace 901e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// to avoid namespace collisions with the user programs. 911e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// Seperate namespace also makes it simpler to distinguish the asan run-time 921e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// functions from the instrumented user code in a profile. 931e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanynamespace __asan { 941e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 951e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyclass AsanThread; 961e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanystruct AsanStackTrace; 971e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 98218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany// asan_rtl.cc 99b55c88d6d21c862261f267c5199e3aacc0cd30ebTimur Iskhodzhanovvoid NORETURN ShowStatsAndAbort(); 1001e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 1014d5f98df886051afeece1698d4bc8f154391c22dAlexey Samsonovvoid ReplaceOperatorsNewAndDelete(); 102218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany// asan_malloc_linux.cc / asan_malloc_mac.cc 1031e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyvoid ReplaceSystemMalloc(); 1041e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 105f73a6a3f81573ba85a5e29955980818b18b0a58aAlexander Potapenko// asan_linux.cc / asan_mac.cc / asan_win.cc 1061e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyvoid *AsanDoesNotSupportStaticLinkage(); 107de496f451bce322b6cde100456591f1f50ab3477Kostya Serebryany 1083f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryanyvoid GetPcSpBp(void *context, uptr *pc, uptr *sp, uptr *bp); 109ef14ff6512d7b2e20aa3206dff820b5f90285420Kostya Serebryany 110eb8c46e419f4c6f01d1b1a0d1b96cc51a61ecbc3Alexander Potapenkovoid MaybeReexec(); 1114803ab90ead451b55a5833f0fd38b10fd1fc83ebKostya Serebryanybool AsanInterceptsSignal(int signum); 112f03d8afc8b8dd072c4e2884a7475ee28ac5f3f41Alexander Potapenkovoid SetAlternateSignalStack(); 113f03d8afc8b8dd072c4e2884a7475ee28ac5f3f41Alexander Potapenkovoid UnsetAlternateSignalStack(); 114a7e760a53bc43b8e09bfdf5cd6f215267ba99729Kostya Serebryanyvoid InstallSignalHandlers(); 11575b19ebf25af204cf209d108997272822241d6daAlexander Potapenkovoid AsanPlatformThreadInit(); 116cc4e6862c6a8f8f3ead96bd32b815184a36fadedKostya Serebryany 117cc4e6862c6a8f8f3ead96bd32b815184a36fadedKostya Serebryany// Wrapper for TLS/TSD. 118f58f998066db0231e521169d2f50af439ceecb49Kostya Serebryanyvoid AsanTSDInit(void (*destructor)(void *tsd)); 119cc4e6862c6a8f8f3ead96bd32b815184a36fadedKostya Serebryanyvoid *AsanTSDGet(); 120cc4e6862c6a8f8f3ead96bd32b815184a36fadedKostya Serebryanyvoid AsanTSDSet(void *tsd); 1214803ab90ead451b55a5833f0fd38b10fd1fc83ebKostya Serebryany 122e954101f6602ac181a2c3accfbbad0ae51b0bf7cAlexey Samsonovvoid AppendToErrorMessageBuffer(const char *buffer); 123218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany// asan_printf.cc 1247fdcdf5a3a7090ec86d426a815bb42f3d35adf13Alexey Samsonovvoid AsanPrintf(const char *format, ...); 1257fdcdf5a3a7090ec86d426a815bb42f3d35adf13Alexey Samsonovvoid AsanReport(const char *format, ...); 1261e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 127218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany// asan_poisoning.cc 128218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany// Poisons the shadow memory for "size" bytes starting from "addr". 129ee3925515e4c7966f3ef489f687aa7e5692806a9Kostya Serebryanyvoid PoisonShadow(uptr addr, uptr size, u8 value); 130218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany// Poisons the shadow memory for "redzone_size" bytes starting from 131218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany// "addr + size". 1323f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryanyvoid PoisonShadowPartialRightRedzone(uptr addr, 1333f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany uptr size, 1343f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany uptr redzone_size, 135ee3925515e4c7966f3ef489f687aa7e5692806a9Kostya Serebryany u8 value); 136218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany 13738dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonov// Platfrom-specific options. 13838dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonov#ifdef __APPLE__ 13938dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonovbool PlatformHasDifferentMemcpyAndMemmove(); 14038dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonov# define PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE \ 14138dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonov (PlatformHasDifferentMemcpyAndMemmove()) 14238dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonov#else 14338dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonov# define PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE true 14438dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonov#endif // __APPLE__ 14538dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonov 1461e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyextern int asan_inited; 1471e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// Used to avoid infinite recursion in __asan_init(). 1481e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyextern bool asan_init_is_running; 14947657ce6cbac2fa93d0fd765c5d2872443b50e87Alexey Samsonovextern void (*death_callback)(void); 1501e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 1511e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#define ASAN_ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0])) 1521e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 1538c505efd769a21eac7de53bc104757245af6ed4aTimur Iskhodzhanov#if !defined(_WIN32) || defined(__clang__) 1543f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany# define GET_CALLER_PC() (uptr)__builtin_return_address(0) 1553f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany# define GET_CURRENT_FRAME() (uptr)__builtin_frame_address(0) 1566f0452914ec76c786eb865983793bc03b00fc7b6Alexander Potapenko#else 1573f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany# define GET_CALLER_PC() (uptr)_ReturnAddress() 1581c83ae34f32737a203c66e9d9c419f821a0db02fKostya Serebryany// CaptureStackBackTrace doesn't need to know BP on Windows. 1591c83ae34f32737a203c66e9d9c419f821a0db02fKostya Serebryany// FIXME: This macro is still used when printing error reports though it's not 1601c83ae34f32737a203c66e9d9c419f821a0db02fKostya Serebryany// clear if the BP value is needed in the ASan reports on Windows. 1613f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany# define GET_CURRENT_FRAME() (uptr)0xDEADBEEF 1628c505efd769a21eac7de53bc104757245af6ed4aTimur Iskhodzhanov#endif 1638c505efd769a21eac7de53bc104757245af6ed4aTimur Iskhodzhanov 164dd3a911e46b3f0416d60d9be5c84ccfc4b1c3aa8Alexey Samsonov#ifdef _WIN32 165c93d3e2bdfb1ad9cce26a6e8d66764ed97a6d6b4Alexey Samsonovbool WinSymbolize(const void *addr, char *out_buffer, int buffer_size); 166dd3a911e46b3f0416d60d9be5c84ccfc4b1c3aa8Alexey Samsonov#endif // _WIN32 167600972e3427173cc8904d741decd1af0ed5de9fdTimur Iskhodzhanov 1681e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// These magic values are written to shadow for better error reporting. 1691e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanHeapLeftRedzoneMagic = 0xfa; 1701e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanHeapRightRedzoneMagic = 0xfb; 1711e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanHeapFreeMagic = 0xfd; 1721e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanStackLeftRedzoneMagic = 0xf1; 1731e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanStackMidRedzoneMagic = 0xf2; 1741e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanStackRightRedzoneMagic = 0xf3; 1751e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanStackPartialRedzoneMagic = 0xf4; 1761e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanStackAfterReturnMagic = 0xf5; 1773945c58f9db42671b1a3b865fde5008f09a3a40eKostya Serebryanyconst int kAsanInitializationOrderMagic = 0xf6; 1781e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanUserPoisonedMemoryMagic = 0xf7; 1791e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanGlobalRedzoneMagic = 0xf9; 1806b30e2cf0d9d471d276f91ef4bb74dbd9876f4d9Kostya Serebryanyconst int kAsanInternalHeapMagic = 0xfe; 1811e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 1823f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryanystatic const uptr kCurrentStackFrameMagic = 0x41B58AB3; 1833f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryanystatic const uptr kRetiredStackFrameMagic = 0x45E0360E; 1841e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 1851e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} // namespace __asan 1861e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 1871e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#endif // ASAN_INTERNAL_H 188