asan_internal.h revision 6a08d29b2020004b801ca69d8aea5872a7e67d72
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" 201b5ea8fbbef73f5d9b41dbb26a21b9a0f4d1445eKostya Serebryany#include "sanitizer_common/sanitizer_stacktrace.h" 2116e0075746b21ed866ec3be21ef0d1e46f0efed5Kostya Serebryany#include "sanitizer_common/sanitizer_libc.h" 22b3cedf98a3c8545da2234c2d35cb5d687984035fKostya Serebryany 236f0452914ec76c786eb865983793bc03b00fc7b6Alexander Potapenko#if !defined(__linux__) && !defined(__APPLE__) && !defined(_WIN32) 24d6567c5166412f6acdde851e767c26f332d51d3dKostya Serebryany# error "This operating system is not supported by AddressSanitizer" 25d6567c5166412f6acdde851e767c26f332d51d3dKostya Serebryany#endif 26d6567c5166412f6acdde851e767c26f332d51d3dKostya Serebryany 27b823e3c5f7891dbbde1eb288237f5f3d5ed64d85Alexey Samsonov#define ASAN_DEFAULT_FAILURE_EXITCODE 1 28b823e3c5f7891dbbde1eb288237f5f3d5ed64d85Alexey Samsonov 293e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov#if defined(__linux__) 303e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov# define ASAN_LINUX 1 313e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov#else 323e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov# define ASAN_LINUX 0 333e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov#endif 343e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov 353e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov#if defined(__APPLE__) 363e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov# define ASAN_MAC 1 373e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov#else 383e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov# define ASAN_MAC 0 393e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov#endif 403e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov 413e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov#if defined(_WIN32) 423e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov# define ASAN_WINDOWS 1 433e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov#else 443e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov# define ASAN_WINDOWS 0 453e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov#endif 463e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov 473891ce634380845d337cd865e559f4abbdc8ebdbEvgeniy Stepanov#if defined(__ANDROID__) || defined(ANDROID) 483891ce634380845d337cd865e559f4abbdc8ebdbEvgeniy Stepanov# define ASAN_ANDROID 1 493891ce634380845d337cd865e559f4abbdc8ebdbEvgeniy Stepanov#else 503891ce634380845d337cd865e559f4abbdc8ebdbEvgeniy Stepanov# define ASAN_ANDROID 0 513891ce634380845d337cd865e559f4abbdc8ebdbEvgeniy Stepanov#endif 523891ce634380845d337cd865e559f4abbdc8ebdbEvgeniy Stepanov 533891ce634380845d337cd865e559f4abbdc8ebdbEvgeniy Stepanov 5434a3202a2c22816a6da66959e266a2d078ded37bAlexey Samsonov#define ASAN_POSIX (ASAN_LINUX || ASAN_MAC) 5534a3202a2c22816a6da66959e266a2d078ded37bAlexey Samsonov 56850a49ecb344a71d62347bbee8042ae13b624033Kostya Serebryany#if __has_feature(address_sanitizer) 571e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany# error "The AddressSanitizer run-time should not be" 581e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany " instrumented by AddressSanitizer" 591e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#endif 601e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 61c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany// Build-time configuration options. 62c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany 63c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany// If set, asan will install its own SEGV signal handler. 64c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany#ifndef ASAN_NEEDS_SEGV 653be338483aee033699cabfe47efe3e7c0b4c7a2bAlexander Potapenko# if ASAN_ANDROID == 1 669712af9ce7f5efc14cb11af2599fd065e7b7a3ddEvgeniy Stepanov# define ASAN_NEEDS_SEGV 0 679712af9ce7f5efc14cb11af2599fd065e7b7a3ddEvgeniy Stepanov# else 689712af9ce7f5efc14cb11af2599fd065e7b7a3ddEvgeniy Stepanov# define ASAN_NEEDS_SEGV 1 699712af9ce7f5efc14cb11af2599fd065e7b7a3ddEvgeniy Stepanov# endif 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 869712af9ce7f5efc14cb11af2599fd065e7b7a3ddEvgeniy Stepanov# ifdef ASAN_ANDROID 879712af9ce7f5efc14cb11af2599fd065e7b7a3ddEvgeniy Stepanov# define ASAN_LOW_MEMORY 1 889712af9ce7f5efc14cb11af2599fd065e7b7a3ddEvgeniy Stepanov# else 899712af9ce7f5efc14cb11af2599fd065e7b7a3ddEvgeniy Stepanov# define ASAN_LOW_MEMORY 0 909712af9ce7f5efc14cb11af2599fd065e7b7a3ddEvgeniy Stepanov# endif 918ae44ac678644265ba82a1b5696a402c9301a85cEvgeniy Stepanov#endif 928ae44ac678644265ba82a1b5696a402c9301a85cEvgeniy Stepanov 931e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// All internal functions in asan reside inside the __asan namespace 941e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// to avoid namespace collisions with the user programs. 951e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// Seperate namespace also makes it simpler to distinguish the asan run-time 961e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// functions from the instrumented user code in a profile. 971e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanynamespace __asan { 981e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 991e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyclass AsanThread; 1001b5ea8fbbef73f5d9b41dbb26a21b9a0f4d1445eKostya Serebryanyusing __sanitizer::StackTrace; 1011e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 102218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany// asan_rtl.cc 103b55c88d6d21c862261f267c5199e3aacc0cd30ebTimur Iskhodzhanovvoid NORETURN ShowStatsAndAbort(); 1041e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 1054d5f98df886051afeece1698d4bc8f154391c22dAlexey Samsonovvoid ReplaceOperatorsNewAndDelete(); 106218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany// asan_malloc_linux.cc / asan_malloc_mac.cc 1071e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyvoid ReplaceSystemMalloc(); 1081e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 109f73a6a3f81573ba85a5e29955980818b18b0a58aAlexander Potapenko// asan_linux.cc / asan_mac.cc / asan_win.cc 1101e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyvoid *AsanDoesNotSupportStaticLinkage(); 111de496f451bce322b6cde100456591f1f50ab3477Kostya Serebryany 1123f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryanyvoid GetPcSpBp(void *context, uptr *pc, uptr *sp, uptr *bp); 113ef14ff6512d7b2e20aa3206dff820b5f90285420Kostya Serebryany 114eb8c46e419f4c6f01d1b1a0d1b96cc51a61ecbc3Alexander Potapenkovoid MaybeReexec(); 1154803ab90ead451b55a5833f0fd38b10fd1fc83ebKostya Serebryanybool AsanInterceptsSignal(int signum); 116f03d8afc8b8dd072c4e2884a7475ee28ac5f3f41Alexander Potapenkovoid SetAlternateSignalStack(); 117f03d8afc8b8dd072c4e2884a7475ee28ac5f3f41Alexander Potapenkovoid UnsetAlternateSignalStack(); 118a7e760a53bc43b8e09bfdf5cd6f215267ba99729Kostya Serebryanyvoid InstallSignalHandlers(); 1190870028410087e67a0049c76cb7c64f02c260d24Alexey Samsonovvoid ClearShadowMemoryForContext(void *context); 12075b19ebf25af204cf209d108997272822241d6daAlexander Potapenkovoid AsanPlatformThreadInit(); 121cc4e6862c6a8f8f3ead96bd32b815184a36fadedKostya Serebryany 122cc4e6862c6a8f8f3ead96bd32b815184a36fadedKostya Serebryany// Wrapper for TLS/TSD. 123f58f998066db0231e521169d2f50af439ceecb49Kostya Serebryanyvoid AsanTSDInit(void (*destructor)(void *tsd)); 124cc4e6862c6a8f8f3ead96bd32b815184a36fadedKostya Serebryanyvoid *AsanTSDGet(); 125cc4e6862c6a8f8f3ead96bd32b815184a36fadedKostya Serebryanyvoid AsanTSDSet(void *tsd); 1264803ab90ead451b55a5833f0fd38b10fd1fc83ebKostya Serebryany 127e954101f6602ac181a2c3accfbbad0ae51b0bf7cAlexey Samsonovvoid AppendToErrorMessageBuffer(const char *buffer); 1281e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 129218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany// asan_poisoning.cc 130218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany// Poisons the shadow memory for "size" bytes starting from "addr". 131ee3925515e4c7966f3ef489f687aa7e5692806a9Kostya Serebryanyvoid PoisonShadow(uptr addr, uptr size, u8 value); 132218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany// Poisons the shadow memory for "redzone_size" bytes starting from 133218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany// "addr + size". 1343f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryanyvoid PoisonShadowPartialRightRedzone(uptr addr, 1353f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany uptr size, 1363f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany uptr redzone_size, 137ee3925515e4c7966f3ef489f687aa7e5692806a9Kostya Serebryany u8 value); 138218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany 13938dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonov// Platfrom-specific options. 14038dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonov#ifdef __APPLE__ 14138dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonovbool PlatformHasDifferentMemcpyAndMemmove(); 14238dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonov# define PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE \ 14338dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonov (PlatformHasDifferentMemcpyAndMemmove()) 14438dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonov#else 14538dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonov# define PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE true 14638dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonov#endif // __APPLE__ 14738dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonov 1486a08d29b2020004b801ca69d8aea5872a7e67d72Alexey Samsonov// Add convenient macro for interface functions that may be represented as 1496a08d29b2020004b801ca69d8aea5872a7e67d72Alexey Samsonov// weak hooks. 1506a08d29b2020004b801ca69d8aea5872a7e67d72Alexey Samsonov#define ASAN_MALLOC_HOOK(ptr, size) \ 1516a08d29b2020004b801ca69d8aea5872a7e67d72Alexey Samsonov if (&__asan_malloc_hook) __asan_malloc_hook(ptr, size) 1526a08d29b2020004b801ca69d8aea5872a7e67d72Alexey Samsonov#define ASAN_FREE_HOOK(ptr) \ 1536a08d29b2020004b801ca69d8aea5872a7e67d72Alexey Samsonov if (&__asan_free_hook) __asan_free_hook(ptr) 1546a08d29b2020004b801ca69d8aea5872a7e67d72Alexey Samsonov#define ASAN_ON_ERROR() \ 1556a08d29b2020004b801ca69d8aea5872a7e67d72Alexey Samsonov if (&__asan_on_error) __asan_on_error() 1566a08d29b2020004b801ca69d8aea5872a7e67d72Alexey Samsonov 1571e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyextern int asan_inited; 1581e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// Used to avoid infinite recursion in __asan_init(). 1591e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyextern bool asan_init_is_running; 16047657ce6cbac2fa93d0fd765c5d2872443b50e87Alexey Samsonovextern void (*death_callback)(void); 1611e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 1621e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// These magic values are written to shadow for better error reporting. 1631e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanHeapLeftRedzoneMagic = 0xfa; 1641e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanHeapRightRedzoneMagic = 0xfb; 1651e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanHeapFreeMagic = 0xfd; 1661e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanStackLeftRedzoneMagic = 0xf1; 1671e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanStackMidRedzoneMagic = 0xf2; 1681e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanStackRightRedzoneMagic = 0xf3; 1691e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanStackPartialRedzoneMagic = 0xf4; 1701e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanStackAfterReturnMagic = 0xf5; 1713945c58f9db42671b1a3b865fde5008f09a3a40eKostya Serebryanyconst int kAsanInitializationOrderMagic = 0xf6; 1721e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanUserPoisonedMemoryMagic = 0xf7; 173d4b5db8cb8a7a13bb5cc1d4ce53e8e088303c854Alexey Samsonovconst int kAsanStackUseAfterScopeMagic = 0xf8; 1741e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanGlobalRedzoneMagic = 0xf9; 1756b30e2cf0d9d471d276f91ef4bb74dbd9876f4d9Kostya Serebryanyconst int kAsanInternalHeapMagic = 0xfe; 1761e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 1773f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryanystatic const uptr kCurrentStackFrameMagic = 0x41B58AB3; 1783f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryanystatic const uptr kRetiredStackFrameMagic = 0x45E0360E; 1791e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 1801e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} // namespace __asan 1811e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 1821e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#endif // ASAN_INTERNAL_H 183