| //===-- asan_internal.h -----------------------------------------*- C++ -*-===// | 
 | // | 
 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
 | // See https://llvm.org/LICENSE.txt for license information. | 
 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 | // | 
 | // This file is a part of AddressSanitizer, an address sanity checker. | 
 | // | 
 | // ASan-private header which defines various general utilities. | 
 | //===----------------------------------------------------------------------===// | 
 | #ifndef ASAN_INTERNAL_H | 
 | #define ASAN_INTERNAL_H | 
 |  | 
 | #include "asan_flags.h" | 
 | #include "asan_interface_internal.h" | 
 | #include "sanitizer_common/sanitizer_common.h" | 
 | #include "sanitizer_common/sanitizer_internal_defs.h" | 
 | #include "sanitizer_common/sanitizer_stacktrace.h" | 
 | #include "sanitizer_common/sanitizer_libc.h" | 
 |  | 
 | #if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__) | 
 | # error "The AddressSanitizer run-time should not be" | 
 |         " instrumented by AddressSanitizer" | 
 | #endif | 
 |  | 
 | // Build-time configuration options. | 
 |  | 
 | // If set, asan will intercept C++ exception api call(s). | 
 | #ifndef ASAN_HAS_EXCEPTIONS | 
 | # define ASAN_HAS_EXCEPTIONS 1 | 
 | #endif | 
 |  | 
 | // If set, values like allocator chunk size, as well as defaults for some flags | 
 | // will be changed towards less memory overhead. | 
 | #ifndef ASAN_LOW_MEMORY | 
 | # if SANITIZER_IOS || SANITIZER_ANDROID || SANITIZER_RTEMS | 
 | #  define ASAN_LOW_MEMORY 1 | 
 | # else | 
 | #  define ASAN_LOW_MEMORY 0 | 
 | # endif | 
 | #endif | 
 |  | 
 | #ifndef ASAN_DYNAMIC | 
 | # ifdef PIC | 
 | #  define ASAN_DYNAMIC 1 | 
 | # else | 
 | #  define ASAN_DYNAMIC 0 | 
 | # endif | 
 | #endif | 
 |  | 
 | // All internal functions in asan reside inside the __asan namespace | 
 | // to avoid namespace collisions with the user programs. | 
 | // Separate namespace also makes it simpler to distinguish the asan run-time | 
 | // functions from the instrumented user code in a profile. | 
 | namespace __asan { | 
 |  | 
 | class AsanThread; | 
 | using __sanitizer::StackTrace; | 
 |  | 
 | void AsanInitFromRtl(); | 
 |  | 
 | // asan_win.cpp | 
 | void InitializePlatformExceptionHandlers(); | 
 | // Returns whether an address is a valid allocated system heap block. | 
 | // 'addr' must point to the beginning of the block. | 
 | bool IsSystemHeapAddress(uptr addr); | 
 |  | 
 | // asan_rtl.cpp | 
 | void PrintAddressSpaceLayout(); | 
 | void NORETURN ShowStatsAndAbort(); | 
 |  | 
 | // asan_shadow_setup.cpp | 
 | void InitializeShadowMemory(); | 
 |  | 
 | // asan_malloc_linux.cpp / asan_malloc_mac.cpp | 
 | void ReplaceSystemMalloc(); | 
 |  | 
 | // asan_linux.cpp / asan_mac.cpp / asan_rtems.cpp / asan_win.cpp | 
 | uptr FindDynamicShadowStart(); | 
 | void *AsanDoesNotSupportStaticLinkage(); | 
 | void AsanCheckDynamicRTPrereqs(); | 
 | void AsanCheckIncompatibleRT(); | 
 |  | 
 | // Unpoisons platform-specific stacks. | 
 | // Returns true if all stacks have been unpoisoned. | 
 | bool PlatformUnpoisonStacks(); | 
 |  | 
 | // asan_rtl.cpp | 
 | // Unpoison a region containing a stack. | 
 | // Performs a sanity check and warns if the bounds don't look right. | 
 | // The warning contains the type string to identify the stack type. | 
 | void UnpoisonStack(uptr bottom, uptr top, const char *type); | 
 |  | 
 | // asan_thread.cpp | 
 | AsanThread *CreateMainThread(); | 
 |  | 
 | // Support function for __asan_(un)register_image_globals. Searches for the | 
 | // loaded image containing `needle' and then enumerates all global metadata | 
 | // structures declared in that image, applying `op' (e.g., | 
 | // __asan_(un)register_globals) to them. | 
 | typedef void (*globals_op_fptr)(__asan_global *, uptr); | 
 | void AsanApplyToGlobals(globals_op_fptr op, const void *needle); | 
 |  | 
 | void AsanOnDeadlySignal(int, void *siginfo, void *context); | 
 |  | 
 | void ReadContextStack(void *context, uptr *stack, uptr *ssize); | 
 | void StopInitOrderChecking(); | 
 |  | 
 | // Wrapper for TLS/TSD. | 
 | void AsanTSDInit(void (*destructor)(void *tsd)); | 
 | void *AsanTSDGet(); | 
 | void AsanTSDSet(void *tsd); | 
 | void PlatformTSDDtor(void *tsd); | 
 |  | 
 | void AppendToErrorMessageBuffer(const char *buffer); | 
 |  | 
 | void *AsanDlSymNext(const char *sym); | 
 |  | 
 | // Returns `true` iff most of ASan init process should be skipped due to the | 
 | // ASan library being loaded via `dlopen()`. Platforms may perform any | 
 | // `dlopen()` specific initialization inside this function. | 
 | bool HandleDlopenInit(); | 
 |  | 
 | // Add convenient macro for interface functions that may be represented as | 
 | // weak hooks. | 
 | #define ASAN_MALLOC_HOOK(ptr, size)                                   \ | 
 |   do {                                                                \ | 
 |     if (&__sanitizer_malloc_hook) __sanitizer_malloc_hook(ptr, size); \ | 
 |     RunMallocHooks(ptr, size);                                        \ | 
 |   } while (false) | 
 | #define ASAN_FREE_HOOK(ptr)                                 \ | 
 |   do {                                                      \ | 
 |     if (&__sanitizer_free_hook) __sanitizer_free_hook(ptr); \ | 
 |     RunFreeHooks(ptr);                                      \ | 
 |   } while (false) | 
 | #define ASAN_ON_ERROR() \ | 
 |   if (&__asan_on_error) __asan_on_error() | 
 |  | 
 | extern int asan_inited; | 
 | // Used to avoid infinite recursion in __asan_init(). | 
 | extern bool asan_init_is_running; | 
 | extern void (*death_callback)(void); | 
 | // These magic values are written to shadow for better error reporting. | 
 | const int kAsanHeapLeftRedzoneMagic = 0xfa; | 
 | const int kAsanHeapFreeMagic = 0xfd; | 
 | const int kAsanStackLeftRedzoneMagic = 0xf1; | 
 | const int kAsanStackMidRedzoneMagic = 0xf2; | 
 | const int kAsanStackRightRedzoneMagic = 0xf3; | 
 | const int kAsanStackAfterReturnMagic = 0xf5; | 
 | const int kAsanInitializationOrderMagic = 0xf6; | 
 | const int kAsanUserPoisonedMemoryMagic = 0xf7; | 
 | const int kAsanContiguousContainerOOBMagic = 0xfc; | 
 | const int kAsanStackUseAfterScopeMagic = 0xf8; | 
 | const int kAsanGlobalRedzoneMagic = 0xf9; | 
 | const int kAsanInternalHeapMagic = 0xfe; | 
 | const int kAsanArrayCookieMagic = 0xac; | 
 | const int kAsanIntraObjectRedzone = 0xbb; | 
 | const int kAsanAllocaLeftMagic = 0xca; | 
 | const int kAsanAllocaRightMagic = 0xcb; | 
 | // Used to populate the shadow gap for systems without memory | 
 | // protection there (i.e. Myriad). | 
 | const int kAsanShadowGap = 0xcc; | 
 |  | 
 | static const uptr kCurrentStackFrameMagic = 0x41B58AB3; | 
 | static const uptr kRetiredStackFrameMagic = 0x45E0360E; | 
 |  | 
 | }  // namespace __asan | 
 |  | 
 | #endif  // ASAN_INTERNAL_H |