blob: 8adf3f17f24bda92dfd0a1b6b426b15167bda06a [file] [log] [blame]
Chandler Carruthd865fec2012-08-29 02:27:54 +00001//===-- sanitizer/asan_interface.h ------------------------------*- C++ -*-===//
Kostya Serebryany1e172b42011-11-30 01:07:02 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
Alexey Samsonovc70fa282013-01-31 13:46:14 +000010// This file is a part of AddressSanitizer.
Kostya Serebryany1e172b42011-11-30 01:07:02 +000011//
Alexey Samsonovc70fa282013-01-31 13:46:14 +000012// Public interface header.
Kostya Serebryany1e172b42011-11-30 01:07:02 +000013//===----------------------------------------------------------------------===//
Chandler Carruthd865fec2012-08-29 02:27:54 +000014#ifndef SANITIZER_ASAN_INTERFACE_H
15#define SANITIZER_ASAN_INTERFACE_H
Kostya Serebryany1e172b42011-11-30 01:07:02 +000016
Chandler Carruthd865fec2012-08-29 02:27:54 +000017#include <sanitizer/common_interface_defs.h>
18
Alexey Samsonovc70fa282013-01-31 13:46:14 +000019#ifdef __cplusplus
Kostya Serebryany1e172b42011-11-30 01:07:02 +000020extern "C" {
Alexey Samsonovc70fa282013-01-31 13:46:14 +000021#endif
Kostya Serebryany1e172b42011-11-30 01:07:02 +000022 // Marks memory region [addr, addr+size) as unaddressable.
23 // This memory must be previously allocated by the user program. Accessing
24 // addresses in this region from instrumented code is forbidden until
25 // this region is unpoisoned. This function is not guaranteed to poison
26 // the whole region - it may poison only subregion of [addr, addr+size) due
27 // to ASan alignment restrictions.
28 // Method is NOT thread-safe in the sense that no two threads can
29 // (un)poison memory in the same memory region simultaneously.
Alexey Samsonovc70fa282013-01-31 13:46:14 +000030 void __asan_poison_memory_region(void const volatile *addr, size_t size);
Kostya Serebryany1e172b42011-11-30 01:07:02 +000031 // Marks memory region [addr, addr+size) as addressable.
32 // This memory must be previously allocated by the user program. Accessing
33 // addresses in this region is allowed until this region is poisoned again.
34 // This function may unpoison a superregion of [addr, addr+size) due to
35 // ASan alignment restrictions.
36 // Method is NOT thread-safe in the sense that no two threads can
37 // (un)poison memory in the same memory region simultaneously.
Alexey Samsonovc70fa282013-01-31 13:46:14 +000038 void __asan_unpoison_memory_region(void const volatile *addr, size_t size);
Kostya Serebryany1e172b42011-11-30 01:07:02 +000039
Kostya Serebryanye31eca92013-02-15 12:00:24 +000040// User code should use macros instead of functions.
41#if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__)
Kostya Serebryany1e172b42011-11-30 01:07:02 +000042#define ASAN_POISON_MEMORY_REGION(addr, size) \
43 __asan_poison_memory_region((addr), (size))
44#define ASAN_UNPOISON_MEMORY_REGION(addr, size) \
45 __asan_unpoison_memory_region((addr), (size))
46#else
47#define ASAN_POISON_MEMORY_REGION(addr, size) \
48 ((void)(addr), (void)(size))
49#define ASAN_UNPOISON_MEMORY_REGION(addr, size) \
50 ((void)(addr), (void)(size))
51#endif
52
53 // Returns true iff addr is poisoned (i.e. 1-byte read/write access to this
54 // address will result in error report from AddressSanitizer).
Alexey Samsonovc70fa282013-01-31 13:46:14 +000055 bool __asan_address_is_poisoned(void const volatile *addr);
Kostya Serebryany1e172b42011-11-30 01:07:02 +000056
Kostya Serebryany681e7752012-12-28 15:28:19 +000057 // If at least on byte in [beg, beg+size) is poisoned, return the address
58 // of the first such byte. Otherwise return 0.
Alexey Samsonovc70fa282013-01-31 13:46:14 +000059 void *__asan_region_is_poisoned(void *beg, size_t size);
Kostya Serebryany681e7752012-12-28 15:28:19 +000060
Kostya Serebryany17a7c672012-12-29 10:18:31 +000061 // Print the description of addr (useful when debugging in gdb).
Alexey Samsonovc70fa282013-01-31 13:46:14 +000062 void __asan_describe_address(void *addr);
Kostya Serebryany17a7c672012-12-29 10:18:31 +000063
Kostya Serebryany1e172b42011-11-30 01:07:02 +000064 // This is an internal function that is called to report an error.
65 // However it is still a part of the interface because users may want to
66 // set a breakpoint on this function in a debugger.
Alexey Samsonovc70fa282013-01-31 13:46:14 +000067 void __asan_report_error(void *pc, void *bp, void *sp,
68 void *addr, bool is_write, size_t access_size);
Kostya Serebryany1e172b42011-11-30 01:07:02 +000069
70 // Sets the exit code to use when reporting an error.
71 // Returns the old value.
Alexey Samsonovc70fa282013-01-31 13:46:14 +000072 int __asan_set_error_exit_code(int exit_code);
Kostya Serebryanye1fe0fd2012-02-13 21:24:29 +000073
74 // Sets the callback to be called right before death on error.
Kostya Serebryany3f4c3872012-05-31 14:35:53 +000075 // Passing 0 will unset the callback.
Alexey Samsonovc70fa282013-01-31 13:46:14 +000076 void __asan_set_death_callback(void (*callback)(void));
Kostya Serebryany1e172b42011-11-30 01:07:02 +000077
Alexey Samsonovc70fa282013-01-31 13:46:14 +000078 void __asan_set_error_report_callback(void (*callback)(const char*));
Alexander Potapenko3fe91352012-02-27 14:06:48 +000079
Alexey Samsonov86633432012-10-02 14:06:39 +000080 // User may provide function that would be called right when ASan detects
81 // an error. This can be used to notice cases when ASan detects an error, but
82 // the program crashes before ASan report is printed.
Alexey Samsonovc70fa282013-01-31 13:46:14 +000083 void __asan_on_error();
Alexey Samsonovf657a192012-08-13 11:23:40 +000084
Alexey Samsonov1ca53572012-10-02 12:11:17 +000085 // User may provide its own implementation for symbolization function.
86 // It should print the description of instruction at address "pc" to
87 // "out_buffer". Description should be at most "out_size" bytes long.
Alexey Samsonovc93d3e22012-08-22 13:31:37 +000088 // User-specified function should return true if symbolization was
89 // successful.
Alexey Samsonovc70fa282013-01-31 13:46:14 +000090 bool __asan_symbolize(const void *pc, char *out_buffer,
91 int out_size);
Alexey Samsonovc93d3e22012-08-22 13:31:37 +000092
Kostya Serebryany1e172b42011-11-30 01:07:02 +000093 // Returns the estimated number of bytes that will be reserved by allocator
94 // for request of "size" bytes. If ASan allocator can't allocate that much
95 // memory, returns the maximal possible allocation size, otherwise returns
96 // "size".
Alexey Samsonovc70fa282013-01-31 13:46:14 +000097 size_t __asan_get_estimated_allocated_size(size_t size);
Alexey Samsonovca2278d2012-01-18 15:26:55 +000098 // Returns true if p was returned by the ASan allocator and
Kostya Serebryany1e172b42011-11-30 01:07:02 +000099 // is not yet freed.
Alexey Samsonovc70fa282013-01-31 13:46:14 +0000100 bool __asan_get_ownership(const void *p);
Kostya Serebryany1e172b42011-11-30 01:07:02 +0000101 // Returns the number of bytes reserved for the pointer p.
Kostya Serebryany3f4c3872012-05-31 14:35:53 +0000102 // Requires (get_ownership(p) == true) or (p == 0).
Alexey Samsonovc70fa282013-01-31 13:46:14 +0000103 size_t __asan_get_allocated_size(const void *p);
Kostya Serebryany1e172b42011-11-30 01:07:02 +0000104 // Number of bytes, allocated and not yet freed by the application.
Alexey Samsonovc70fa282013-01-31 13:46:14 +0000105 size_t __asan_get_current_allocated_bytes();
Kostya Serebryany1e172b42011-11-30 01:07:02 +0000106 // Number of bytes, mmaped by asan allocator to fulfill allocation requests.
107 // Generally, for request of X bytes, allocator can reserve and add to free
108 // lists a large number of chunks of size X to use them for future requests.
109 // All these chunks count toward the heap size. Currently, allocator never
110 // releases memory to OS (instead, it just puts freed chunks to free lists).
Alexey Samsonovc70fa282013-01-31 13:46:14 +0000111 size_t __asan_get_heap_size();
Kostya Serebryany1e172b42011-11-30 01:07:02 +0000112 // Number of bytes, mmaped by asan allocator, which can be used to fulfill
113 // allocation requests. When a user program frees memory chunk, it can first
114 // fall into quarantine and will count toward __asan_get_free_bytes() later.
Alexey Samsonovc70fa282013-01-31 13:46:14 +0000115 size_t __asan_get_free_bytes();
Kostya Serebryany1e172b42011-11-30 01:07:02 +0000116 // Number of bytes in unmapped pages, that are released to OS. Currently,
117 // always returns 0.
Alexey Samsonovc70fa282013-01-31 13:46:14 +0000118 size_t __asan_get_unmapped_bytes();
Kostya Serebryany1e172b42011-11-30 01:07:02 +0000119 // Prints accumulated stats to stderr. Used for debugging.
Alexey Samsonovc70fa282013-01-31 13:46:14 +0000120 void __asan_print_accumulated_stats();
Alexey Samsonovc58b57e2012-08-15 07:11:14 +0000121
Alexey Samsonov6a08d292012-12-07 22:01:28 +0000122 // This function may be optionally provided by user and should return
123 // a string containing ASan runtime options. See asan_flags.h for details.
Alexey Samsonovc70fa282013-01-31 13:46:14 +0000124 const char* __asan_default_options();
Alexey Samsonovb21de9e2012-08-22 10:12:47 +0000125
Alexey Samsonov6a08d292012-12-07 22:01:28 +0000126 // Malloc hooks that may be optionally provided by user.
Alexey Samsonovb21de9e2012-08-22 10:12:47 +0000127 // __asan_malloc_hook(ptr, size) is called immediately after
128 // allocation of "size" bytes, which returned "ptr".
129 // __asan_free_hook(ptr) is called immediately before
130 // deallocation of "ptr".
Alexey Samsonovc70fa282013-01-31 13:46:14 +0000131 void __asan_malloc_hook(void *ptr, size_t size);
132 void __asan_free_hook(void *ptr);
133#ifdef __cplusplus
Alexey Samsonovc58b57e2012-08-15 07:11:14 +0000134} // extern "C"
Alexey Samsonovc70fa282013-01-31 13:46:14 +0000135#endif
Kostya Serebryany1e172b42011-11-30 01:07:02 +0000136
Chandler Carruthd865fec2012-08-29 02:27:54 +0000137#endif // SANITIZER_ASAN_INTERFACE_H