Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/compiler-rt/include/sanitizer/asan_interface.h
35235 views
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
342