xref: /freebsd/contrib/llvm-project/compiler-rt/include/sanitizer/asan_interface.h (revision a0ca4af9455b844c5e094fc1b09b1390ffa979fc)
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