xref: /openbsd-src/gnu/llvm/compiler-rt/include/sanitizer/asan_interface.h (revision 810390e339a5425391477d5d41c78d7cab2424ac)
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