asan_internal.h revision b823e3c5f7891dbbde1eb288237f5f3d5ed64d85
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 176f0452914ec76c786eb865983793bc03b00fc7b6Alexander Potapenko#if !defined(__linux__) && !defined(__APPLE__) && !defined(_WIN32) 18d6567c5166412f6acdde851e767c26f332d51d3dKostya Serebryany# error "This operating system is not supported by AddressSanitizer" 19d6567c5166412f6acdde851e767c26f332d51d3dKostya Serebryany#endif 20d6567c5166412f6acdde851e767c26f332d51d3dKostya Serebryany 21b823e3c5f7891dbbde1eb288237f5f3d5ed64d85Alexey Samsonov#include <stddef.h> // for size_t, uintptr_t, etc. 226f0452914ec76c786eb865983793bc03b00fc7b6Alexander Potapenko 23858220837f85db7eb5eedd5ea68603803b5eb3c9Kostya Serebryany#if defined(_WIN32) 246f0452914ec76c786eb865983793bc03b00fc7b6Alexander Potapenko// There's no <stdint.h> in Visual Studio 9, so we have to define [u]int*_t. 256f0452914ec76c786eb865983793bc03b00fc7b6Alexander Potapenkotypedef unsigned __int8 uint8_t; 266f0452914ec76c786eb865983793bc03b00fc7b6Alexander Potapenkotypedef unsigned __int16 uint16_t; 276f0452914ec76c786eb865983793bc03b00fc7b6Alexander Potapenkotypedef unsigned __int32 uint32_t; 286f0452914ec76c786eb865983793bc03b00fc7b6Alexander Potapenkotypedef unsigned __int64 uint64_t; 296f0452914ec76c786eb865983793bc03b00fc7b6Alexander Potapenkotypedef __int8 int8_t; 306f0452914ec76c786eb865983793bc03b00fc7b6Alexander Potapenkotypedef __int16 int16_t; 316f0452914ec76c786eb865983793bc03b00fc7b6Alexander Potapenkotypedef __int32 int32_t; 326f0452914ec76c786eb865983793bc03b00fc7b6Alexander Potapenkotypedef __int64 int64_t; 33adf2b036127d7e887392d9be5b02069b777ee280Alexey Samsonov 3471d3b398a39663c771918747762142215a1dc87dAlexander Potapenkoextern "C" void* _ReturnAddress(void); 3571d3b398a39663c771918747762142215a1dc87dAlexander Potapenko# pragma intrinsic(_ReturnAddress) 3671d3b398a39663c771918747762142215a1dc87dAlexander Potapenko 37adf2b036127d7e887392d9be5b02069b777ee280Alexey Samsonov# define ALIAS(x) // TODO(timurrrr): do we need this on Windows? 38adf2b036127d7e887392d9be5b02069b777ee280Alexey Samsonov# define ALIGNED(x) __declspec(align(x)) 39adf2b036127d7e887392d9be5b02069b777ee280Alexey Samsonov# define NOINLINE __declspec(noinline) 40adf2b036127d7e887392d9be5b02069b777ee280Alexey Samsonov 41adf2b036127d7e887392d9be5b02069b777ee280Alexey Samsonov# define ASAN_INTERFACE_ATTRIBUTE // TODO(timurrrr): do we need this on Win? 42adf2b036127d7e887392d9be5b02069b777ee280Alexey Samsonov#else // defined(_WIN32) 43858220837f85db7eb5eedd5ea68603803b5eb3c9Kostya Serebryany# include <stdint.h> // for __WORDSIZE 44adf2b036127d7e887392d9be5b02069b777ee280Alexey Samsonov 45adf2b036127d7e887392d9be5b02069b777ee280Alexey Samsonov# define ALIAS(x) __attribute__((alias(x))) 46adf2b036127d7e887392d9be5b02069b777ee280Alexey Samsonov# define ALIGNED(x) __attribute__((aligned(x))) 47adf2b036127d7e887392d9be5b02069b777ee280Alexey Samsonov# define NOINLINE __attribute__((noinline)) 48adf2b036127d7e887392d9be5b02069b777ee280Alexey Samsonov 49adf2b036127d7e887392d9be5b02069b777ee280Alexey Samsonov# define ASAN_INTERFACE_ATTRIBUTE __attribute__((visibility("default"))) 50adf2b036127d7e887392d9be5b02069b777ee280Alexey Samsonov#endif // defined(_WIN32) 511e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 524616633bb9e20f66d83bfac70c9afce1922d1eecDaniel Dunbar// If __WORDSIZE was undefined by the platform, define it in terms of the 53669f543c1400f7a1b9a48313d2f95e54f750bd4bKostya Serebryany// compiler built-ins __LP64__ and _WIN64. 544616633bb9e20f66d83bfac70c9afce1922d1eecDaniel Dunbar#ifndef __WORDSIZE 55669f543c1400f7a1b9a48313d2f95e54f750bd4bKostya Serebryany#if __LP64__ || defined(_WIN64) 564616633bb9e20f66d83bfac70c9afce1922d1eecDaniel Dunbar#define __WORDSIZE 64 574616633bb9e20f66d83bfac70c9afce1922d1eecDaniel Dunbar#else 584616633bb9e20f66d83bfac70c9afce1922d1eecDaniel Dunbar#define __WORDSIZE 32 594616633bb9e20f66d83bfac70c9afce1922d1eecDaniel Dunbar#endif 604616633bb9e20f66d83bfac70c9afce1922d1eecDaniel Dunbar#endif 614616633bb9e20f66d83bfac70c9afce1922d1eecDaniel Dunbar 62e4092f6780e107797bc6f2c77219a7256f7b04f3Alexey Samsonov// Limits for integral types. We have to redefine it in case we don't 63e4092f6780e107797bc6f2c77219a7256f7b04f3Alexey Samsonov// have stdint.h (like in Visual Studio 9). 64e4092f6780e107797bc6f2c77219a7256f7b04f3Alexey Samsonov#if __WORDSIZE == 64 65e4092f6780e107797bc6f2c77219a7256f7b04f3Alexey Samsonov# define __INT64_C(c) c ## L 66e4092f6780e107797bc6f2c77219a7256f7b04f3Alexey Samsonov# define __UINT64_C(c) c ## UL 67e4092f6780e107797bc6f2c77219a7256f7b04f3Alexey Samsonov#else 68e4092f6780e107797bc6f2c77219a7256f7b04f3Alexey Samsonov# define __INT64_C(c) c ## LL 69e4092f6780e107797bc6f2c77219a7256f7b04f3Alexey Samsonov# define __UINT64_C(c) c ## ULL 70e4092f6780e107797bc6f2c77219a7256f7b04f3Alexey Samsonov#endif // __WORDSIZE == 64 71e4092f6780e107797bc6f2c77219a7256f7b04f3Alexey Samsonov# define INT32_MIN (-2147483647-1) 72e4092f6780e107797bc6f2c77219a7256f7b04f3Alexey Samsonov# define INT32_MAX (2147483647) 73e4092f6780e107797bc6f2c77219a7256f7b04f3Alexey Samsonov# define UINT32_MAX (4294967295U) 74e4092f6780e107797bc6f2c77219a7256f7b04f3Alexey Samsonov# define INT64_MIN (-__INT64_C(9223372036854775807)-1) 75e4092f6780e107797bc6f2c77219a7256f7b04f3Alexey Samsonov# define INT64_MAX (__INT64_C(9223372036854775807)) 76e4092f6780e107797bc6f2c77219a7256f7b04f3Alexey Samsonov# define UINT64_MAX (__UINT64_C(18446744073709551615)) 77e4092f6780e107797bc6f2c77219a7256f7b04f3Alexey Samsonov 78b823e3c5f7891dbbde1eb288237f5f3d5ed64d85Alexey Samsonov#define ASAN_DEFAULT_FAILURE_EXITCODE 1 79b823e3c5f7891dbbde1eb288237f5f3d5ed64d85Alexey Samsonov 803e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov#if defined(__linux__) 813e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov# define ASAN_LINUX 1 823e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov#else 833e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov# define ASAN_LINUX 0 843e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov#endif 853e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov 863e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov#if defined(__APPLE__) 873e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov# define ASAN_MAC 1 883e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov#else 893e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov# define ASAN_MAC 0 903e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov#endif 913e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov 923e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov#if defined(_WIN32) 933e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov# define ASAN_WINDOWS 1 943e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov#else 953e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov# define ASAN_WINDOWS 0 963e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov#endif 973e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov 98c8365231004cb1d956aba4164c89ea1398eadd6bAlexander Potapenko#if !defined(__has_feature) 99c8365231004cb1d956aba4164c89ea1398eadd6bAlexander Potapenko#define __has_feature(x) 0 100c8365231004cb1d956aba4164c89ea1398eadd6bAlexander Potapenko#endif 101c8365231004cb1d956aba4164c89ea1398eadd6bAlexander Potapenko 10213ebae606b526399771e9cca1d6a9d24458ad0f1Kostya Serebryany#if defined(__has_feature) && __has_feature(address_sanitizer) 1031e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany# error "The AddressSanitizer run-time should not be" 1041e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany " instrumented by AddressSanitizer" 1051e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#endif 1061e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 107c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany// Build-time configuration options. 108c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany 109c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany// If set, asan will install its own SEGV signal handler. 110c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany#ifndef ASAN_NEEDS_SEGV 111c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany# define ASAN_NEEDS_SEGV 1 112c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany#endif 113c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany 114c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany// If set, asan will intercept C++ exception api call(s). 115c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany#ifndef ASAN_HAS_EXCEPTIONS 116c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany# define ASAN_HAS_EXCEPTIONS 1 117c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany#endif 118c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany 119c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany// If set, asan uses the values of SHADOW_SCALE and SHADOW_OFFSET 120c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany// provided by the instrumented objects. Otherwise constants are used. 121c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany#ifndef ASAN_FLEXIBLE_MAPPING_AND_OFFSET 122c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany# define ASAN_FLEXIBLE_MAPPING_AND_OFFSET 0 123c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany#endif 124c6f2223a8772262e5e682403f2d57f0b465a98fcKostya Serebryany 1251e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// All internal functions in asan reside inside the __asan namespace 1261e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// to avoid namespace collisions with the user programs. 1271e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// Seperate namespace also makes it simpler to distinguish the asan run-time 1281e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// functions from the instrumented user code in a profile. 1291e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanynamespace __asan { 1301e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 1311e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyclass AsanThread; 1321e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanystruct AsanStackTrace; 1331e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 134218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany// asan_rtl.cc 1351e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyvoid CheckFailed(const char *cond, const char *file, int line); 1361e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyvoid ShowStatsAndAbort(); 1371e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 138218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany// asan_globals.cc 1391e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanybool DescribeAddrIfGlobal(uintptr_t addr); 1401e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 141218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany// asan_malloc_linux.cc / asan_malloc_mac.cc 1421e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyvoid ReplaceSystemMalloc(); 1431e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 144de496f451bce322b6cde100456591f1f50ab3477Kostya Serebryanyvoid OutOfMemoryMessageAndDie(const char *mem_type, size_t size); 145de496f451bce322b6cde100456591f1f50ab3477Kostya Serebryany 146f73a6a3f81573ba85a5e29955980818b18b0a58aAlexander Potapenko// asan_linux.cc / asan_mac.cc / asan_win.cc 1471e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyvoid *AsanDoesNotSupportStaticLinkage(); 148f73a6a3f81573ba85a5e29955980818b18b0a58aAlexander Potapenkobool AsanShadowRangeIsAvailable(); 149de496f451bce322b6cde100456591f1f50ab3477Kostya Serebryanyint AsanOpenReadonly(const char* filename); 1501e316d7f488a75312539629e9d937e156280eeb6Alexander Potapenkoconst char *AsanGetEnv(const char *name); 15199d17ebc36fe74326493bdd3dab4082ffc1dc96eAlexander Potapenkovoid AsanDumpProcessMap(); 152de496f451bce322b6cde100456591f1f50ab3477Kostya Serebryany 153a874fe5b5d67152e4e737498d532eec80940bdcdKostya Serebryanyvoid *AsanMmapFixedNoReserve(uintptr_t fixed_addr, size_t size); 154a874fe5b5d67152e4e737498d532eec80940bdcdKostya Serebryanyvoid *AsanMmapFixedReserve(uintptr_t fixed_addr, size_t size); 155a874fe5b5d67152e4e737498d532eec80940bdcdKostya Serebryanyvoid *AsanMprotect(uintptr_t fixed_addr, size_t size); 156de496f451bce322b6cde100456591f1f50ab3477Kostya Serebryanyvoid *AsanMmapSomewhereOrDie(size_t size, const char *where); 157de496f451bce322b6cde100456591f1f50ab3477Kostya Serebryanyvoid AsanUnmapOrDie(void *ptr, size_t size); 158de496f451bce322b6cde100456591f1f50ab3477Kostya Serebryany 159ef14ff6512d7b2e20aa3206dff820b5f90285420Kostya Serebryanyvoid AsanDisableCoreDumper(); 1609107c26bd88fc9cf44a2cd7d6967eb830ac63be3Kostya Serebryanyvoid GetPcSpBp(void *context, uintptr_t *pc, uintptr_t *sp, uintptr_t *bp); 161ef14ff6512d7b2e20aa3206dff820b5f90285420Kostya Serebryany 1620ecf5eb729dd81a43f8585cb438d3cb2a35899edKostya Serebryanysize_t AsanRead(int fd, void *buf, size_t count); 1630ecf5eb729dd81a43f8585cb438d3cb2a35899edKostya Serebryanysize_t AsanWrite(int fd, const void *buf, size_t count); 164de496f451bce322b6cde100456591f1f50ab3477Kostya Serebryanyint AsanClose(int fd); 1651e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 1664803ab90ead451b55a5833f0fd38b10fd1fc83ebKostya Serebryanybool AsanInterceptsSignal(int signum); 167a7e760a53bc43b8e09bfdf5cd6f215267ba99729Kostya Serebryanyvoid InstallSignalHandlers(); 1680ecf5eb729dd81a43f8585cb438d3cb2a35899edKostya Serebryanyint GetPid(); 169cc4e6862c6a8f8f3ead96bd32b815184a36fadedKostya Serebryanyuintptr_t GetThreadSelf(); 170dde7c33df06a9a0a8056f2357d764a10512206eeKostya Serebryanyint AtomicInc(int *a); 171cc4e6862c6a8f8f3ead96bd32b815184a36fadedKostya Serebryany 172cc4e6862c6a8f8f3ead96bd32b815184a36fadedKostya Serebryany// Wrapper for TLS/TSD. 173f58f998066db0231e521169d2f50af439ceecb49Kostya Serebryanyvoid AsanTSDInit(void (*destructor)(void *tsd)); 174cc4e6862c6a8f8f3ead96bd32b815184a36fadedKostya Serebryanyvoid *AsanTSDGet(); 175cc4e6862c6a8f8f3ead96bd32b815184a36fadedKostya Serebryanyvoid AsanTSDSet(void *tsd); 1764803ab90ead451b55a5833f0fd38b10fd1fc83ebKostya Serebryany 177df499b44de81fc757a789878f07fcaf19ebb0016Kostya Serebryany// Opens the file 'file_name" and reads up to 'max_len' bytes. 178df499b44de81fc757a789878f07fcaf19ebb0016Kostya Serebryany// The resulting buffer is mmaped and stored in '*buff'. 179df499b44de81fc757a789878f07fcaf19ebb0016Kostya Serebryany// The size of the mmaped region is stored in '*buff_size', 1800ecf5eb729dd81a43f8585cb438d3cb2a35899edKostya Serebryany// Returns the number of read bytes or 0 if file can not be opened. 1810ecf5eb729dd81a43f8585cb438d3cb2a35899edKostya Serebryanysize_t ReadFileToBuffer(const char *file_name, char **buff, 1820ecf5eb729dd81a43f8585cb438d3cb2a35899edKostya Serebryany size_t *buff_size, size_t max_len); 183df499b44de81fc757a789878f07fcaf19ebb0016Kostya Serebryany 184218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany// asan_printf.cc 1851e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyvoid RawWrite(const char *buffer); 186a0935fa0ef02e47408996c25dac00b5f8a6b1406Alexander Potapenkoint SNPrintf(char *buffer, size_t length, const char *format, ...); 1871e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyvoid Printf(const char *format, ...); 188df499b44de81fc757a789878f07fcaf19ebb0016Kostya Serebryanyint SScanf(const char *str, const char *format, ...); 1891e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyvoid Report(const char *format, ...); 1901e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 1912d8b3bdb112ebb8ed3f15ee41d4cebcd683b41b0Kostya Serebryany// Don't use std::min and std::max, to minimize dependency on libstdc++. 1922d8b3bdb112ebb8ed3f15ee41d4cebcd683b41b0Kostya Serebryanytemplate<class T> T Min(T a, T b) { return a < b ? a : b; } 1932d8b3bdb112ebb8ed3f15ee41d4cebcd683b41b0Kostya Serebryanytemplate<class T> T Max(T a, T b) { return a > b ? a : b; } 1942d8b3bdb112ebb8ed3f15ee41d4cebcd683b41b0Kostya Serebryany 195218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany// asan_poisoning.cc 196218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany// Poisons the shadow memory for "size" bytes starting from "addr". 197218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryanyvoid PoisonShadow(uintptr_t addr, size_t size, uint8_t value); 198218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany// Poisons the shadow memory for "redzone_size" bytes starting from 199218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany// "addr + size". 200218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryanyvoid PoisonShadowPartialRightRedzone(uintptr_t addr, 201218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany uintptr_t size, 202218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany uintptr_t redzone_size, 203218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany uint8_t value); 204218a9b70d7338cf5b727b7dad6b080ad7869c6c2Kostya Serebryany 2051e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyextern size_t FLAG_quarantine_size; 2061e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyextern int FLAG_demangle; 2071e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyextern bool FLAG_symbolize; 2081e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyextern int FLAG_v; 2091e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyextern size_t FLAG_redzone; 2101e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyextern int FLAG_debug; 2111e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyextern bool FLAG_poison_shadow; 2121e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyextern int FLAG_report_globals; 2131e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyextern size_t FLAG_malloc_context_size; 2141e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyextern bool FLAG_replace_str; 2151e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyextern bool FLAG_replace_intrin; 2161e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyextern bool FLAG_replace_cfallocator; 2171e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyextern bool FLAG_fast_unwind; 2181e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyextern bool FLAG_use_fake_stack; 2191e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyextern size_t FLAG_max_malloc_fill_size; 2201e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyextern int FLAG_exitcode; 2211e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyextern bool FLAG_allow_user_poisoning; 222cb00d134727c322e2f26298912f77e10be46aefeKostya Serebryanyextern int FLAG_sleep_before_dying; 2234803ab90ead451b55a5833f0fd38b10fd1fc83ebKostya Serebryanyextern bool FLAG_handle_segv; 2241e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 2251e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyextern int asan_inited; 2261e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// Used to avoid infinite recursion in __asan_init(). 2271e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyextern bool asan_init_is_running; 2281e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 2291e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyenum LinkerInitialized { LINKER_INITIALIZED = 0 }; 2301e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 2310ecf5eb729dd81a43f8585cb438d3cb2a35899edKostya Serebryanyvoid AsanDie(); 232e1fe0fd868886b53cb8d5d957afebbdd47688df7Kostya Serebryanyvoid SleepForSeconds(int seconds); 233e1fe0fd868886b53cb8d5d957afebbdd47688df7Kostya Serebryanyvoid Exit(int exitcode); 234b823e3c5f7891dbbde1eb288237f5f3d5ed64d85Alexey Samsonovint Atexit(void (*function)(void)); 2351e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 2361e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#define CHECK(cond) do { if (!(cond)) { \ 2371e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany CheckFailed(#cond, __FILE__, __LINE__); \ 2381e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany}}while(0) 2391e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 2401e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#define RAW_CHECK_MSG(expr, msg) do { \ 2411e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany if (!(expr)) { \ 2421e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany RawWrite(msg); \ 2430ecf5eb729dd81a43f8585cb438d3cb2a35899edKostya Serebryany AsanDie(); \ 2441e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany } \ 2451e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} while (0) 2461e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 2471e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#define RAW_CHECK(expr) RAW_CHECK_MSG(expr, #expr) 2481e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 2491e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#define UNIMPLEMENTED() CHECK("unimplemented" && 0) 2501e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 2511e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#define ASAN_ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0])) 2521e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 2531e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst size_t kWordSize = __WORDSIZE / 8; 2541e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst size_t kWordSizeInBits = 8 * kWordSize; 2551e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst size_t kPageSizeBits = 12; 2561e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst size_t kPageSize = 1UL << kPageSizeBits; 2571e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 2586f0452914ec76c786eb865983793bc03b00fc7b6Alexander Potapenko#ifndef _WIN32 2593e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanovconst size_t kMmapGranularity = kPageSize; 2601c83ae34f32737a203c66e9d9c419f821a0db02fKostya Serebryany# define GET_CALLER_PC() (uintptr_t)__builtin_return_address(0) 2611c83ae34f32737a203c66e9d9c419f821a0db02fKostya Serebryany# define GET_CURRENT_FRAME() (uintptr_t)__builtin_frame_address(0) 2626f0452914ec76c786eb865983793bc03b00fc7b6Alexander Potapenko#else 2633e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanovconst size_t kMmapGranularity = 1UL << 16; 2641c83ae34f32737a203c66e9d9c419f821a0db02fKostya Serebryany# define GET_CALLER_PC() (uintptr_t)_ReturnAddress() 2651c83ae34f32737a203c66e9d9c419f821a0db02fKostya Serebryany// CaptureStackBackTrace doesn't need to know BP on Windows. 2661c83ae34f32737a203c66e9d9c419f821a0db02fKostya Serebryany// FIXME: This macro is still used when printing error reports though it's not 2671c83ae34f32737a203c66e9d9c419f821a0db02fKostya Serebryany// clear if the BP value is needed in the ASan reports on Windows. 2681c83ae34f32737a203c66e9d9c419f821a0db02fKostya Serebryany# define GET_CURRENT_FRAME() (uintptr_t)0xDEADBEEF 2693e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov 2703e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov# ifndef ASAN_USE_EXTERNAL_SYMBOLIZER 2713e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov# define ASAN_USE_EXTERNAL_SYMBOLIZER __asan::WinSymbolize 2723e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanovbool WinSymbolize(const void *addr, char *out_buffer, int buffer_size); 2733e81fe43798c096d1d3565596f0717b9919de4fbTimur Iskhodzhanov# endif 2746f0452914ec76c786eb865983793bc03b00fc7b6Alexander Potapenko#endif 2751e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 2761e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#define GET_BP_PC_SP \ 2771e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany uintptr_t bp = GET_CURRENT_FRAME(); \ 2781e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany uintptr_t pc = GET_CALLER_PC(); \ 2791e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany uintptr_t local_stack; \ 2801e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany uintptr_t sp = (uintptr_t)&local_stack; 2811e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 2821e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// These magic values are written to shadow for better error reporting. 2831e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanHeapLeftRedzoneMagic = 0xfa; 2841e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanHeapRightRedzoneMagic = 0xfb; 2851e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanHeapFreeMagic = 0xfd; 2861e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanStackLeftRedzoneMagic = 0xf1; 2871e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanStackMidRedzoneMagic = 0xf2; 2881e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanStackRightRedzoneMagic = 0xf3; 2891e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanStackPartialRedzoneMagic = 0xf4; 2901e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanStackAfterReturnMagic = 0xf5; 2911e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanUserPoisonedMemoryMagic = 0xf7; 2921e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyconst int kAsanGlobalRedzoneMagic = 0xf9; 2936b30e2cf0d9d471d276f91ef4bb74dbd9876f4d9Kostya Serebryanyconst int kAsanInternalHeapMagic = 0xfe; 2941e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 2951e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanystatic const uintptr_t kCurrentStackFrameMagic = 0x41B58AB3; 2961e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanystatic const uintptr_t kRetiredStackFrameMagic = 0x45E0360E; 2971e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 298de496f451bce322b6cde100456591f1f50ab3477Kostya Serebryany// --------------------------- Bit twiddling ------- {{{1 299de496f451bce322b6cde100456591f1f50ab3477Kostya Serebryanyinline bool IsPowerOfTwo(size_t x) { 300de496f451bce322b6cde100456591f1f50ab3477Kostya Serebryany return (x & (x - 1)) == 0; 301de496f451bce322b6cde100456591f1f50ab3477Kostya Serebryany} 302de496f451bce322b6cde100456591f1f50ab3477Kostya Serebryany 303de496f451bce322b6cde100456591f1f50ab3477Kostya Serebryanyinline size_t RoundUpTo(size_t size, size_t boundary) { 304de496f451bce322b6cde100456591f1f50ab3477Kostya Serebryany CHECK(IsPowerOfTwo(boundary)); 305de496f451bce322b6cde100456591f1f50ab3477Kostya Serebryany return (size + boundary - 1) & ~(boundary - 1); 306de496f451bce322b6cde100456591f1f50ab3477Kostya Serebryany} 307de496f451bce322b6cde100456591f1f50ab3477Kostya Serebryany 308b89567ce41bef82cf92a9c741c78b632c07b2781Kostya Serebryany// -------------------------- LowLevelAllocator ----- {{{1 309b89567ce41bef82cf92a9c741c78b632c07b2781Kostya Serebryany// A simple low-level memory allocator for internal use. 310b89567ce41bef82cf92a9c741c78b632c07b2781Kostya Serebryanyclass LowLevelAllocator { 311b89567ce41bef82cf92a9c741c78b632c07b2781Kostya Serebryany public: 312b89567ce41bef82cf92a9c741c78b632c07b2781Kostya Serebryany explicit LowLevelAllocator(LinkerInitialized) {} 313b89567ce41bef82cf92a9c741c78b632c07b2781Kostya Serebryany // 'size' must be a power of two. 314b89567ce41bef82cf92a9c741c78b632c07b2781Kostya Serebryany // Requires an external lock. 315b89567ce41bef82cf92a9c741c78b632c07b2781Kostya Serebryany void *Allocate(size_t size); 316b89567ce41bef82cf92a9c741c78b632c07b2781Kostya Serebryany private: 317b89567ce41bef82cf92a9c741c78b632c07b2781Kostya Serebryany char *allocated_end_; 318b89567ce41bef82cf92a9c741c78b632c07b2781Kostya Serebryany char *allocated_current_; 319b89567ce41bef82cf92a9c741c78b632c07b2781Kostya Serebryany}; 320b89567ce41bef82cf92a9c741c78b632c07b2781Kostya Serebryany 3211e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} // namespace __asan 3221e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 3231e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#endif // ASAN_INTERNAL_H 324