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