13cab2bb3Spatrick //===-- sanitizer/asan_interface.h ------------------------------*- C++ -*-===// 23cab2bb3Spatrick // 33cab2bb3Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 43cab2bb3Spatrick // See https://llvm.org/LICENSE.txt for license information. 53cab2bb3Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 63cab2bb3Spatrick // 73cab2bb3Spatrick //===----------------------------------------------------------------------===// 83cab2bb3Spatrick // 93cab2bb3Spatrick // This file is a part of AddressSanitizer (ASan). 103cab2bb3Spatrick // 113cab2bb3Spatrick // Public interface header. 123cab2bb3Spatrick //===----------------------------------------------------------------------===// 133cab2bb3Spatrick #ifndef SANITIZER_ASAN_INTERFACE_H 143cab2bb3Spatrick #define SANITIZER_ASAN_INTERFACE_H 153cab2bb3Spatrick 163cab2bb3Spatrick #include <sanitizer/common_interface_defs.h> 173cab2bb3Spatrick 183cab2bb3Spatrick #ifdef __cplusplus 193cab2bb3Spatrick extern "C" { 203cab2bb3Spatrick #endif 213cab2bb3Spatrick /// Marks a memory region (<c>[addr, addr+size)</c>) as unaddressable. 223cab2bb3Spatrick /// 233cab2bb3Spatrick /// This memory must be previously allocated by your program. Instrumented 243cab2bb3Spatrick /// code is forbidden from accessing addresses in this region until it is 253cab2bb3Spatrick /// unpoisoned. This function is not guaranteed to poison the entire region - 263cab2bb3Spatrick /// it could poison only a subregion of <c>[addr, addr+size)</c> due to ASan 273cab2bb3Spatrick /// alignment restrictions. 283cab2bb3Spatrick /// 293cab2bb3Spatrick /// \note This function is not thread-safe because no two threads can poison or 303cab2bb3Spatrick /// unpoison memory in the same memory region simultaneously. 313cab2bb3Spatrick /// 323cab2bb3Spatrick /// \param addr Start of memory region. 333cab2bb3Spatrick /// \param size Size of memory region. 343cab2bb3Spatrick void __asan_poison_memory_region(void const volatile *addr, size_t size); 353cab2bb3Spatrick 363cab2bb3Spatrick /// Marks a memory region (<c>[addr, addr+size)</c>) as addressable. 373cab2bb3Spatrick /// 383cab2bb3Spatrick /// This memory must be previously allocated by your program. Accessing 393cab2bb3Spatrick /// addresses in this region is allowed until this region is poisoned again. 403cab2bb3Spatrick /// This function could unpoison a super-region of <c>[addr, addr+size)</c> due 413cab2bb3Spatrick /// to ASan alignment restrictions. 423cab2bb3Spatrick /// 433cab2bb3Spatrick /// \note This function is not thread-safe because no two threads can 443cab2bb3Spatrick /// poison or unpoison memory in the same memory region simultaneously. 453cab2bb3Spatrick /// 463cab2bb3Spatrick /// \param addr Start of memory region. 473cab2bb3Spatrick /// \param size Size of memory region. 483cab2bb3Spatrick void __asan_unpoison_memory_region(void const volatile *addr, size_t size); 493cab2bb3Spatrick 503cab2bb3Spatrick // Macros provided for convenience. 513cab2bb3Spatrick #if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__) 523cab2bb3Spatrick /// Marks a memory region as unaddressable. 533cab2bb3Spatrick /// 543cab2bb3Spatrick /// \note Macro provided for convenience; defined as a no-op if ASan is not 553cab2bb3Spatrick /// enabled. 563cab2bb3Spatrick /// 573cab2bb3Spatrick /// \param addr Start of memory region. 583cab2bb3Spatrick /// \param size Size of memory region. 593cab2bb3Spatrick #define ASAN_POISON_MEMORY_REGION(addr, size) \ 603cab2bb3Spatrick __asan_poison_memory_region((addr), (size)) 613cab2bb3Spatrick 623cab2bb3Spatrick /// Marks a memory region as addressable. 633cab2bb3Spatrick /// 643cab2bb3Spatrick /// \note Macro provided for convenience; defined as a no-op if ASan is not 653cab2bb3Spatrick /// enabled. 663cab2bb3Spatrick /// 673cab2bb3Spatrick /// \param addr Start of memory region. 683cab2bb3Spatrick /// \param size Size of memory region. 693cab2bb3Spatrick #define ASAN_UNPOISON_MEMORY_REGION(addr, size) \ 703cab2bb3Spatrick __asan_unpoison_memory_region((addr), (size)) 713cab2bb3Spatrick #else 723cab2bb3Spatrick #define ASAN_POISON_MEMORY_REGION(addr, size) \ 733cab2bb3Spatrick ((void)(addr), (void)(size)) 743cab2bb3Spatrick #define ASAN_UNPOISON_MEMORY_REGION(addr, size) \ 753cab2bb3Spatrick ((void)(addr), (void)(size)) 763cab2bb3Spatrick #endif 773cab2bb3Spatrick 783cab2bb3Spatrick /// Checks if an address is poisoned. 793cab2bb3Spatrick /// 803cab2bb3Spatrick /// Returns 1 if <c><i>addr</i></c> is poisoned (that is, 1-byte read/write 813cab2bb3Spatrick /// access to this address would result in an error report from ASan). 823cab2bb3Spatrick /// Otherwise returns 0. 833cab2bb3Spatrick /// 843cab2bb3Spatrick /// \param addr Address to check. 853cab2bb3Spatrick /// 863cab2bb3Spatrick /// \retval 1 Address is poisoned. 873cab2bb3Spatrick /// \retval 0 Address is not poisoned. 883cab2bb3Spatrick int __asan_address_is_poisoned(void const volatile *addr); 893cab2bb3Spatrick 903cab2bb3Spatrick /// Checks if a region is poisoned. 913cab2bb3Spatrick /// 923cab2bb3Spatrick /// If at least one byte in <c>[beg, beg+size)</c> is poisoned, returns the 933cab2bb3Spatrick /// address of the first such byte. Otherwise returns 0. 943cab2bb3Spatrick /// 953cab2bb3Spatrick /// \param beg Start of memory region. 963cab2bb3Spatrick /// \param size Start of memory region. 973cab2bb3Spatrick /// \returns Address of first poisoned byte. 983cab2bb3Spatrick void *__asan_region_is_poisoned(void *beg, size_t size); 993cab2bb3Spatrick 1003cab2bb3Spatrick /// Describes an address (useful for calling from the debugger). 1013cab2bb3Spatrick /// 1023cab2bb3Spatrick /// Prints the description of <c><i>addr</i></c>. 1033cab2bb3Spatrick /// 1043cab2bb3Spatrick /// \param addr Address to describe. 1053cab2bb3Spatrick void __asan_describe_address(void *addr); 1063cab2bb3Spatrick 1073cab2bb3Spatrick /// Checks if an error has been or is being reported (useful for calling from 1083cab2bb3Spatrick /// the debugger to get information about an ASan error). 1093cab2bb3Spatrick /// 1103cab2bb3Spatrick /// Returns 1 if an error has been (or is being) reported. Otherwise returns 0. 1113cab2bb3Spatrick /// 1123cab2bb3Spatrick /// \returns 1 if an error has been (or is being) reported. Otherwise returns 1133cab2bb3Spatrick /// 0. 1143cab2bb3Spatrick int __asan_report_present(void); 1153cab2bb3Spatrick 1163cab2bb3Spatrick /// Gets the PC (program counter) register value of an ASan error (useful for 1173cab2bb3Spatrick /// calling from the debugger). 1183cab2bb3Spatrick /// 1193cab2bb3Spatrick /// Returns PC if an error has been (or is being) reported. 1203cab2bb3Spatrick /// Otherwise returns 0. 1213cab2bb3Spatrick /// 1223cab2bb3Spatrick /// \returns PC value. 1233cab2bb3Spatrick void *__asan_get_report_pc(void); 1243cab2bb3Spatrick 1253cab2bb3Spatrick /// Gets the BP (base pointer) register value of an ASan error (useful for 1263cab2bb3Spatrick /// calling from the debugger). 1273cab2bb3Spatrick /// 1283cab2bb3Spatrick /// Returns BP if an error has been (or is being) reported. 1293cab2bb3Spatrick /// Otherwise returns 0. 1303cab2bb3Spatrick /// 1313cab2bb3Spatrick /// \returns BP value. 1323cab2bb3Spatrick void *__asan_get_report_bp(void); 1333cab2bb3Spatrick 1343cab2bb3Spatrick /// Gets the SP (stack pointer) register value of an ASan error (useful for 1353cab2bb3Spatrick /// calling from the debugger). 1363cab2bb3Spatrick /// 1373cab2bb3Spatrick /// If an error has been (or is being) reported, returns SP. 1383cab2bb3Spatrick /// Otherwise returns 0. 1393cab2bb3Spatrick /// 1403cab2bb3Spatrick /// \returns SP value. 1413cab2bb3Spatrick void *__asan_get_report_sp(void); 1423cab2bb3Spatrick 1433cab2bb3Spatrick /// Gets the address of the report buffer of an ASan error (useful for calling 1443cab2bb3Spatrick /// from the debugger). 1453cab2bb3Spatrick /// 1463cab2bb3Spatrick /// Returns the address of the report buffer if an error has been (or is being) 1473cab2bb3Spatrick /// reported. Otherwise returns 0. 1483cab2bb3Spatrick /// 1493cab2bb3Spatrick /// \returns Address of report buffer. 1503cab2bb3Spatrick void *__asan_get_report_address(void); 1513cab2bb3Spatrick 1523cab2bb3Spatrick /// Gets access type of an ASan error (useful for calling from the debugger). 1533cab2bb3Spatrick /// 1543cab2bb3Spatrick /// Returns access type (read or write) if an error has been (or is being) 1553cab2bb3Spatrick /// reported. Otherwise returns 0. 1563cab2bb3Spatrick /// 1573cab2bb3Spatrick /// \returns Access type (0 = read, 1 = write). 1583cab2bb3Spatrick int __asan_get_report_access_type(void); 1593cab2bb3Spatrick 1603cab2bb3Spatrick /// Gets access size of an ASan error (useful for calling from the debugger). 1613cab2bb3Spatrick /// 1623cab2bb3Spatrick /// Returns access size if an error has been (or is being) reported. Otherwise 1633cab2bb3Spatrick /// returns 0. 1643cab2bb3Spatrick /// 1653cab2bb3Spatrick /// \returns Access size in bytes. 1663cab2bb3Spatrick size_t __asan_get_report_access_size(void); 1673cab2bb3Spatrick 1683cab2bb3Spatrick /// Gets the bug description of an ASan error (useful for calling from a 1693cab2bb3Spatrick /// debugger). 1703cab2bb3Spatrick /// 1713cab2bb3Spatrick /// \returns Returns a bug description if an error has been (or is being) 1723cab2bb3Spatrick /// reported - for example, "heap-use-after-free". Otherwise returns an empty 1733cab2bb3Spatrick /// string. 1743cab2bb3Spatrick const char *__asan_get_report_description(void); 1753cab2bb3Spatrick 1763cab2bb3Spatrick /// Gets information about a pointer (useful for calling from the debugger). 1773cab2bb3Spatrick /// 1783cab2bb3Spatrick /// Returns the category of the given pointer as a constant string. 1793cab2bb3Spatrick /// Possible return values are <c>global</c>, <c>stack</c>, <c>stack-fake</c>, 1803cab2bb3Spatrick /// <c>heap</c>, <c>heap-invalid</c>, <c>shadow-low</c>, <c>shadow-gap</c>, 1813cab2bb3Spatrick /// <c>shadow-high</c>, and <c>unknown</c>. 1823cab2bb3Spatrick /// 1833cab2bb3Spatrick /// If the return value is <c>global</c> or <c>stack</c>, tries to also return 1843cab2bb3Spatrick /// the variable name, address, and size. If the return value is <c>heap</c>, 1853cab2bb3Spatrick /// tries to return the chunk address and size. <c><i>name</i></c> should point 1863cab2bb3Spatrick /// to an allocated buffer of size <c><i>name_size</i></c>. 1873cab2bb3Spatrick /// 1883cab2bb3Spatrick /// \param addr Address to locate. 1893cab2bb3Spatrick /// \param name Buffer to store the variable's name. 1903cab2bb3Spatrick /// \param name_size Size in bytes of the variable's name buffer. 191d89ec533Spatrick /// \param[out] region_address Address of the region. 192d89ec533Spatrick /// \param[out] region_size Size of the region in bytes. 1933cab2bb3Spatrick /// 1943cab2bb3Spatrick /// \returns Returns the category of the given pointer as a constant string. 1953cab2bb3Spatrick const char *__asan_locate_address(void *addr, char *name, size_t name_size, 1963cab2bb3Spatrick void **region_address, size_t *region_size); 1973cab2bb3Spatrick 1983cab2bb3Spatrick /// Gets the allocation stack trace and thread ID for a heap address (useful 1993cab2bb3Spatrick /// for calling from the debugger). 2003cab2bb3Spatrick /// 2013cab2bb3Spatrick /// Stores up to <c><i>size</i></c> frames in <c><i>trace</i></c>. Returns 2023cab2bb3Spatrick /// the number of stored frames or 0 on error. 2033cab2bb3Spatrick /// 2043cab2bb3Spatrick /// \param addr A heap address. 2053cab2bb3Spatrick /// \param trace A buffer to store the stack trace. 2063cab2bb3Spatrick /// \param size Size in bytes of the trace buffer. 207d89ec533Spatrick /// \param[out] thread_id The thread ID of the address. 2083cab2bb3Spatrick /// 2093cab2bb3Spatrick /// \returns Returns the number of stored frames or 0 on error. 2103cab2bb3Spatrick size_t __asan_get_alloc_stack(void *addr, void **trace, size_t size, 2113cab2bb3Spatrick int *thread_id); 2123cab2bb3Spatrick 2133cab2bb3Spatrick /// Gets the free stack trace and thread ID for a heap address (useful for 2143cab2bb3Spatrick /// calling from the debugger). 2153cab2bb3Spatrick /// 2163cab2bb3Spatrick /// Stores up to <c><i>size</i></c> frames in <c><i>trace</i></c>. Returns 2173cab2bb3Spatrick /// the number of stored frames or 0 on error. 2183cab2bb3Spatrick /// 2193cab2bb3Spatrick /// \param addr A heap address. 2203cab2bb3Spatrick /// \param trace A buffer to store the stack trace. 2213cab2bb3Spatrick /// \param size Size in bytes of the trace buffer. 222d89ec533Spatrick /// \param[out] thread_id The thread ID of the address. 2233cab2bb3Spatrick /// 2243cab2bb3Spatrick /// \returns Returns the number of stored frames or 0 on error. 2253cab2bb3Spatrick size_t __asan_get_free_stack(void *addr, void **trace, size_t size, 2263cab2bb3Spatrick int *thread_id); 2273cab2bb3Spatrick 2283cab2bb3Spatrick /// Gets the current shadow memory mapping (useful for calling from the 2293cab2bb3Spatrick /// debugger). 2303cab2bb3Spatrick /// 231d89ec533Spatrick /// \param[out] shadow_scale Shadow scale value. 232d89ec533Spatrick /// \param[out] shadow_offset Offset value. 2333cab2bb3Spatrick void __asan_get_shadow_mapping(size_t *shadow_scale, size_t *shadow_offset); 2343cab2bb3Spatrick 2353cab2bb3Spatrick /// This is an internal function that is called to report an error. However, 2363cab2bb3Spatrick /// it is still a part of the interface because you might want to set a 2373cab2bb3Spatrick /// breakpoint on this function in the debugger. 2383cab2bb3Spatrick /// 2393cab2bb3Spatrick /// \param pc <c><i>pc</i></c> value of the ASan error. 2403cab2bb3Spatrick /// \param bp <c><i>bp</i></c> value of the ASan error. 2413cab2bb3Spatrick /// \param sp <c><i>sp</i></c> value of the ASan error. 2423cab2bb3Spatrick /// \param addr Address of the ASan error. 2433cab2bb3Spatrick /// \param is_write True if the error is a write error; false otherwise. 2443cab2bb3Spatrick /// \param access_size Size of the memory access of the ASan error. 2453cab2bb3Spatrick void __asan_report_error(void *pc, void *bp, void *sp, 2463cab2bb3Spatrick void *addr, int is_write, size_t access_size); 2473cab2bb3Spatrick 2483cab2bb3Spatrick // Deprecated. Call __sanitizer_set_death_callback instead. 2493cab2bb3Spatrick void __asan_set_death_callback(void (*callback)(void)); 2503cab2bb3Spatrick 2513cab2bb3Spatrick /// Sets the callback function to be called during ASan error reporting. 2523cab2bb3Spatrick /// 2533cab2bb3Spatrick /// The callback provides a string pointer to the report. 2543cab2bb3Spatrick /// 2553cab2bb3Spatrick /// \param callback User-provided function. 2563cab2bb3Spatrick void __asan_set_error_report_callback(void (*callback)(const char *)); 2573cab2bb3Spatrick 2583cab2bb3Spatrick /// User-provided callback on ASan errors. 2593cab2bb3Spatrick /// 2603cab2bb3Spatrick /// You can provide a function that would be called immediately when ASan 2613cab2bb3Spatrick /// detects an error. This is useful in cases when ASan detects an error but 2623cab2bb3Spatrick /// your program crashes before the ASan report is printed. 2633cab2bb3Spatrick void __asan_on_error(void); 2643cab2bb3Spatrick 2653cab2bb3Spatrick /// Prints accumulated statistics to <c>stderr</c> (useful for calling from the 2663cab2bb3Spatrick /// debugger). 2673cab2bb3Spatrick void __asan_print_accumulated_stats(void); 2683cab2bb3Spatrick 2693cab2bb3Spatrick /// User-provided default option settings. 2703cab2bb3Spatrick /// 2713cab2bb3Spatrick /// You can provide your own implementation of this function to return a string 2723cab2bb3Spatrick /// containing ASan runtime options (for example, 2733cab2bb3Spatrick /// <c>verbosity=1:halt_on_error=0</c>). 2743cab2bb3Spatrick /// 2753cab2bb3Spatrick /// \returns Default options string. 2763cab2bb3Spatrick const char* __asan_default_options(void); 2773cab2bb3Spatrick 2783cab2bb3Spatrick // The following two functions facilitate garbage collection in presence of 2793cab2bb3Spatrick // ASan's fake stack. 2803cab2bb3Spatrick 2813cab2bb3Spatrick /// Gets an opaque handler to the current thread's fake stack. 2823cab2bb3Spatrick /// 2833cab2bb3Spatrick /// Returns an opaque handler to be used by 2843cab2bb3Spatrick /// <c>__asan_addr_is_in_fake_stack()</c>. Returns NULL if the current thread 2853cab2bb3Spatrick /// does not have a fake stack. 2863cab2bb3Spatrick /// 2873cab2bb3Spatrick /// \returns An opaque handler to the fake stack or NULL. 2883cab2bb3Spatrick void *__asan_get_current_fake_stack(void); 2893cab2bb3Spatrick 2903cab2bb3Spatrick /// Checks if an address belongs to a given fake stack. 2913cab2bb3Spatrick /// 2923cab2bb3Spatrick /// If <c><i>fake_stack</i></c> is non-NULL and <c><i>addr</i></c> belongs to a 2933cab2bb3Spatrick /// fake frame in <c><i>fake_stack</i></c>, returns the address of the real 2943cab2bb3Spatrick /// stack that corresponds to the fake frame and sets <c><i>beg</i></c> and 2953cab2bb3Spatrick /// <c><i>end</i></c> to the boundaries of this fake frame. Otherwise returns 2963cab2bb3Spatrick /// NULL and does not touch <c><i>beg</i></c> and <c><i>end</i></c>. 2973cab2bb3Spatrick /// 2983cab2bb3Spatrick /// If <c><i>beg</i></c> or <c><i>end</i></c> are NULL, they are not touched. 2993cab2bb3Spatrick /// 3003cab2bb3Spatrick /// \note This function can be called from a thread other than the owner of 3013cab2bb3Spatrick /// <c><i>fake_stack</i></c>, but the owner thread needs to be alive. 3023cab2bb3Spatrick /// 3033cab2bb3Spatrick /// \param fake_stack An opaque handler to a fake stack. 3043cab2bb3Spatrick /// \param addr Address to test. 305d89ec533Spatrick /// \param[out] beg Beginning of fake frame. 306d89ec533Spatrick /// \param[out] end End of fake frame. 3073cab2bb3Spatrick /// \returns Stack address or NULL. 3083cab2bb3Spatrick void *__asan_addr_is_in_fake_stack(void *fake_stack, void *addr, void **beg, 3093cab2bb3Spatrick void **end); 3103cab2bb3Spatrick 3113cab2bb3Spatrick /// Performs shadow memory cleanup of the current thread's stack before a 3123cab2bb3Spatrick /// function marked with the <c>[[noreturn]]</c> attribute is called. 3133cab2bb3Spatrick /// 3143cab2bb3Spatrick /// To avoid false positives on the stack, must be called before no-return 3153cab2bb3Spatrick /// functions like <c>_exit()</c> and <c>execl()</c>. 3163cab2bb3Spatrick void __asan_handle_no_return(void); 3173cab2bb3Spatrick 3183cab2bb3Spatrick /// Update allocation stack trace for the given allocation to the current stack 319*810390e3Srobert /// trace. Returns 1 if successful, 0 if not. 3203cab2bb3Spatrick int __asan_update_allocation_context(void* addr); 3213cab2bb3Spatrick 3223cab2bb3Spatrick #ifdef __cplusplus 3233cab2bb3Spatrick } // extern "C" 3243cab2bb3Spatrick #endif 3253cab2bb3Spatrick 3263cab2bb3Spatrick #endif // SANITIZER_ASAN_INTERFACE_H 327