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