asan_internal.h revision 3891ce634380845d337cd865e559f4abbdc8ebdb
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"
2016e0075746b21ed866ec3be21ef0d1e46f0efed5Kostya Serebryany#include "sanitizer_common/sanitizer_libc.h"
21b3cedf98a3c8545da2234c2d35cb5d687984035fKostya Serebryany
226f0452914ec76c786eb865983793bc03b00fc7b6Alexander Potapenko#if !defined(__linux__) && !defined(__APPLE__) && !defined(_WIN32)
23d6567c5166412f6acdde851e767c26f332d51d3dKostya Serebryany# error "This operating system is not supported by AddressSanitizer"
24d6567c5166412f6acdde851e767c26f332d51d3dKostya Serebryany#endif
25d6567c5166412f6acdde851e767c26f332d51d3dKostya Serebryany
26858220837f85db7eb5eedd5ea68603803b5eb3c9Kostya Serebryany#if defined(_WIN32)
2771d3b398a39663c771918747762142215a1dc87dAlexander Potapenkoextern "C" void* _ReturnAddress(void);
2871d3b398a39663c771918747762142215a1dc87dAlexander Potapenko# pragma intrinsic(_ReturnAddress)
29adf2b036127d7e887392d9be5b02069b777ee280Alexey Samsonov#endif  // defined(_WIN32)
301e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany
31b823e3c5f7891dbbde1eb288237f5f3d5ed64d85Alexey Samsonov#define ASAN_DEFAULT_FAILURE_EXITCODE 1
32b823e3c5f7891dbbde1eb288237f5f3d5ed64d85Alexey Samsonov
333e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov#if defined(__linux__)
343e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov# define ASAN_LINUX   1
353e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov#else
363e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov# define ASAN_LINUX   0
373e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov#endif
383e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov
393e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov#if defined(__APPLE__)
403e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov# define ASAN_MAC     1
413e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov#else
423e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov# define ASAN_MAC     0
433e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov#endif
443e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov
453e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov#if defined(_WIN32)
463e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov# define ASAN_WINDOWS 1
473e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov#else
483e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov# define ASAN_WINDOWS 0
493e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov#endif
503e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov
513891ce634380845d337cd865e559f4abbdc8ebdbEvgeniy Stepanov#if defined(__ANDROID__) || defined(ANDROID)
523891ce634380845d337cd865e559f4abbdc8ebdbEvgeniy Stepanov# define ASAN_ANDROID 1
533891ce634380845d337cd865e559f4abbdc8ebdbEvgeniy Stepanov#else
543891ce634380845d337cd865e559f4abbdc8ebdbEvgeniy Stepanov# define ASAN_ANDROID 0
553891ce634380845d337cd865e559f4abbdc8ebdbEvgeniy Stepanov#endif
563891ce634380845d337cd865e559f4abbdc8ebdbEvgeniy Stepanov
573891ce634380845d337cd865e559f4abbdc8ebdbEvgeniy Stepanov
5834a3202a2c22816a6da66959e266a2d078ded37bAlexey Samsonov#define ASAN_POSIX (ASAN_LINUX || ASAN_MAC)
5934a3202a2c22816a6da66959e266a2d078ded37bAlexey Samsonov
60850a49ecb344a71d62347bbee8042ae13b624033Kostya Serebryany#if __has_feature(address_sanitizer)
611e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany# error "The AddressSanitizer run-time should not be"
621e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany        " instrumented by AddressSanitizer"
631e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#endif
641e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany
65c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany// Build-time configuration options.
66c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany
67c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany// If set, asan will install its own SEGV signal handler.
68c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany#ifndef ASAN_NEEDS_SEGV
69c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany# define ASAN_NEEDS_SEGV 1
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
868ae44ac678644265ba82a1b5696a402c9301a85cEvgeniy Stepanov# define ASAN_LOW_MEMORY 0
878ae44ac678644265ba82a1b5696a402c9301a85cEvgeniy Stepanov#endif
888ae44ac678644265ba82a1b5696a402c9301a85cEvgeniy Stepanov
891e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// All internal functions in asan reside inside the __asan namespace
901e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// to avoid namespace collisions with the user programs.
911e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// Seperate namespace also makes it simpler to distinguish the asan run-time
921e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// functions from the instrumented user code in a profile.
931e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanynamespace __asan {
941e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany
951e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyclass AsanThread;
961e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanystruct AsanStackTrace;
971e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany
98218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany// asan_rtl.cc
99b55c88d6d21c862261f267c5199e3aacc0cd30ebTimur Iskhodzhanovvoid NORETURN ShowStatsAndAbort();
1001e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany
1014d5f98df886051afeece1698d4bc8f154391c22dAlexey Samsonovvoid ReplaceOperatorsNewAndDelete();
102218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany// asan_malloc_linux.cc / asan_malloc_mac.cc
1031e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyvoid ReplaceSystemMalloc();
1041e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany
105f73a6a3f81573ba85a5e29955980818b18b0a58aAlexander Potapenko// asan_linux.cc / asan_mac.cc / asan_win.cc
1061e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyvoid *AsanDoesNotSupportStaticLinkage();
107de496f451bce322b6cde100456591f1f50ab3477Kostya Serebryany
1083f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryanyvoid GetPcSpBp(void *context, uptr *pc, uptr *sp, uptr *bp);
109ef14ff6512d7b2e20aa3206dff820b5f90285420Kostya Serebryany
110eb8c46e419f4c6f01d1b1a0d1b96cc51a61ecbc3Alexander Potapenkovoid MaybeReexec();
1114803ab90ead451b55a5833f0fd38b10fd1fc83ebKostya Serebryanybool AsanInterceptsSignal(int signum);
112f03d8afc8b8dd072c4e2884a7475ee28ac5f3f41Alexander Potapenkovoid SetAlternateSignalStack();
113f03d8afc8b8dd072c4e2884a7475ee28ac5f3f41Alexander Potapenkovoid UnsetAlternateSignalStack();
114a7e760a53bc43b8e09bfdf5cd6f215267ba99729Kostya Serebryanyvoid InstallSignalHandlers();
11575b19ebf25af204cf209d108997272822241d6daAlexander Potapenkovoid AsanPlatformThreadInit();
116cc4e6862c6a8f8f3ead96bd32b815184a36fadedKostya Serebryany
117cc4e6862c6a8f8f3ead96bd32b815184a36fadedKostya Serebryany// Wrapper for TLS/TSD.
118f58f998066db0231e521169d2f50af439ceecb49Kostya Serebryanyvoid AsanTSDInit(void (*destructor)(void *tsd));
119cc4e6862c6a8f8f3ead96bd32b815184a36fadedKostya Serebryanyvoid *AsanTSDGet();
120cc4e6862c6a8f8f3ead96bd32b815184a36fadedKostya Serebryanyvoid AsanTSDSet(void *tsd);
1214803ab90ead451b55a5833f0fd38b10fd1fc83ebKostya Serebryany
122e954101f6602ac181a2c3accfbbad0ae51b0bf7cAlexey Samsonovvoid AppendToErrorMessageBuffer(const char *buffer);
123218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany// asan_printf.cc
1247fdcdf5a3a7090ec86d426a815bb42f3d35adf13Alexey Samsonovvoid AsanPrintf(const char *format, ...);
1257fdcdf5a3a7090ec86d426a815bb42f3d35adf13Alexey Samsonovvoid AsanReport(const char *format, ...);
1261e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany
127218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany// asan_poisoning.cc
128218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany// Poisons the shadow memory for "size" bytes starting from "addr".
129ee3925515e4c7966f3ef489f687aa7e5692806a9Kostya Serebryanyvoid PoisonShadow(uptr addr, uptr size, u8 value);
130218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany// Poisons the shadow memory for "redzone_size" bytes starting from
131218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany// "addr + size".
1323f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryanyvoid PoisonShadowPartialRightRedzone(uptr addr,
1333f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany                                     uptr size,
1343f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany                                     uptr redzone_size,
135ee3925515e4c7966f3ef489f687aa7e5692806a9Kostya Serebryany                                     u8 value);
136218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany
13738dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonov// Platfrom-specific options.
13838dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonov#ifdef __APPLE__
13938dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonovbool PlatformHasDifferentMemcpyAndMemmove();
14038dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonov# define PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE \
14138dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonov    (PlatformHasDifferentMemcpyAndMemmove())
14238dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonov#else
14338dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonov# define PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE true
14438dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonov#endif  // __APPLE__
14538dd4ed885e714c376466f6fe0d69f5f22d37014Alexey Samsonov
1461e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyextern int asan_inited;
1471e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// Used to avoid infinite recursion in __asan_init().
1481e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyextern bool asan_init_is_running;
14947657ce6cbac2fa93d0fd765c5d2872443b50e87Alexey Samsonovextern void (*death_callback)(void);
1501e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany
1511e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#define ASAN_ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0]))
1521e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany
1538c505efd769a21eac7de53bc104757245af6ed4aTimur Iskhodzhanov#if !defined(_WIN32) || defined(__clang__)
1543f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany# define GET_CALLER_PC() (uptr)__builtin_return_address(0)
1553f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany# define GET_CURRENT_FRAME() (uptr)__builtin_frame_address(0)
1566f0452914ec76c786eb865983793bc03b00fc7b6Alexander Potapenko#else
1573f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany# define GET_CALLER_PC() (uptr)_ReturnAddress()
1581c83ae34f32737a203c66e9d9c419f821a0db02fKostya Serebryany// CaptureStackBackTrace doesn't need to know BP on Windows.
1591c83ae34f32737a203c66e9d9c419f821a0db02fKostya Serebryany// FIXME: This macro is still used when printing error reports though it's not
1601c83ae34f32737a203c66e9d9c419f821a0db02fKostya Serebryany// clear if the BP value is needed in the ASan reports on Windows.
1613f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany# define GET_CURRENT_FRAME() (uptr)0xDEADBEEF
1628c505efd769a21eac7de53bc104757245af6ed4aTimur Iskhodzhanov#endif
1638c505efd769a21eac7de53bc104757245af6ed4aTimur Iskhodzhanov
164dd3a911e46b3f0416d60d9be5c84ccfc4b1c3aa8Alexey Samsonov#ifdef _WIN32
165c93d3e2bdfb1ad9cce26a6e8d66764ed97a6d6b4Alexey Samsonovbool WinSymbolize(const void *addr, char *out_buffer, int buffer_size);
166dd3a911e46b3f0416d60d9be5c84ccfc4b1c3aa8Alexey Samsonov#endif  // _WIN32
167600972e3427173cc8904d741decd1af0ed5de9fdTimur Iskhodzhanov
1681e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// These magic values are written to shadow for better error reporting.
1691e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanHeapLeftRedzoneMagic = 0xfa;
1701e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanHeapRightRedzoneMagic = 0xfb;
1711e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanHeapFreeMagic = 0xfd;
1721e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanStackLeftRedzoneMagic = 0xf1;
1731e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanStackMidRedzoneMagic = 0xf2;
1741e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanStackRightRedzoneMagic = 0xf3;
1751e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanStackPartialRedzoneMagic = 0xf4;
1761e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanStackAfterReturnMagic = 0xf5;
1773945c58f9db42671b1a3b865fde5008f09a3a40eKostya Serebryanyconst int kAsanInitializationOrderMagic = 0xf6;
1781e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanUserPoisonedMemoryMagic = 0xf7;
1791e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanGlobalRedzoneMagic = 0xf9;
1806b30e2cf0d9d471d276f91ef4bb74dbd9876f4d9Kostya Serebryanyconst int kAsanInternalHeapMagic = 0xfe;
1811e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany
1823f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryanystatic const uptr kCurrentStackFrameMagic = 0x41B58AB3;
1833f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryanystatic const uptr kRetiredStackFrameMagic = 0x45E0360E;
1841e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany
1851e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany}  // namespace __asan
1861e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany
1871e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#endif  // ASAN_INTERNAL_H
188