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 intercept C++ exception api call(s). 34c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany#ifndef ASAN_HAS_EXCEPTIONS 35c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany# define ASAN_HAS_EXCEPTIONS 1 36c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany#endif 37c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany 388ae44ac678644265ba82a1b5696a402c9301a85cEvgeniy Stepanov// If set, values like allocator chunk size, as well as defaults for some flags 398ae44ac678644265ba82a1b5696a402c9301a85cEvgeniy Stepanov// will be changed towards less memory overhead. 408ae44ac678644265ba82a1b5696a402c9301a85cEvgeniy Stepanov#ifndef ASAN_LOW_MEMORY 41e52810d7144ca35bbaeca0b28d138b386ab90243Kostya Serebryany#if SANITIZER_WORDSIZE == 32 429712af9ce7f5efc14cb11af2599fd065e7b7a3ddEvgeniy Stepanov# define ASAN_LOW_MEMORY 1 43e52810d7144ca35bbaeca0b28d138b386ab90243Kostya Serebryany#else 449712af9ce7f5efc14cb11af2599fd065e7b7a3ddEvgeniy Stepanov# define ASAN_LOW_MEMORY 0 459712af9ce7f5efc14cb11af2599fd065e7b7a3ddEvgeniy Stepanov# endif 468ae44ac678644265ba82a1b5696a402c9301a85cEvgeniy Stepanov#endif 47e1353430866fe112de0f52ab6281dbc47e40ef66Kostya Serebryany 48e1353430866fe112de0f52ab6281dbc47e40ef66Kostya Serebryany#ifndef ASAN_USE_PREINIT_ARRAY 4983cb7877f608eb9b3d65981095216842f686c527Evgeniy Stepanov# define ASAN_USE_PREINIT_ARRAY (SANITIZER_LINUX && !SANITIZER_ANDROID) 50e1353430866fe112de0f52ab6281dbc47e40ef66Kostya Serebryany#endif 518ae44ac678644265ba82a1b5696a402c9301a85cEvgeniy Stepanov 522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#ifndef ASAN_DYNAMIC 532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines# ifdef PIC 542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines# define ASAN_DYNAMIC 1 552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines# else 562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines# define ASAN_DYNAMIC 0 572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines# endif 582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif 592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 601e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// All internal functions in asan reside inside the __asan namespace 611e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// to avoid namespace collisions with the user programs. 622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// Separate namespace also makes it simpler to distinguish the asan run-time 631e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// functions from the instrumented user code in a profile. 641e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanynamespace __asan { 651e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 661e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyclass AsanThread; 671b5ea8fbbef73f5d9b41dbb26a21b9a0f4d1445eKostya Serebryanyusing __sanitizer::StackTrace; 681e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid AsanInitFromRtl(); 702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 71218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany// asan_rtl.cc 72b55c88d6d21c862261f267c5199e3aacc0cd30ebTimur Iskhodzhanovvoid NORETURN ShowStatsAndAbort(); 731e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 74218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany// asan_malloc_linux.cc / asan_malloc_mac.cc 751e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyvoid ReplaceSystemMalloc(); 761e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 77f73a6a3f81573ba85a5e29955980818b18b0a58aAlexander Potapenko// asan_linux.cc / asan_mac.cc / asan_win.cc 781e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyvoid *AsanDoesNotSupportStaticLinkage(); 792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid AsanCheckDynamicRTPrereqs(); 802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid AsanCheckIncompatibleRT(); 81de496f451bce322b6cde100456591f1f50ab3477Kostya Serebryany 823f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryanyvoid GetPcSpBp(void *context, uptr *pc, uptr *sp, uptr *bp); 832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid AsanOnSIGSEGV(int, void *siginfo, void *context); 84ef14ff6512d7b2e20aa3206dff820b5f90285420Kostya Serebryany 85eb8c46e419f4c6f01d1b1a0d1b96cc51a61ecbc3Alexander Potapenkovoid MaybeReexec(); 864803ab90ead451b55a5833f0fd38b10fd1fc83ebKostya Serebryanybool AsanInterceptsSignal(int signum); 8757db4bae483e7268dd7fc5bc42b0e55564014048Alexey Samsonovvoid ReadContextStack(void *context, uptr *stack, uptr *ssize); 8875b19ebf25af204cf209d108997272822241d6daAlexander Potapenkovoid AsanPlatformThreadInit(); 8946efcb09dc16b91cb805abea52f3ff6081a63751Alexey Samsonovvoid StopInitOrderChecking(); 90cc4e6862c6a8f8f3ead96bd32b815184a36fadedKostya Serebryany 91cc4e6862c6a8f8f3ead96bd32b815184a36fadedKostya Serebryany// Wrapper for TLS/TSD. 92f58f998066db0231e521169d2f50af439ceecb49Kostya Serebryanyvoid AsanTSDInit(void (*destructor)(void *tsd)); 93cc4e6862c6a8f8f3ead96bd32b815184a36fadedKostya Serebryanyvoid *AsanTSDGet(); 94cc4e6862c6a8f8f3ead96bd32b815184a36fadedKostya Serebryanyvoid AsanTSDSet(void *tsd); 95e86e35fbe861e73c5991200510a028877427b3e7Sergey Matveevvoid PlatformTSDDtor(void *tsd); 964803ab90ead451b55a5833f0fd38b10fd1fc83ebKostya Serebryany 97e954101f6602ac181a2c3accfbbad0ae51b0bf7cAlexey Samsonovvoid AppendToErrorMessageBuffer(const char *buffer); 981e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid ParseExtraActivationFlags(); 1002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1015d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesvoid *AsanDlSymNext(const char *sym); 1025d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines 1032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// Platform-specific options. 10430e110edf92303237d471f1cb8e3ad07954fb145Evgeniy Stepanov#if SANITIZER_MAC 10538dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonovbool PlatformHasDifferentMemcpyAndMemmove(); 10638dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonov# define PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE \ 10738dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonov (PlatformHasDifferentMemcpyAndMemmove()) 10838dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonov#else 10938dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonov# define PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE true 110649a270f5341efe9c57f473dbb78706b0b2ed523Alexey Samsonov#endif // SANITIZER_MAC 11138dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonov 1126a08d29b2020004b801ca69d8aea5872a7e67d72Alexey Samsonov// Add convenient macro for interface functions that may be represented as 1136a08d29b2020004b801ca69d8aea5872a7e67d72Alexey Samsonov// weak hooks. 1146a08d29b2020004b801ca69d8aea5872a7e67d72Alexey Samsonov#define ASAN_MALLOC_HOOK(ptr, size) \ 1155d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines if (&__asan_malloc_hook) __asan_malloc_hook(ptr, size); \ 1165d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines if (&__sanitizer_malloc_hook) __sanitizer_malloc_hook(ptr, size) 1176a08d29b2020004b801ca69d8aea5872a7e67d72Alexey Samsonov#define ASAN_FREE_HOOK(ptr) \ 1185d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines if (&__asan_free_hook) __asan_free_hook(ptr); \ 1195d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines if (&__sanitizer_free_hook) __sanitizer_free_hook(ptr) 1206a08d29b2020004b801ca69d8aea5872a7e67d72Alexey Samsonov#define ASAN_ON_ERROR() \ 1216a08d29b2020004b801ca69d8aea5872a7e67d72Alexey Samsonov if (&__asan_on_error) __asan_on_error() 1226a08d29b2020004b801ca69d8aea5872a7e67d72Alexey Samsonov 1231e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyextern int asan_inited; 1241e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// Used to avoid infinite recursion in __asan_init(). 1251e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyextern bool asan_init_is_running; 12647657ce6cbac2fa93d0fd765c5d2872443b50e87Alexey Samsonovextern void (*death_callback)(void); 1271e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 1281e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// These magic values are written to shadow for better error reporting. 1291e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanHeapLeftRedzoneMagic = 0xfa; 1301e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanHeapRightRedzoneMagic = 0xfb; 1311e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanHeapFreeMagic = 0xfd; 1321e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanStackLeftRedzoneMagic = 0xf1; 1331e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanStackMidRedzoneMagic = 0xf2; 1341e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanStackRightRedzoneMagic = 0xf3; 1351e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanStackPartialRedzoneMagic = 0xf4; 1361e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanStackAfterReturnMagic = 0xf5; 1373945c58f9db42671b1a3b865fde5008f09a3a40eKostya Serebryanyconst int kAsanInitializationOrderMagic = 0xf6; 1381e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanUserPoisonedMemoryMagic = 0xf7; 1392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesconst int kAsanContiguousContainerOOBMagic = 0xfc; 140d4b5db8cb8a7a13bb5cc1d4ce53e8e088303c854Alexey Samsonovconst int kAsanStackUseAfterScopeMagic = 0xf8; 1411e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanGlobalRedzoneMagic = 0xf9; 1426b30e2cf0d9d471d276f91ef4bb74dbd9876f4d9Kostya Serebryanyconst int kAsanInternalHeapMagic = 0xfe; 1431e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 1443f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryanystatic const uptr kCurrentStackFrameMagic = 0x41B58AB3; 1453f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryanystatic const uptr kRetiredStackFrameMagic = 0x45E0360E; 1461e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 1471e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} // namespace __asan 1481e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 1491e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#endif // ASAN_INTERNAL_H 150