asan_internal.h revision 46efcb09dc16b91cb805abea52f3ff6081a63751
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" 18c70fa28caaaec2134f2c2230821fcc0f0d7ac27eAlexey Samsonov#include "asan_interface_internal.h" 1947657ce6cbac2fa93d0fd765c5d2872443b50e87Alexey Samsonov#include "sanitizer_common/sanitizer_common.h" 2094b5036ee6ba866e1702848855b6d687d1e70afaAlexey Samsonov#include "sanitizer_common/sanitizer_internal_defs.h" 211b5ea8fbbef73f5d9b41dbb26a21b9a0f4d1445eKostya Serebryany#include "sanitizer_common/sanitizer_stacktrace.h" 2216e0075746b21ed866ec3be21ef0d1e46f0efed5Kostya Serebryany#include "sanitizer_common/sanitizer_libc.h" 23b3cedf98a3c8545da2234c2d35cb5d687984035fKostya Serebryany 24b823e3c5f7891dbbde1eb288237f5f3d5ed64d85Alexey Samsonov#define ASAN_DEFAULT_FAILURE_EXITCODE 1 25b823e3c5f7891dbbde1eb288237f5f3d5ed64d85Alexey Samsonov 26e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany#if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__) 271e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany# error "The AddressSanitizer run-time should not be" 281e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany " instrumented by AddressSanitizer" 291e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#endif 301e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 31c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany// Build-time configuration options. 32c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany 33c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany// If set, asan will install its own SEGV signal handler. 34c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany#ifndef ASAN_NEEDS_SEGV 3583cb7877f608eb9b3d65981095216842f686c527Evgeniy Stepanov# if SANITIZER_ANDROID == 1 369712af9ce7f5efc14cb11af2599fd065e7b7a3ddEvgeniy Stepanov# define ASAN_NEEDS_SEGV 0 379712af9ce7f5efc14cb11af2599fd065e7b7a3ddEvgeniy Stepanov# else 389712af9ce7f5efc14cb11af2599fd065e7b7a3ddEvgeniy Stepanov# define ASAN_NEEDS_SEGV 1 399712af9ce7f5efc14cb11af2599fd065e7b7a3ddEvgeniy Stepanov# endif 40c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany#endif 41c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany 42c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany// If set, asan will intercept C++ exception api call(s). 43c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany#ifndef ASAN_HAS_EXCEPTIONS 44c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany# define ASAN_HAS_EXCEPTIONS 1 45c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany#endif 46c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany 47c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany// If set, asan uses the values of SHADOW_SCALE and SHADOW_OFFSET 48c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany// provided by the instrumented objects. Otherwise constants are used. 49c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany#ifndef ASAN_FLEXIBLE_MAPPING_AND_OFFSET 50c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany# define ASAN_FLEXIBLE_MAPPING_AND_OFFSET 0 51c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany#endif 52c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany 538ae44ac678644265ba82a1b5696a402c9301a85cEvgeniy Stepanov// If set, values like allocator chunk size, as well as defaults for some flags 548ae44ac678644265ba82a1b5696a402c9301a85cEvgeniy Stepanov// will be changed towards less memory overhead. 558ae44ac678644265ba82a1b5696a402c9301a85cEvgeniy Stepanov#ifndef ASAN_LOW_MEMORY 56e52810d7144ca35bbaeca0b28d138b386ab90243Kostya Serebryany#if SANITIZER_WORDSIZE == 32 579712af9ce7f5efc14cb11af2599fd065e7b7a3ddEvgeniy Stepanov# define ASAN_LOW_MEMORY 1 58e52810d7144ca35bbaeca0b28d138b386ab90243Kostya Serebryany#else 599712af9ce7f5efc14cb11af2599fd065e7b7a3ddEvgeniy Stepanov# define ASAN_LOW_MEMORY 0 609712af9ce7f5efc14cb11af2599fd065e7b7a3ddEvgeniy Stepanov# endif 618ae44ac678644265ba82a1b5696a402c9301a85cEvgeniy Stepanov#endif 62e1353430866fe112de0f52ab6281dbc47e40ef66Kostya Serebryany 63e1353430866fe112de0f52ab6281dbc47e40ef66Kostya Serebryany#ifndef ASAN_USE_PREINIT_ARRAY 6483cb7877f608eb9b3d65981095216842f686c527Evgeniy Stepanov# define ASAN_USE_PREINIT_ARRAY (SANITIZER_LINUX && !SANITIZER_ANDROID) 65e1353430866fe112de0f52ab6281dbc47e40ef66Kostya Serebryany#endif 668ae44ac678644265ba82a1b5696a402c9301a85cEvgeniy Stepanov 671e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// All internal functions in asan reside inside the __asan namespace 681e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// to avoid namespace collisions with the user programs. 691e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// Seperate namespace also makes it simpler to distinguish the asan run-time 701e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// functions from the instrumented user code in a profile. 711e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanynamespace __asan { 721e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 731e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyclass AsanThread; 741b5ea8fbbef73f5d9b41dbb26a21b9a0f4d1445eKostya Serebryanyusing __sanitizer::StackTrace; 751e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 76218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany// asan_rtl.cc 77b55c88d6d21c862261f267c5199e3aacc0cd30ebTimur Iskhodzhanovvoid NORETURN ShowStatsAndAbort(); 781e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 794d5f98df886051afeece1698d4bc8f154391c22dAlexey Samsonovvoid ReplaceOperatorsNewAndDelete(); 80218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany// asan_malloc_linux.cc / asan_malloc_mac.cc 811e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyvoid ReplaceSystemMalloc(); 821e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 83f73a6a3f81573ba85a5e29955980818b18b0a58aAlexander Potapenko// asan_linux.cc / asan_mac.cc / asan_win.cc 841e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyvoid *AsanDoesNotSupportStaticLinkage(); 85de496f451bce322b6cde100456591f1f50ab3477Kostya Serebryany 863f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryanyvoid GetPcSpBp(void *context, uptr *pc, uptr *sp, uptr *bp); 87ef14ff6512d7b2e20aa3206dff820b5f90285420Kostya Serebryany 88eb8c46e419f4c6f01d1b1a0d1b96cc51a61ecbc3Alexander Potapenkovoid MaybeReexec(); 894803ab90ead451b55a5833f0fd38b10fd1fc83ebKostya Serebryanybool AsanInterceptsSignal(int signum); 90f03d8afc8b8dd072c4e2884a7475ee28ac5f3f41Alexander Potapenkovoid SetAlternateSignalStack(); 91f03d8afc8b8dd072c4e2884a7475ee28ac5f3f41Alexander Potapenkovoid UnsetAlternateSignalStack(); 92a7e760a53bc43b8e09bfdf5cd6f215267ba99729Kostya Serebryanyvoid InstallSignalHandlers(); 9357db4bae483e7268dd7fc5bc42b0e55564014048Alexey Samsonovvoid ReadContextStack(void *context, uptr *stack, uptr *ssize); 9475b19ebf25af204cf209d108997272822241d6daAlexander Potapenkovoid AsanPlatformThreadInit(); 9546efcb09dc16b91cb805abea52f3ff6081a63751Alexey Samsonovvoid StopInitOrderChecking(); 96cc4e6862c6a8f8f3ead96bd32b815184a36fadedKostya Serebryany 97cc4e6862c6a8f8f3ead96bd32b815184a36fadedKostya Serebryany// Wrapper for TLS/TSD. 98f58f998066db0231e521169d2f50af439ceecb49Kostya Serebryanyvoid AsanTSDInit(void (*destructor)(void *tsd)); 99cc4e6862c6a8f8f3ead96bd32b815184a36fadedKostya Serebryanyvoid *AsanTSDGet(); 100cc4e6862c6a8f8f3ead96bd32b815184a36fadedKostya Serebryanyvoid AsanTSDSet(void *tsd); 1014803ab90ead451b55a5833f0fd38b10fd1fc83ebKostya Serebryany 102e954101f6602ac181a2c3accfbbad0ae51b0bf7cAlexey Samsonovvoid AppendToErrorMessageBuffer(const char *buffer); 1031e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 10438dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonov// Platfrom-specific options. 10530e110edf92303237d471f1cb8e3ad07954fb145Evgeniy Stepanov#if SANITIZER_MAC 10638dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonovbool PlatformHasDifferentMemcpyAndMemmove(); 10738dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonov# define PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE \ 10838dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonov (PlatformHasDifferentMemcpyAndMemmove()) 10938dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonov#else 11038dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonov# define PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE true 111649a270f5341efe9c57f473dbb78706b0b2ed523Alexey Samsonov#endif // SANITIZER_MAC 11238dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonov 1136a08d29b2020004b801ca69d8aea5872a7e67d72Alexey Samsonov// Add convenient macro for interface functions that may be represented as 1146a08d29b2020004b801ca69d8aea5872a7e67d72Alexey Samsonov// weak hooks. 1156a08d29b2020004b801ca69d8aea5872a7e67d72Alexey Samsonov#define ASAN_MALLOC_HOOK(ptr, size) \ 1166a08d29b2020004b801ca69d8aea5872a7e67d72Alexey Samsonov if (&__asan_malloc_hook) __asan_malloc_hook(ptr, size) 1176a08d29b2020004b801ca69d8aea5872a7e67d72Alexey Samsonov#define ASAN_FREE_HOOK(ptr) \ 1186a08d29b2020004b801ca69d8aea5872a7e67d72Alexey Samsonov if (&__asan_free_hook) __asan_free_hook(ptr) 1196a08d29b2020004b801ca69d8aea5872a7e67d72Alexey Samsonov#define ASAN_ON_ERROR() \ 1206a08d29b2020004b801ca69d8aea5872a7e67d72Alexey Samsonov if (&__asan_on_error) __asan_on_error() 1216a08d29b2020004b801ca69d8aea5872a7e67d72Alexey Samsonov 1221e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyextern int asan_inited; 1231e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// Used to avoid infinite recursion in __asan_init(). 1241e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyextern bool asan_init_is_running; 12547657ce6cbac2fa93d0fd765c5d2872443b50e87Alexey Samsonovextern void (*death_callback)(void); 1261e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 1271e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// These magic values are written to shadow for better error reporting. 1281e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanHeapLeftRedzoneMagic = 0xfa; 1291e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanHeapRightRedzoneMagic = 0xfb; 1301e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanHeapFreeMagic = 0xfd; 1311e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanStackLeftRedzoneMagic = 0xf1; 1321e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanStackMidRedzoneMagic = 0xf2; 1331e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanStackRightRedzoneMagic = 0xf3; 1341e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanStackPartialRedzoneMagic = 0xf4; 1351e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanStackAfterReturnMagic = 0xf5; 1363945c58f9db42671b1a3b865fde5008f09a3a40eKostya Serebryanyconst int kAsanInitializationOrderMagic = 0xf6; 1371e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanUserPoisonedMemoryMagic = 0xf7; 138d4b5db8cb8a7a13bb5cc1d4ce53e8e088303c854Alexey Samsonovconst int kAsanStackUseAfterScopeMagic = 0xf8; 1391e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanGlobalRedzoneMagic = 0xf9; 1406b30e2cf0d9d471d276f91ef4bb74dbd9876f4d9Kostya Serebryanyconst int kAsanInternalHeapMagic = 0xfe; 1411e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 1423f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryanystatic const uptr kCurrentStackFrameMagic = 0x41B58AB3; 1433f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryanystatic const uptr kRetiredStackFrameMagic = 0x45E0360E; 1441e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 1451e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} // namespace __asan 1461e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 1471e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#endif // ASAN_INTERNAL_H 148