(root)/
gcc-13.2.0/
libsanitizer/
asan/
asan_interface_internal.h
       1  //===-- asan_interface_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  // This header declares the AddressSanitizer runtime interface functions.
      12  // The runtime library has to define these functions so the instrumented program
      13  // could call them.
      14  //
      15  // See also include/sanitizer/asan_interface.h
      16  //===----------------------------------------------------------------------===//
      17  #ifndef ASAN_INTERFACE_INTERNAL_H
      18  #define ASAN_INTERFACE_INTERNAL_H
      19  
      20  #include "sanitizer_common/sanitizer_internal_defs.h"
      21  
      22  #include "asan_init_version.h"
      23  
      24  using __sanitizer::uptr;
      25  using __sanitizer::u64;
      26  using __sanitizer::u32;
      27  
      28  extern "C" {
      29    // This function should be called at the very beginning of the process,
      30    // before any instrumented code is executed and before any call to malloc.
      31    SANITIZER_INTERFACE_ATTRIBUTE void __asan_init();
      32  
      33    // This function exists purely to get a linker/loader error when using
      34    // incompatible versions of instrumentation and runtime library. Please note
      35    // that __asan_version_mismatch_check is a macro that is replaced with
      36    // __asan_version_mismatch_check_vXXX at compile-time.
      37    SANITIZER_INTERFACE_ATTRIBUTE void __asan_version_mismatch_check();
      38  
      39    // This structure is used to describe the source location of a place where
      40    // global was defined.
      41    struct __asan_global_source_location {
      42      const char *filename;
      43      int line_no;
      44      int column_no;
      45    };
      46  
      47    // This structure describes an instrumented global variable.
      48    struct __asan_global {
      49      uptr beg;                // The address of the global.
      50      uptr size;               // The original size of the global.
      51      uptr size_with_redzone;  // The size with the redzone.
      52      const char *name;        // Name as a C string.
      53      const char *module_name; // Module name as a C string. This pointer is a
      54                               // unique identifier of a module.
      55      uptr has_dynamic_init;   // Non-zero if the global has dynamic initializer.
      56      __asan_global_source_location *gcc_location;  // Source location of a global,
      57                                                    // used by GCC compiler. LLVM uses
      58                                                    // llvm-symbolizer that relies
      59                                                    // on DWARF debugging info.
      60      uptr odr_indicator;      // The address of the ODR indicator symbol.
      61    };
      62  
      63    // These functions can be called on some platforms to find globals in the same
      64    // loaded image as `flag' and apply __asan_(un)register_globals to them,
      65    // filtering out redundant calls.
      66    SANITIZER_INTERFACE_ATTRIBUTE
      67    void __asan_register_image_globals(uptr *flag);
      68    SANITIZER_INTERFACE_ATTRIBUTE
      69    void __asan_unregister_image_globals(uptr *flag);
      70  
      71    SANITIZER_INTERFACE_ATTRIBUTE
      72    void __asan_register_elf_globals(uptr *flag, void *start, void *stop);
      73    SANITIZER_INTERFACE_ATTRIBUTE
      74    void __asan_unregister_elf_globals(uptr *flag, void *start, void *stop);
      75  
      76    // These two functions should be called by the instrumented code.
      77    // 'globals' is an array of structures describing 'n' globals.
      78    SANITIZER_INTERFACE_ATTRIBUTE
      79    void __asan_register_globals(__asan_global *globals, uptr n);
      80    SANITIZER_INTERFACE_ATTRIBUTE
      81    void __asan_unregister_globals(__asan_global *globals, uptr n);
      82  
      83    // These two functions should be called before and after dynamic initializers
      84    // of a single module run, respectively.
      85    SANITIZER_INTERFACE_ATTRIBUTE
      86    void __asan_before_dynamic_init(const char *module_name);
      87    SANITIZER_INTERFACE_ATTRIBUTE
      88    void __asan_after_dynamic_init();
      89  
      90    // Sets bytes of the given range of the shadow memory into specific value.
      91    SANITIZER_INTERFACE_ATTRIBUTE
      92    void __asan_set_shadow_00(uptr addr, uptr size);
      93    SANITIZER_INTERFACE_ATTRIBUTE
      94    void __asan_set_shadow_01(uptr addr, uptr size);
      95    SANITIZER_INTERFACE_ATTRIBUTE
      96    void __asan_set_shadow_02(uptr addr, uptr size);
      97    SANITIZER_INTERFACE_ATTRIBUTE
      98    void __asan_set_shadow_03(uptr addr, uptr size);
      99    SANITIZER_INTERFACE_ATTRIBUTE
     100    void __asan_set_shadow_04(uptr addr, uptr size);
     101    SANITIZER_INTERFACE_ATTRIBUTE
     102    void __asan_set_shadow_05(uptr addr, uptr size);
     103    SANITIZER_INTERFACE_ATTRIBUTE
     104    void __asan_set_shadow_06(uptr addr, uptr size);
     105    SANITIZER_INTERFACE_ATTRIBUTE
     106    void __asan_set_shadow_07(uptr addr, uptr size);
     107    SANITIZER_INTERFACE_ATTRIBUTE
     108    void __asan_set_shadow_f1(uptr addr, uptr size);
     109    SANITIZER_INTERFACE_ATTRIBUTE
     110    void __asan_set_shadow_f2(uptr addr, uptr size);
     111    SANITIZER_INTERFACE_ATTRIBUTE
     112    void __asan_set_shadow_f3(uptr addr, uptr size);
     113    SANITIZER_INTERFACE_ATTRIBUTE
     114    void __asan_set_shadow_f5(uptr addr, uptr size);
     115    SANITIZER_INTERFACE_ATTRIBUTE
     116    void __asan_set_shadow_f8(uptr addr, uptr size);
     117  
     118    // These two functions are used by instrumented code in the
     119    // use-after-scope mode. They mark memory for local variables as
     120    // unaddressable when they leave scope and addressable before the
     121    // function exits.
     122    SANITIZER_INTERFACE_ATTRIBUTE
     123    void __asan_poison_stack_memory(uptr addr, uptr size);
     124    SANITIZER_INTERFACE_ATTRIBUTE
     125    void __asan_unpoison_stack_memory(uptr addr, uptr size);
     126  
     127    // Performs cleanup before a NoReturn function. Must be called before things
     128    // like _exit and execl to avoid false positives on stack.
     129    SANITIZER_INTERFACE_ATTRIBUTE void __asan_handle_no_return();
     130  
     131    SANITIZER_INTERFACE_ATTRIBUTE
     132    void __asan_poison_memory_region(void const volatile *addr, uptr size);
     133    SANITIZER_INTERFACE_ATTRIBUTE
     134    void __asan_unpoison_memory_region(void const volatile *addr, uptr size);
     135  
     136    SANITIZER_INTERFACE_ATTRIBUTE
     137    int __asan_address_is_poisoned(void const volatile *addr);
     138  
     139    SANITIZER_INTERFACE_ATTRIBUTE
     140    uptr __asan_region_is_poisoned(uptr beg, uptr size);
     141  
     142    SANITIZER_INTERFACE_ATTRIBUTE
     143    void __asan_describe_address(uptr addr);
     144  
     145    SANITIZER_INTERFACE_ATTRIBUTE
     146    int __asan_report_present();
     147  
     148    SANITIZER_INTERFACE_ATTRIBUTE
     149    uptr __asan_get_report_pc();
     150    SANITIZER_INTERFACE_ATTRIBUTE
     151    uptr __asan_get_report_bp();
     152    SANITIZER_INTERFACE_ATTRIBUTE
     153    uptr __asan_get_report_sp();
     154    SANITIZER_INTERFACE_ATTRIBUTE
     155    uptr __asan_get_report_address();
     156    SANITIZER_INTERFACE_ATTRIBUTE
     157    int __asan_get_report_access_type();
     158    SANITIZER_INTERFACE_ATTRIBUTE
     159    uptr __asan_get_report_access_size();
     160    SANITIZER_INTERFACE_ATTRIBUTE
     161    const char * __asan_get_report_description();
     162  
     163    SANITIZER_INTERFACE_ATTRIBUTE
     164    const char * __asan_locate_address(uptr addr, char *name, uptr name_size,
     165                                       uptr *region_address, uptr *region_size);
     166  
     167    SANITIZER_INTERFACE_ATTRIBUTE
     168    uptr __asan_get_alloc_stack(uptr addr, uptr *trace, uptr size,
     169                                u32 *thread_id);
     170  
     171    SANITIZER_INTERFACE_ATTRIBUTE
     172    uptr __asan_get_free_stack(uptr addr, uptr *trace, uptr size,
     173                               u32 *thread_id);
     174  
     175    SANITIZER_INTERFACE_ATTRIBUTE
     176    void __asan_get_shadow_mapping(uptr *shadow_scale, uptr *shadow_offset);
     177  
     178    SANITIZER_INTERFACE_ATTRIBUTE
     179    void __asan_report_error(uptr pc, uptr bp, uptr sp,
     180                             uptr addr, int is_write, uptr access_size, u32 exp);
     181  
     182    SANITIZER_INTERFACE_ATTRIBUTE
     183    void __asan_set_death_callback(void (*callback)(void));
     184    SANITIZER_INTERFACE_ATTRIBUTE
     185    void __asan_set_error_report_callback(void (*callback)(const char*));
     186  
     187    SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE
     188    void __asan_on_error();
     189  
     190    SANITIZER_INTERFACE_ATTRIBUTE void __asan_print_accumulated_stats();
     191  
     192    SANITIZER_INTERFACE_ATTRIBUTE
     193    const char *__asan_default_options();
     194  
     195    SANITIZER_INTERFACE_ATTRIBUTE
     196    extern uptr __asan_shadow_memory_dynamic_address;
     197  
     198    // Global flag, copy of ASAN_OPTIONS=detect_stack_use_after_return
     199    SANITIZER_INTERFACE_ATTRIBUTE
     200    extern int __asan_option_detect_stack_use_after_return;
     201  
     202    SANITIZER_INTERFACE_ATTRIBUTE
     203    extern uptr *__asan_test_only_reported_buggy_pointer;
     204  
     205    SANITIZER_INTERFACE_ATTRIBUTE void __asan_load1(uptr p);
     206    SANITIZER_INTERFACE_ATTRIBUTE void __asan_load2(uptr p);
     207    SANITIZER_INTERFACE_ATTRIBUTE void __asan_load4(uptr p);
     208    SANITIZER_INTERFACE_ATTRIBUTE void __asan_load8(uptr p);
     209    SANITIZER_INTERFACE_ATTRIBUTE void __asan_load16(uptr p);
     210    SANITIZER_INTERFACE_ATTRIBUTE void __asan_store1(uptr p);
     211    SANITIZER_INTERFACE_ATTRIBUTE void __asan_store2(uptr p);
     212    SANITIZER_INTERFACE_ATTRIBUTE void __asan_store4(uptr p);
     213    SANITIZER_INTERFACE_ATTRIBUTE void __asan_store8(uptr p);
     214    SANITIZER_INTERFACE_ATTRIBUTE void __asan_store16(uptr p);
     215    SANITIZER_INTERFACE_ATTRIBUTE void __asan_loadN(uptr p, uptr size);
     216    SANITIZER_INTERFACE_ATTRIBUTE void __asan_storeN(uptr p, uptr size);
     217  
     218    SANITIZER_INTERFACE_ATTRIBUTE void __asan_load1_noabort(uptr p);
     219    SANITIZER_INTERFACE_ATTRIBUTE void __asan_load2_noabort(uptr p);
     220    SANITIZER_INTERFACE_ATTRIBUTE void __asan_load4_noabort(uptr p);
     221    SANITIZER_INTERFACE_ATTRIBUTE void __asan_load8_noabort(uptr p);
     222    SANITIZER_INTERFACE_ATTRIBUTE void __asan_load16_noabort(uptr p);
     223    SANITIZER_INTERFACE_ATTRIBUTE void __asan_store1_noabort(uptr p);
     224    SANITIZER_INTERFACE_ATTRIBUTE void __asan_store2_noabort(uptr p);
     225    SANITIZER_INTERFACE_ATTRIBUTE void __asan_store4_noabort(uptr p);
     226    SANITIZER_INTERFACE_ATTRIBUTE void __asan_store8_noabort(uptr p);
     227    SANITIZER_INTERFACE_ATTRIBUTE void __asan_store16_noabort(uptr p);
     228    SANITIZER_INTERFACE_ATTRIBUTE void __asan_loadN_noabort(uptr p, uptr size);
     229    SANITIZER_INTERFACE_ATTRIBUTE void __asan_storeN_noabort(uptr p, uptr size);
     230  
     231    SANITIZER_INTERFACE_ATTRIBUTE void __asan_exp_load1(uptr p, u32 exp);
     232    SANITIZER_INTERFACE_ATTRIBUTE void __asan_exp_load2(uptr p, u32 exp);
     233    SANITIZER_INTERFACE_ATTRIBUTE void __asan_exp_load4(uptr p, u32 exp);
     234    SANITIZER_INTERFACE_ATTRIBUTE void __asan_exp_load8(uptr p, u32 exp);
     235    SANITIZER_INTERFACE_ATTRIBUTE void __asan_exp_load16(uptr p, u32 exp);
     236    SANITIZER_INTERFACE_ATTRIBUTE void __asan_exp_store1(uptr p, u32 exp);
     237    SANITIZER_INTERFACE_ATTRIBUTE void __asan_exp_store2(uptr p, u32 exp);
     238    SANITIZER_INTERFACE_ATTRIBUTE void __asan_exp_store4(uptr p, u32 exp);
     239    SANITIZER_INTERFACE_ATTRIBUTE void __asan_exp_store8(uptr p, u32 exp);
     240    SANITIZER_INTERFACE_ATTRIBUTE void __asan_exp_store16(uptr p, u32 exp);
     241    SANITIZER_INTERFACE_ATTRIBUTE void __asan_exp_loadN(uptr p, uptr size,
     242                                                        u32 exp);
     243    SANITIZER_INTERFACE_ATTRIBUTE void __asan_exp_storeN(uptr p, uptr size,
     244                                                         u32 exp);
     245  
     246    SANITIZER_INTERFACE_ATTRIBUTE
     247        void* __asan_memcpy(void *dst, const void *src, uptr size);
     248    SANITIZER_INTERFACE_ATTRIBUTE
     249        void* __asan_memset(void *s, int c, uptr n);
     250    SANITIZER_INTERFACE_ATTRIBUTE
     251        void* __asan_memmove(void* dest, const void* src, uptr n);
     252  
     253    SANITIZER_INTERFACE_ATTRIBUTE
     254    void __asan_poison_cxx_array_cookie(uptr p);
     255    SANITIZER_INTERFACE_ATTRIBUTE
     256    uptr __asan_load_cxx_array_cookie(uptr *p);
     257    SANITIZER_INTERFACE_ATTRIBUTE
     258    void __asan_poison_intra_object_redzone(uptr p, uptr size);
     259    SANITIZER_INTERFACE_ATTRIBUTE
     260    void __asan_unpoison_intra_object_redzone(uptr p, uptr size);
     261    SANITIZER_INTERFACE_ATTRIBUTE
     262    void __asan_alloca_poison(uptr addr, uptr size);
     263    SANITIZER_INTERFACE_ATTRIBUTE
     264    void __asan_allocas_unpoison(uptr top, uptr bottom);
     265  
     266    SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE
     267    const char* __asan_default_suppressions();
     268  
     269    SANITIZER_INTERFACE_ATTRIBUTE void __asan_handle_vfork(void *sp);
     270  
     271    SANITIZER_INTERFACE_ATTRIBUTE int __asan_update_allocation_context(
     272        void *addr);
     273  }  // extern "C"
     274  
     275  #endif  // ASAN_INTERFACE_INTERNAL_H