xref: /freebsd-src/contrib/llvm-project/compiler-rt/lib/asan/asan_interface_internal.h (revision 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e)
10b57cec5SDimitry Andric //===-- asan_interface_internal.h -------------------------------*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This file is a part of AddressSanitizer, an address sanity checker.
100b57cec5SDimitry Andric //
110b57cec5SDimitry Andric // This header declares the AddressSanitizer runtime interface functions.
120b57cec5SDimitry Andric // The runtime library has to define these functions so the instrumented program
130b57cec5SDimitry Andric // could call them.
140b57cec5SDimitry Andric //
150b57cec5SDimitry Andric // See also include/sanitizer/asan_interface.h
160b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
170b57cec5SDimitry Andric #ifndef ASAN_INTERFACE_INTERNAL_H
180b57cec5SDimitry Andric #define ASAN_INTERFACE_INTERNAL_H
190b57cec5SDimitry Andric 
200b57cec5SDimitry Andric #include "sanitizer_common/sanitizer_internal_defs.h"
210b57cec5SDimitry Andric 
220b57cec5SDimitry Andric #include "asan_init_version.h"
230b57cec5SDimitry Andric 
240b57cec5SDimitry Andric using __sanitizer::uptr;
250b57cec5SDimitry Andric using __sanitizer::u64;
260b57cec5SDimitry Andric using __sanitizer::u32;
270b57cec5SDimitry Andric 
280b57cec5SDimitry Andric extern "C" {
290b57cec5SDimitry Andric   // This function should be called at the very beginning of the process,
300b57cec5SDimitry Andric   // before any instrumented code is executed and before any call to malloc.
310b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_init();
320b57cec5SDimitry Andric 
330b57cec5SDimitry Andric   // This function exists purely to get a linker/loader error when using
340b57cec5SDimitry Andric   // incompatible versions of instrumentation and runtime library. Please note
350b57cec5SDimitry Andric   // that __asan_version_mismatch_check is a macro that is replaced with
360b57cec5SDimitry Andric   // __asan_version_mismatch_check_vXXX at compile-time.
370b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_version_mismatch_check();
380b57cec5SDimitry Andric 
390b57cec5SDimitry Andric   // This structure is used to describe the source location of a place where
400b57cec5SDimitry Andric   // global was defined.
410b57cec5SDimitry Andric   struct __asan_global_source_location {
420b57cec5SDimitry Andric     const char *filename;
430b57cec5SDimitry Andric     int line_no;
440b57cec5SDimitry Andric     int column_no;
450b57cec5SDimitry Andric   };
460b57cec5SDimitry Andric 
470b57cec5SDimitry Andric   // This structure describes an instrumented global variable.
480b57cec5SDimitry Andric   struct __asan_global {
490b57cec5SDimitry Andric     uptr beg;                // The address of the global.
500b57cec5SDimitry Andric     uptr size;               // The original size of the global.
510b57cec5SDimitry Andric     uptr size_with_redzone;  // The size with the redzone.
520b57cec5SDimitry Andric     const char *name;        // Name as a C string.
530b57cec5SDimitry Andric     const char *module_name; // Module name as a C string. This pointer is a
540b57cec5SDimitry Andric                              // unique identifier of a module.
550b57cec5SDimitry Andric     uptr has_dynamic_init;   // Non-zero if the global has dynamic initializer.
56*06c3fb27SDimitry Andric     __asan_global_source_location *gcc_location;  // Source location of a global,
57*06c3fb27SDimitry Andric                                                   // used by GCC compiler. LLVM uses
58*06c3fb27SDimitry Andric                                                   // llvm-symbolizer that relies
59*06c3fb27SDimitry Andric                                                   // on DWARF debugging info.
600b57cec5SDimitry Andric     uptr odr_indicator;      // The address of the ODR indicator symbol.
610b57cec5SDimitry Andric   };
620b57cec5SDimitry Andric 
630b57cec5SDimitry Andric   // These functions can be called on some platforms to find globals in the same
640b57cec5SDimitry Andric   // loaded image as `flag' and apply __asan_(un)register_globals to them,
650b57cec5SDimitry Andric   // filtering out redundant calls.
660b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
670b57cec5SDimitry Andric   void __asan_register_image_globals(uptr *flag);
680b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
690b57cec5SDimitry Andric   void __asan_unregister_image_globals(uptr *flag);
700b57cec5SDimitry Andric 
710b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
720b57cec5SDimitry Andric   void __asan_register_elf_globals(uptr *flag, void *start, void *stop);
730b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
740b57cec5SDimitry Andric   void __asan_unregister_elf_globals(uptr *flag, void *start, void *stop);
750b57cec5SDimitry Andric 
760b57cec5SDimitry Andric   // These two functions should be called by the instrumented code.
770b57cec5SDimitry Andric   // 'globals' is an array of structures describing 'n' globals.
780b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
790b57cec5SDimitry Andric   void __asan_register_globals(__asan_global *globals, uptr n);
800b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
810b57cec5SDimitry Andric   void __asan_unregister_globals(__asan_global *globals, uptr n);
820b57cec5SDimitry Andric 
830b57cec5SDimitry Andric   // These two functions should be called before and after dynamic initializers
840b57cec5SDimitry Andric   // of a single module run, respectively.
850b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
860b57cec5SDimitry Andric   void __asan_before_dynamic_init(const char *module_name);
870b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
880b57cec5SDimitry Andric   void __asan_after_dynamic_init();
890b57cec5SDimitry Andric 
900b57cec5SDimitry Andric   // Sets bytes of the given range of the shadow memory into specific value.
910b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
920b57cec5SDimitry Andric   void __asan_set_shadow_00(uptr addr, uptr size);
930b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
94bdd1243dSDimitry Andric   void __asan_set_shadow_01(uptr addr, uptr size);
95bdd1243dSDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
96bdd1243dSDimitry Andric   void __asan_set_shadow_02(uptr addr, uptr size);
97bdd1243dSDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
98bdd1243dSDimitry Andric   void __asan_set_shadow_03(uptr addr, uptr size);
99bdd1243dSDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
100bdd1243dSDimitry Andric   void __asan_set_shadow_04(uptr addr, uptr size);
101bdd1243dSDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
102bdd1243dSDimitry Andric   void __asan_set_shadow_05(uptr addr, uptr size);
103bdd1243dSDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
104bdd1243dSDimitry Andric   void __asan_set_shadow_06(uptr addr, uptr size);
105bdd1243dSDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
106bdd1243dSDimitry Andric   void __asan_set_shadow_07(uptr addr, uptr size);
107bdd1243dSDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
1080b57cec5SDimitry Andric   void __asan_set_shadow_f1(uptr addr, uptr size);
1090b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
1100b57cec5SDimitry Andric   void __asan_set_shadow_f2(uptr addr, uptr size);
1110b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
1120b57cec5SDimitry Andric   void __asan_set_shadow_f3(uptr addr, uptr size);
1130b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
1140b57cec5SDimitry Andric   void __asan_set_shadow_f5(uptr addr, uptr size);
1150b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
1160b57cec5SDimitry Andric   void __asan_set_shadow_f8(uptr addr, uptr size);
1170b57cec5SDimitry Andric 
1180b57cec5SDimitry Andric   // These two functions are used by instrumented code in the
1190b57cec5SDimitry Andric   // use-after-scope mode. They mark memory for local variables as
1200b57cec5SDimitry Andric   // unaddressable when they leave scope and addressable before the
1210b57cec5SDimitry Andric   // function exits.
1220b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
1230b57cec5SDimitry Andric   void __asan_poison_stack_memory(uptr addr, uptr size);
1240b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
1250b57cec5SDimitry Andric   void __asan_unpoison_stack_memory(uptr addr, uptr size);
1260b57cec5SDimitry Andric 
1270b57cec5SDimitry Andric   // Performs cleanup before a NoReturn function. Must be called before things
1280b57cec5SDimitry Andric   // like _exit and execl to avoid false positives on stack.
1290b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_handle_no_return();
1300b57cec5SDimitry Andric 
1310b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
1320b57cec5SDimitry Andric   void __asan_poison_memory_region(void const volatile *addr, uptr size);
1330b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
1340b57cec5SDimitry Andric   void __asan_unpoison_memory_region(void const volatile *addr, uptr size);
1350b57cec5SDimitry Andric 
1360b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
1370b57cec5SDimitry Andric   int __asan_address_is_poisoned(void const volatile *addr);
1380b57cec5SDimitry Andric 
1390b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
1400b57cec5SDimitry Andric   uptr __asan_region_is_poisoned(uptr beg, uptr size);
1410b57cec5SDimitry Andric 
1420b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
1430b57cec5SDimitry Andric   void __asan_describe_address(uptr addr);
1440b57cec5SDimitry Andric 
1450b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
1460b57cec5SDimitry Andric   int __asan_report_present();
1470b57cec5SDimitry Andric 
1480b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
1490b57cec5SDimitry Andric   uptr __asan_get_report_pc();
1500b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
1510b57cec5SDimitry Andric   uptr __asan_get_report_bp();
1520b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
1530b57cec5SDimitry Andric   uptr __asan_get_report_sp();
1540b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
1550b57cec5SDimitry Andric   uptr __asan_get_report_address();
1560b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
1570b57cec5SDimitry Andric   int __asan_get_report_access_type();
1580b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
1590b57cec5SDimitry Andric   uptr __asan_get_report_access_size();
1600b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
1610b57cec5SDimitry Andric   const char * __asan_get_report_description();
1620b57cec5SDimitry Andric 
1630b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
1640b57cec5SDimitry Andric   const char * __asan_locate_address(uptr addr, char *name, uptr name_size,
1650b57cec5SDimitry Andric                                      uptr *region_address, uptr *region_size);
1660b57cec5SDimitry Andric 
1670b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
1680b57cec5SDimitry Andric   uptr __asan_get_alloc_stack(uptr addr, uptr *trace, uptr size,
1690b57cec5SDimitry Andric                               u32 *thread_id);
1700b57cec5SDimitry Andric 
1710b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
1720b57cec5SDimitry Andric   uptr __asan_get_free_stack(uptr addr, uptr *trace, uptr size,
1730b57cec5SDimitry Andric                              u32 *thread_id);
1740b57cec5SDimitry Andric 
1750b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
1760b57cec5SDimitry Andric   void __asan_get_shadow_mapping(uptr *shadow_scale, uptr *shadow_offset);
1770b57cec5SDimitry Andric 
1780b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
1790b57cec5SDimitry Andric   void __asan_report_error(uptr pc, uptr bp, uptr sp,
1800b57cec5SDimitry Andric                            uptr addr, int is_write, uptr access_size, u32 exp);
1810b57cec5SDimitry Andric 
1820b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
1830b57cec5SDimitry Andric   void __asan_set_death_callback(void (*callback)(void));
1840b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
1850b57cec5SDimitry Andric   void __asan_set_error_report_callback(void (*callback)(const char*));
1860b57cec5SDimitry Andric 
1870b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE
1880b57cec5SDimitry Andric   void __asan_on_error();
1890b57cec5SDimitry Andric 
1900b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_print_accumulated_stats();
1910b57cec5SDimitry Andric 
192e8d8bef9SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
1930b57cec5SDimitry Andric   const char *__asan_default_options();
1940b57cec5SDimitry Andric 
1950b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
1960b57cec5SDimitry Andric   extern uptr __asan_shadow_memory_dynamic_address;
1970b57cec5SDimitry Andric 
1980b57cec5SDimitry Andric   // Global flag, copy of ASAN_OPTIONS=detect_stack_use_after_return
1990b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
2000b57cec5SDimitry Andric   extern int __asan_option_detect_stack_use_after_return;
2010b57cec5SDimitry Andric 
2020b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
2030b57cec5SDimitry Andric   extern uptr *__asan_test_only_reported_buggy_pointer;
2040b57cec5SDimitry Andric 
2050b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_load1(uptr p);
2060b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_load2(uptr p);
2070b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_load4(uptr p);
2080b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_load8(uptr p);
2090b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_load16(uptr p);
2100b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_store1(uptr p);
2110b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_store2(uptr p);
2120b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_store4(uptr p);
2130b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_store8(uptr p);
2140b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_store16(uptr p);
2150b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_loadN(uptr p, uptr size);
2160b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_storeN(uptr p, uptr size);
2170b57cec5SDimitry Andric 
2180b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_load1_noabort(uptr p);
2190b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_load2_noabort(uptr p);
2200b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_load4_noabort(uptr p);
2210b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_load8_noabort(uptr p);
2220b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_load16_noabort(uptr p);
2230b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_store1_noabort(uptr p);
2240b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_store2_noabort(uptr p);
2250b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_store4_noabort(uptr p);
2260b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_store8_noabort(uptr p);
2270b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_store16_noabort(uptr p);
2280b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_loadN_noabort(uptr p, uptr size);
2290b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_storeN_noabort(uptr p, uptr size);
2300b57cec5SDimitry Andric 
2310b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_exp_load1(uptr p, u32 exp);
2320b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_exp_load2(uptr p, u32 exp);
2330b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_exp_load4(uptr p, u32 exp);
2340b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_exp_load8(uptr p, u32 exp);
2350b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_exp_load16(uptr p, u32 exp);
2360b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_exp_store1(uptr p, u32 exp);
2370b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_exp_store2(uptr p, u32 exp);
2380b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_exp_store4(uptr p, u32 exp);
2390b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_exp_store8(uptr p, u32 exp);
2400b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_exp_store16(uptr p, u32 exp);
2410b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_exp_loadN(uptr p, uptr size,
2420b57cec5SDimitry Andric                                                       u32 exp);
2430b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_exp_storeN(uptr p, uptr size,
2440b57cec5SDimitry Andric                                                        u32 exp);
2450b57cec5SDimitry Andric 
2460b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
2470b57cec5SDimitry Andric       void* __asan_memcpy(void *dst, const void *src, uptr size);
2480b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
2490b57cec5SDimitry Andric       void* __asan_memset(void *s, int c, uptr n);
2500b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
2510b57cec5SDimitry Andric       void* __asan_memmove(void* dest, const void* src, uptr n);
2520b57cec5SDimitry Andric 
2530b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
2540b57cec5SDimitry Andric   void __asan_poison_cxx_array_cookie(uptr p);
2550b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
2560b57cec5SDimitry Andric   uptr __asan_load_cxx_array_cookie(uptr *p);
2570b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
2580b57cec5SDimitry Andric   void __asan_poison_intra_object_redzone(uptr p, uptr size);
2590b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
2600b57cec5SDimitry Andric   void __asan_unpoison_intra_object_redzone(uptr p, uptr size);
2610b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
2620b57cec5SDimitry Andric   void __asan_alloca_poison(uptr addr, uptr size);
2630b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE
2640b57cec5SDimitry Andric   void __asan_allocas_unpoison(uptr top, uptr bottom);
2650b57cec5SDimitry Andric 
2660b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE
2670b57cec5SDimitry Andric   const char* __asan_default_suppressions();
2680b57cec5SDimitry Andric 
2690b57cec5SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE void __asan_handle_vfork(void *sp);
270480093f4SDimitry Andric 
271480093f4SDimitry Andric   SANITIZER_INTERFACE_ATTRIBUTE int __asan_update_allocation_context(
272480093f4SDimitry Andric       void *addr);
2730b57cec5SDimitry Andric }  // extern "C"
2740b57cec5SDimitry Andric 
2750b57cec5SDimitry Andric #endif  // ASAN_INTERFACE_INTERNAL_H
276