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