| 1 | //===-- sanitizer/asan_interface.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 (ASan). |
| 10 | // |
| 11 | // Public interface header. |
| 12 | //===----------------------------------------------------------------------===// |
| 13 | #ifndef SANITIZER_ASAN_INTERFACE_H |
| 14 | #define SANITIZER_ASAN_INTERFACE_H |
| 15 | |
| 16 | #include <sanitizer/common_interface_defs.h> |
| 17 | |
| 18 | #ifdef __cplusplus |
| 19 | extern "C" { |
| 20 | #endif |
| 21 | /// Marks a memory region (<c>[addr, addr+size)</c>) as unaddressable. |
| 22 | /// |
| 23 | /// This memory must be previously allocated by your program. Instrumented |
| 24 | /// code is forbidden from accessing addresses in this region until it is |
| 25 | /// unpoisoned. This function is not guaranteed to poison the entire region - |
| 26 | /// it could poison only a subregion of <c>[addr, addr+size)</c> due to ASan |
| 27 | /// alignment restrictions. |
| 28 | /// |
| 29 | /// \note This function is not thread-safe because no two threads can poison or |
| 30 | /// unpoison memory in the same memory region simultaneously. |
| 31 | /// |
| 32 | /// \param addr Start of memory region. |
| 33 | /// \param size Size of memory region. |
| 34 | void SANITIZER_CDECL __asan_poison_memory_region(void const volatile *addr, |
| 35 | size_t size); |
| 36 | |
| 37 | /// Marks a memory region (<c>[addr, addr+size)</c>) as addressable. |
| 38 | /// |
| 39 | /// This memory must be previously allocated by your program. Accessing |
| 40 | /// addresses in this region is allowed until this region is poisoned again. |
| 41 | /// This function could unpoison a super-region of <c>[addr, addr+size)</c> due |
| 42 | /// to ASan alignment restrictions. |
| 43 | /// |
| 44 | /// \note This function is not thread-safe because no two threads can |
| 45 | /// poison or unpoison memory in the same memory region simultaneously. |
| 46 | /// |
| 47 | /// \param addr Start of memory region. |
| 48 | /// \param size Size of memory region. |
| 49 | void SANITIZER_CDECL __asan_unpoison_memory_region(void const volatile *addr, |
| 50 | size_t size); |
| 51 | |
| 52 | // Macros provided for convenience. |
| 53 | #ifdef __has_feature |
| 54 | #if __has_feature(address_sanitizer) |
| 55 | #define ASAN_DEFINE_REGION_MACROS |
| 56 | #endif |
| 57 | #elif defined(__SANITIZE_ADDRESS__) |
| 58 | #define ASAN_DEFINE_REGION_MACROS |
| 59 | #endif |
| 60 | |
| 61 | #ifdef ASAN_DEFINE_REGION_MACROS |
| 62 | /// Marks a memory region as unaddressable. |
| 63 | /// |
| 64 | /// \note Macro provided for convenience; defined as a no-op if ASan is not |
| 65 | /// enabled. |
| 66 | /// |
| 67 | /// \param addr Start of memory region. |
| 68 | /// \param size Size of memory region. |
| 69 | #define ASAN_POISON_MEMORY_REGION(addr, size) \ |
| 70 | __asan_poison_memory_region((addr), (size)) |
| 71 | |
| 72 | /// Marks a memory region as addressable. |
| 73 | /// |
| 74 | /// \note Macro provided for convenience; defined as a no-op if ASan is not |
| 75 | /// enabled. |
| 76 | /// |
| 77 | /// \param addr Start of memory region. |
| 78 | /// \param size Size of memory region. |
| 79 | #define ASAN_UNPOISON_MEMORY_REGION(addr, size) \ |
| 80 | __asan_unpoison_memory_region((addr), (size)) |
| 81 | #else |
| 82 | #define ASAN_POISON_MEMORY_REGION(addr, size) ((void)(addr), (void)(size)) |
| 83 | #define ASAN_UNPOISON_MEMORY_REGION(addr, size) ((void)(addr), (void)(size)) |
| 84 | #endif |
| 85 | #undef ASAN_DEFINE_REGION_MACROS |
| 86 | |
| 87 | /// Checks if an address is poisoned. |
| 88 | /// |
| 89 | /// Returns 1 if <c><i>addr</i></c> is poisoned (that is, 1-byte read/write |
| 90 | /// access to this address would result in an error report from ASan). |
| 91 | /// Otherwise returns 0. |
| 92 | /// |
| 93 | /// \param addr Address to check. |
| 94 | /// |
| 95 | /// \retval 1 Address is poisoned. |
| 96 | /// \retval 0 Address is not poisoned. |
| 97 | int SANITIZER_CDECL __asan_address_is_poisoned(void const volatile *addr); |
| 98 | |
| 99 | /// Checks if a region is poisoned. |
| 100 | /// |
| 101 | /// If at least one byte in <c>[beg, beg+size)</c> is poisoned, returns the |
| 102 | /// address of the first such byte. Otherwise returns 0. |
| 103 | /// |
| 104 | /// \param beg Start of memory region. |
| 105 | /// \param size Start of memory region. |
| 106 | /// \returns Address of first poisoned byte. |
| 107 | void *SANITIZER_CDECL __asan_region_is_poisoned(void *beg, size_t size); |
| 108 | |
| 109 | /// Describes an address (useful for calling from the debugger). |
| 110 | /// |
| 111 | /// Prints the description of <c><i>addr</i></c>. |
| 112 | /// |
| 113 | /// \param addr Address to describe. |
| 114 | void SANITIZER_CDECL __asan_describe_address(void *addr); |
| 115 | |
| 116 | /// Checks if an error has been or is being reported (useful for calling from |
| 117 | /// the debugger to get information about an ASan error). |
| 118 | /// |
| 119 | /// Returns 1 if an error has been (or is being) reported. Otherwise returns 0. |
| 120 | /// |
| 121 | /// \returns 1 if an error has been (or is being) reported. Otherwise returns |
| 122 | /// 0. |
| 123 | int SANITIZER_CDECL __asan_report_present(void); |
| 124 | |
| 125 | /// Gets the PC (program counter) register value of an ASan error (useful for |
| 126 | /// calling from the debugger). |
| 127 | /// |
| 128 | /// Returns PC if an error has been (or is being) reported. |
| 129 | /// Otherwise returns 0. |
| 130 | /// |
| 131 | /// \returns PC value. |
| 132 | void *SANITIZER_CDECL __asan_get_report_pc(void); |
| 133 | |
| 134 | /// Gets the BP (base pointer) register value of an ASan error (useful for |
| 135 | /// calling from the debugger). |
| 136 | /// |
| 137 | /// Returns BP if an error has been (or is being) reported. |
| 138 | /// Otherwise returns 0. |
| 139 | /// |
| 140 | /// \returns BP value. |
| 141 | void *SANITIZER_CDECL __asan_get_report_bp(void); |
| 142 | |
| 143 | /// Gets the SP (stack pointer) register value of an ASan error (useful for |
| 144 | /// calling from the debugger). |
| 145 | /// |
| 146 | /// If an error has been (or is being) reported, returns SP. |
| 147 | /// Otherwise returns 0. |
| 148 | /// |
| 149 | /// \returns SP value. |
| 150 | void *SANITIZER_CDECL __asan_get_report_sp(void); |
| 151 | |
| 152 | /// Gets the address of the report buffer of an ASan error (useful for calling |
| 153 | /// from the debugger). |
| 154 | /// |
| 155 | /// Returns the address of the report buffer if an error has been (or is being) |
| 156 | /// reported. Otherwise returns 0. |
| 157 | /// |
| 158 | /// \returns Address of report buffer. |
| 159 | void *SANITIZER_CDECL __asan_get_report_address(void); |
| 160 | |
| 161 | /// Gets access type of an ASan error (useful for calling from the debugger). |
| 162 | /// |
| 163 | /// Returns access type (read or write) if an error has been (or is being) |
| 164 | /// reported. Otherwise returns 0. |
| 165 | /// |
| 166 | /// \returns Access type (0 = read, 1 = write). |
| 167 | int SANITIZER_CDECL __asan_get_report_access_type(void); |
| 168 | |
| 169 | /// Gets access size of an ASan error (useful for calling from the debugger). |
| 170 | /// |
| 171 | /// Returns access size if an error has been (or is being) reported. Otherwise |
| 172 | /// returns 0. |
| 173 | /// |
| 174 | /// \returns Access size in bytes. |
| 175 | size_t SANITIZER_CDECL __asan_get_report_access_size(void); |
| 176 | |
| 177 | /// Gets the bug description of an ASan error (useful for calling from a |
| 178 | /// debugger). |
| 179 | /// |
| 180 | /// \returns Returns a bug description if an error has been (or is being) |
| 181 | /// reported - for example, "heap-use-after-free". Otherwise returns an empty |
| 182 | /// string. |
| 183 | const char *SANITIZER_CDECL __asan_get_report_description(void); |
| 184 | |
| 185 | /// Gets information about a pointer (useful for calling from the debugger). |
| 186 | /// |
| 187 | /// Returns the category of the given pointer as a constant string. |
| 188 | /// Possible return values are <c>global</c>, <c>stack</c>, <c>stack-fake</c>, |
| 189 | /// <c>heap</c>, <c>heap-invalid</c>, <c>shadow-low</c>, <c>shadow-gap</c>, |
| 190 | /// <c>shadow-high</c>, and <c>unknown</c>. |
| 191 | /// |
| 192 | /// If the return value is <c>global</c> or <c>stack</c>, tries to also return |
| 193 | /// the variable name, address, and size. If the return value is <c>heap</c>, |
| 194 | /// tries to return the chunk address and size. <c><i>name</i></c> should point |
| 195 | /// to an allocated buffer of size <c><i>name_size</i></c>. |
| 196 | /// |
| 197 | /// \param addr Address to locate. |
| 198 | /// \param name Buffer to store the variable's name. |
| 199 | /// \param name_size Size in bytes of the variable's name buffer. |
| 200 | /// \param[out] region_address Address of the region. |
| 201 | /// \param[out] region_size Size of the region in bytes. |
| 202 | /// |
| 203 | /// \returns Returns the category of the given pointer as a constant string. |
| 204 | const char *SANITIZER_CDECL __asan_locate_address(void *addr, char *name, |
| 205 | size_t name_size, |
| 206 | void **region_address, |
| 207 | size_t *region_size); |
| 208 | |
| 209 | /// Gets the allocation stack trace and thread ID for a heap address (useful |
| 210 | /// for calling from the debugger). |
| 211 | /// |
| 212 | /// Stores up to <c><i>size</i></c> frames in <c><i>trace</i></c>. Returns |
| 213 | /// the number of stored frames or 0 on error. |
| 214 | /// |
| 215 | /// \param addr A heap address. |
| 216 | /// \param trace A buffer to store the stack trace. |
| 217 | /// \param size Size in bytes of the trace buffer. |
| 218 | /// \param[out] thread_id The thread ID of the address. |
| 219 | /// |
| 220 | /// \returns Returns the number of stored frames or 0 on error. |
| 221 | size_t SANITIZER_CDECL __asan_get_alloc_stack(void *addr, void **trace, |
| 222 | size_t size, int *thread_id); |
| 223 | |
| 224 | /// Gets the free stack trace and thread ID for a heap address (useful for |
| 225 | /// calling from the debugger). |
| 226 | /// |
| 227 | /// Stores up to <c><i>size</i></c> frames in <c><i>trace</i></c>. Returns |
| 228 | /// the number of stored frames or 0 on error. |
| 229 | /// |
| 230 | /// \param addr A heap address. |
| 231 | /// \param trace A buffer to store the stack trace. |
| 232 | /// \param size Size in bytes of the trace buffer. |
| 233 | /// \param[out] thread_id The thread ID of the address. |
| 234 | /// |
| 235 | /// \returns Returns the number of stored frames or 0 on error. |
| 236 | size_t SANITIZER_CDECL __asan_get_free_stack(void *addr, void **trace, |
| 237 | size_t size, int *thread_id); |
| 238 | |
| 239 | /// Gets the current shadow memory mapping (useful for calling from the |
| 240 | /// debugger). |
| 241 | /// |
| 242 | /// \param[out] shadow_scale Shadow scale value. |
| 243 | /// \param[out] shadow_offset Offset value. |
| 244 | void SANITIZER_CDECL __asan_get_shadow_mapping(size_t *shadow_scale, |
| 245 | size_t *shadow_offset); |
| 246 | |
| 247 | /// This is an internal function that is called to report an error. However, |
| 248 | /// it is still a part of the interface because you might want to set a |
| 249 | /// breakpoint on this function in the debugger. |
| 250 | /// |
| 251 | /// \param pc <c><i>pc</i></c> value of the ASan error. |
| 252 | /// \param bp <c><i>bp</i></c> value of the ASan error. |
| 253 | /// \param sp <c><i>sp</i></c> value of the ASan error. |
| 254 | /// \param addr Address of the ASan error. |
| 255 | /// \param is_write True if the error is a write error; false otherwise. |
| 256 | /// \param access_size Size of the memory access of the ASan error. |
| 257 | void SANITIZER_CDECL __asan_report_error(void *pc, void *bp, void *sp, |
| 258 | void *addr, int is_write, |
| 259 | size_t access_size); |
| 260 | |
| 261 | // Deprecated. Call __sanitizer_set_death_callback instead. |
| 262 | void SANITIZER_CDECL __asan_set_death_callback(void (*callback)(void)); |
| 263 | |
| 264 | /// Sets the callback function to be called during ASan error reporting. |
| 265 | /// |
| 266 | /// The callback provides a string pointer to the report. |
| 267 | /// |
| 268 | /// \param callback User-provided function. |
| 269 | void SANITIZER_CDECL |
| 270 | __asan_set_error_report_callback(void (*callback)(const char *)); |
| 271 | |
| 272 | /// User-provided callback on ASan errors. |
| 273 | /// |
| 274 | /// You can provide a function that would be called immediately when ASan |
| 275 | /// detects an error. This is useful in cases when ASan detects an error but |
| 276 | /// your program crashes before the ASan report is printed. |
| 277 | void SANITIZER_CDECL __asan_on_error(void); |
| 278 | |
| 279 | /// Prints accumulated statistics to <c>stderr</c> (useful for calling from the |
| 280 | /// debugger). |
| 281 | void SANITIZER_CDECL __asan_print_accumulated_stats(void); |
| 282 | |
| 283 | /// User-provided default option settings. |
| 284 | /// |
| 285 | /// You can provide your own implementation of this function to return a string |
| 286 | /// containing ASan runtime options (for example, |
| 287 | /// <c>verbosity=1:halt_on_error=0</c>). |
| 288 | /// |
| 289 | /// \returns Default options string. |
| 290 | const char *SANITIZER_CDECL __asan_default_options(void); |
| 291 | |
| 292 | // The following two functions facilitate garbage collection in presence of |
| 293 | // ASan's fake stack. |
| 294 | |
| 295 | /// Gets an opaque handler to the current thread's fake stack. |
| 296 | /// |
| 297 | /// Returns an opaque handler to be used by |
| 298 | /// <c>__asan_addr_is_in_fake_stack()</c>. Returns NULL if the current thread |
| 299 | /// does not have a fake stack. |
| 300 | /// |
| 301 | /// \returns An opaque handler to the fake stack or NULL. |
| 302 | void *SANITIZER_CDECL __asan_get_current_fake_stack(void); |
| 303 | |
| 304 | /// Checks if an address belongs to a given fake stack. |
| 305 | /// |
| 306 | /// If <c><i>fake_stack</i></c> is non-NULL and <c><i>addr</i></c> belongs to a |
| 307 | /// fake frame in <c><i>fake_stack</i></c>, returns the address of the real |
| 308 | /// stack that corresponds to the fake frame and sets <c><i>beg</i></c> and |
| 309 | /// <c><i>end</i></c> to the boundaries of this fake frame. Otherwise returns |
| 310 | /// NULL and does not touch <c><i>beg</i></c> and <c><i>end</i></c>. |
| 311 | /// |
| 312 | /// If <c><i>beg</i></c> or <c><i>end</i></c> are NULL, they are not touched. |
| 313 | /// |
| 314 | /// \note This function can be called from a thread other than the owner of |
| 315 | /// <c><i>fake_stack</i></c>, but the owner thread needs to be alive. |
| 316 | /// |
| 317 | /// \param fake_stack An opaque handler to a fake stack. |
| 318 | /// \param addr Address to test. |
| 319 | /// \param[out] beg Beginning of fake frame. |
| 320 | /// \param[out] end End of fake frame. |
| 321 | /// \returns Stack address or NULL. |
| 322 | void *SANITIZER_CDECL __asan_addr_is_in_fake_stack(void *fake_stack, void *addr, |
| 323 | void **beg, void **end); |
| 324 | |
| 325 | /// Performs shadow memory cleanup of the current thread's stack before a |
| 326 | /// function marked with the <c>[[noreturn]]</c> attribute is called. |
| 327 | /// |
| 328 | /// To avoid false positives on the stack, must be called before no-return |
| 329 | /// functions like <c>_exit()</c> and <c>execl()</c>. |
| 330 | void SANITIZER_CDECL __asan_handle_no_return(void); |
| 331 | |
| 332 | /// Update allocation stack trace for the given allocation to the current stack |
| 333 | /// trace. Returns 1 if successful, 0 if not. |
| 334 | int SANITIZER_CDECL __asan_update_allocation_context(void *addr); |
| 335 | |
| 336 | #ifdef __cplusplus |
| 337 | } // extern "C" |
| 338 | #endif |
| 339 | |
| 340 | #endif // SANITIZER_ASAN_INTERFACE_H |
| 341 | |