(root)/
gcc-13.2.0/
libsanitizer/
asan/
asan_internal.h
       1  //===-- asan_internal.h -----------------------------------------*- C++ -*-===//
       2  //
       3  // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
       4  // See https://llvm.org/LICENSE.txt for license information.
       5  // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
       6  //
       7  //===----------------------------------------------------------------------===//
       8  //
       9  // This file is a part of AddressSanitizer, an address sanity checker.
      10  //
      11  // ASan-private header which defines various general utilities.
      12  //===----------------------------------------------------------------------===//
      13  #ifndef ASAN_INTERNAL_H
      14  #define ASAN_INTERNAL_H
      15  
      16  #include "asan_flags.h"
      17  #include "asan_interface_internal.h"
      18  #include "sanitizer_common/sanitizer_common.h"
      19  #include "sanitizer_common/sanitizer_internal_defs.h"
      20  #include "sanitizer_common/sanitizer_libc.h"
      21  #include "sanitizer_common/sanitizer_stacktrace.h"
      22  
      23  #if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__)
      24  #  error \
      25        "The AddressSanitizer run-time should not be instrumented by AddressSanitizer"
      26  #endif
      27  
      28  // Build-time configuration options.
      29  
      30  // If set, asan will intercept C++ exception api call(s).
      31  #ifndef ASAN_HAS_EXCEPTIONS
      32  #  define ASAN_HAS_EXCEPTIONS 1
      33  #endif
      34  
      35  // If set, values like allocator chunk size, as well as defaults for some flags
      36  // will be changed towards less memory overhead.
      37  #ifndef ASAN_LOW_MEMORY
      38  #  if SANITIZER_IOS || SANITIZER_ANDROID
      39  #    define ASAN_LOW_MEMORY 1
      40  #  else
      41  #    define ASAN_LOW_MEMORY 0
      42  #  endif
      43  #endif
      44  
      45  #ifndef ASAN_DYNAMIC
      46  #  ifdef PIC
      47  #    define ASAN_DYNAMIC 1
      48  #  else
      49  #    define ASAN_DYNAMIC 0
      50  #  endif
      51  #endif
      52  
      53  // All internal functions in asan reside inside the __asan namespace
      54  // to avoid namespace collisions with the user programs.
      55  // Separate namespace also makes it simpler to distinguish the asan run-time
      56  // functions from the instrumented user code in a profile.
      57  namespace __asan {
      58  
      59  class AsanThread;
      60  using __sanitizer::StackTrace;
      61  
      62  void AsanInitFromRtl();
      63  
      64  // asan_win.cpp
      65  void InitializePlatformExceptionHandlers();
      66  // Returns whether an address is a valid allocated system heap block.
      67  // 'addr' must point to the beginning of the block.
      68  bool IsSystemHeapAddress(uptr addr);
      69  
      70  // asan_rtl.cpp
      71  void PrintAddressSpaceLayout();
      72  void NORETURN ShowStatsAndAbort();
      73  
      74  // asan_shadow_setup.cpp
      75  void InitializeShadowMemory();
      76  
      77  // asan_malloc_linux.cpp / asan_malloc_mac.cpp
      78  void ReplaceSystemMalloc();
      79  
      80  // asan_linux.cpp / asan_mac.cpp / asan_win.cpp
      81  uptr FindDynamicShadowStart();
      82  void *AsanDoesNotSupportStaticLinkage();
      83  void AsanCheckDynamicRTPrereqs();
      84  void AsanCheckIncompatibleRT();
      85  
      86  // Unpoisons platform-specific stacks.
      87  // Returns true if all stacks have been unpoisoned.
      88  bool PlatformUnpoisonStacks();
      89  
      90  // asan_rtl.cpp
      91  // Unpoison a region containing a stack.
      92  // Performs a sanity check and warns if the bounds don't look right.
      93  // The warning contains the type string to identify the stack type.
      94  void UnpoisonStack(uptr bottom, uptr top, const char *type);
      95  
      96  // asan_thread.cpp
      97  AsanThread *CreateMainThread();
      98  
      99  // Support function for __asan_(un)register_image_globals. Searches for the
     100  // loaded image containing `needle' and then enumerates all global metadata
     101  // structures declared in that image, applying `op' (e.g.,
     102  // __asan_(un)register_globals) to them.
     103  typedef void (*globals_op_fptr)(__asan_global *, uptr);
     104  void AsanApplyToGlobals(globals_op_fptr op, const void *needle);
     105  
     106  void AsanOnDeadlySignal(int, void *siginfo, void *context);
     107  
     108  void ReadContextStack(void *context, uptr *stack, uptr *ssize);
     109  void ResetContextStack(void *context);
     110  void StopInitOrderChecking();
     111  
     112  // Wrapper for TLS/TSD.
     113  void AsanTSDInit(void (*destructor)(void *tsd));
     114  void *AsanTSDGet();
     115  void AsanTSDSet(void *tsd);
     116  void PlatformTSDDtor(void *tsd);
     117  
     118  void AppendToErrorMessageBuffer(const char *buffer);
     119  
     120  void *AsanDlSymNext(const char *sym);
     121  
     122  // Returns `true` iff most of ASan init process should be skipped due to the
     123  // ASan library being loaded via `dlopen()`. Platforms may perform any
     124  // `dlopen()` specific initialization inside this function.
     125  bool HandleDlopenInit();
     126  
     127  void InstallAtExitCheckLeaks();
     128  
     129  #define ASAN_ON_ERROR() \
     130    if (&__asan_on_error) \
     131    __asan_on_error()
     132  
     133  extern int asan_inited;
     134  // Used to avoid infinite recursion in __asan_init().
     135  extern bool asan_init_is_running;
     136  extern bool replace_intrin_cached;
     137  extern void (*death_callback)(void);
     138  // These magic values are written to shadow for better error
     139  // reporting.
     140  const int kAsanHeapLeftRedzoneMagic = 0xfa;
     141  const int kAsanHeapFreeMagic = 0xfd;
     142  const int kAsanStackLeftRedzoneMagic = 0xf1;
     143  const int kAsanStackMidRedzoneMagic = 0xf2;
     144  const int kAsanStackRightRedzoneMagic = 0xf3;
     145  const int kAsanStackAfterReturnMagic = 0xf5;
     146  const int kAsanInitializationOrderMagic = 0xf6;
     147  const int kAsanUserPoisonedMemoryMagic = 0xf7;
     148  const int kAsanContiguousContainerOOBMagic = 0xfc;
     149  const int kAsanStackUseAfterScopeMagic = 0xf8;
     150  const int kAsanGlobalRedzoneMagic = 0xf9;
     151  const int kAsanInternalHeapMagic = 0xfe;
     152  const int kAsanArrayCookieMagic = 0xac;
     153  const int kAsanIntraObjectRedzone = 0xbb;
     154  const int kAsanAllocaLeftMagic = 0xca;
     155  const int kAsanAllocaRightMagic = 0xcb;
     156  
     157  static const uptr kCurrentStackFrameMagic = 0x41B58AB3;
     158  static const uptr kRetiredStackFrameMagic = 0x45E0360E;
     159  
     160  }  // namespace __asan
     161  
     162  #endif  // ASAN_INTERNAL_H