11e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany//===-- asan_interface.h ----------------------------------------*- C++ -*-===// 21e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// 31e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// The LLVM Compiler Infrastructure 41e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// 51e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// This file is distributed under the University of Illinois Open Source 61e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// License. See LICENSE.TXT for details. 71e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// 81e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany//===----------------------------------------------------------------------===// 91e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// 101e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// This file is a part of AddressSanitizer, an address sanity checker. 111e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// 121e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// This header can be included by the instrumented program to fetch 131e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// data (mostly allocator statistics) from ASan runtime library. 141e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany//===----------------------------------------------------------------------===// 151e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#ifndef ASAN_INTERFACE_H 161e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#define ASAN_INTERFACE_H 171e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 18b823e3c5f7891dbbde1eb288237f5f3d5ed64d85Alexey Samsonov// ----------- ATTENTION ------------- 19b823e3c5f7891dbbde1eb288237f5f3d5ed64d85Alexey Samsonov// This header should NOT include any other headers from ASan runtime. 20b823e3c5f7891dbbde1eb288237f5f3d5ed64d85Alexey Samsonov// All functions in this header are extern "C" and start with __asan_. 21b823e3c5f7891dbbde1eb288237f5f3d5ed64d85Alexey Samsonov 226f0452914ec76c786eb865983793bc03b00fc7b6Alexander Potapenko#if !defined(_WIN32) 23669f543c1400f7a1b9a48313d2f95e54f750bd4bKostya Serebryany#include <stdint.h> // for uintptr_t 24669f543c1400f7a1b9a48313d2f95e54f750bd4bKostya Serebryany#define ASAN_INTERFACE_FUNCTION_ATTRIBUTE __attribute__((visibility("default"))) 256f0452914ec76c786eb865983793bc03b00fc7b6Alexander Potapenko#else 26669f543c1400f7a1b9a48313d2f95e54f750bd4bKostya Serebryany// TODO(timurrrr): find out what we need on Windows. __declspec(dllexport) ? 27669f543c1400f7a1b9a48313d2f95e54f750bd4bKostya Serebryany#define ASAN_INTERFACE_FUNCTION_ATTRIBUTE 286f0452914ec76c786eb865983793bc03b00fc7b6Alexander Potapenko#endif 29b823e3c5f7891dbbde1eb288237f5f3d5ed64d85Alexey Samsonov#include <stddef.h> // for size_t 301e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 311e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyextern "C" { 321e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // This function should be called at the very beginning of the process, 331e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // before any instrumented code is executed and before any call to malloc. 34669f543c1400f7a1b9a48313d2f95e54f750bd4bKostya Serebryany void __asan_init() ASAN_INTERFACE_FUNCTION_ATTRIBUTE; 351e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 361e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // This function should be called by the instrumented code. 371e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // 'addr' is the address of a global variable called 'name' of 'size' bytes. 381e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany void __asan_register_global(uintptr_t addr, size_t size, const char *name) 39669f543c1400f7a1b9a48313d2f95e54f750bd4bKostya Serebryany ASAN_INTERFACE_FUNCTION_ATTRIBUTE; 401e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 411e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // This structure describes an instrumented global variable. 421e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany struct __asan_global { 431e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany size_t beg; // The address of the global. 441e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany size_t size; // The original size of the global. 451e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany size_t size_with_redzone; // The size with the redzone. 461e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany const char *name; // Name as a C string. 471e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany }; 481e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 49c491061eddb0bb7047470b2746cbcbfe7730b2a9Kostya Serebryany // These two functions should be called by the instrumented code. 50c491061eddb0bb7047470b2746cbcbfe7730b2a9Kostya Serebryany // 'globals' is an array of structures describing 'n' globals. 511e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany void __asan_register_globals(__asan_global *globals, size_t n) 52669f543c1400f7a1b9a48313d2f95e54f750bd4bKostya Serebryany ASAN_INTERFACE_FUNCTION_ATTRIBUTE; 53c491061eddb0bb7047470b2746cbcbfe7730b2a9Kostya Serebryany void __asan_unregister_globals(__asan_global *globals, size_t n) 54669f543c1400f7a1b9a48313d2f95e54f750bd4bKostya Serebryany ASAN_INTERFACE_FUNCTION_ATTRIBUTE; 551e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 561e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // These two functions are used by the instrumented code in the 571e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // use-after-return mode. __asan_stack_malloc allocates size bytes of 581e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // fake stack and __asan_stack_free poisons it. real_stack is a pointer to 591e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // the real stack region. 601e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany size_t __asan_stack_malloc(size_t size, size_t real_stack) 61669f543c1400f7a1b9a48313d2f95e54f750bd4bKostya Serebryany ASAN_INTERFACE_FUNCTION_ATTRIBUTE; 621e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany void __asan_stack_free(size_t ptr, size_t size, size_t real_stack) 63669f543c1400f7a1b9a48313d2f95e54f750bd4bKostya Serebryany ASAN_INTERFACE_FUNCTION_ATTRIBUTE; 641e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 651e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // Marks memory region [addr, addr+size) as unaddressable. 661e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // This memory must be previously allocated by the user program. Accessing 671e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // addresses in this region from instrumented code is forbidden until 681e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // this region is unpoisoned. This function is not guaranteed to poison 691e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // the whole region - it may poison only subregion of [addr, addr+size) due 701e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // to ASan alignment restrictions. 711e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // Method is NOT thread-safe in the sense that no two threads can 721e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // (un)poison memory in the same memory region simultaneously. 73c85f91f745884e8f9bc243b506e89a4e50260e11Evgeniy Stepanov void __asan_poison_memory_region(void const volatile *addr, size_t size) 74c85f91f745884e8f9bc243b506e89a4e50260e11Evgeniy Stepanov ASAN_INTERFACE_FUNCTION_ATTRIBUTE; 751e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // Marks memory region [addr, addr+size) as addressable. 761e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // This memory must be previously allocated by the user program. Accessing 771e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // addresses in this region is allowed until this region is poisoned again. 781e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // This function may unpoison a superregion of [addr, addr+size) due to 791e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // ASan alignment restrictions. 801e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // Method is NOT thread-safe in the sense that no two threads can 811e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // (un)poison memory in the same memory region simultaneously. 82c85f91f745884e8f9bc243b506e89a4e50260e11Evgeniy Stepanov void __asan_unpoison_memory_region(void const volatile *addr, size_t size) 83c85f91f745884e8f9bc243b506e89a4e50260e11Evgeniy Stepanov ASAN_INTERFACE_FUNCTION_ATTRIBUTE; 841e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 85f54b1f9b73a6855d77ee270c282bd61407fa73a0Kostya Serebryany // Performs cleanup before a NoReturn function. Must be called before things 86f54b1f9b73a6855d77ee270c282bd61407fa73a0Kostya Serebryany // like _exit and execl to avoid false positives on stack. 87e1fe0fd868886b53cb8d5d957afebbdd47688df7Kostya Serebryany void __asan_handle_no_return() ASAN_INTERFACE_FUNCTION_ATTRIBUTE; 88f54b1f9b73a6855d77ee270c282bd61407fa73a0Kostya Serebryany 891e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// User code should use macro instead of functions. 90850a49ecb344a71d62347bbee8042ae13b624033Kostya Serebryany#if !defined(__has_feature) 91850a49ecb344a71d62347bbee8042ae13b624033Kostya Serebryany#define __has_feature(x) 0 92850a49ecb344a71d62347bbee8042ae13b624033Kostya Serebryany#endif 93850a49ecb344a71d62347bbee8042ae13b624033Kostya Serebryany#if __has_feature(address_sanitizer) 941e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#define ASAN_POISON_MEMORY_REGION(addr, size) \ 951e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany __asan_poison_memory_region((addr), (size)) 961e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#define ASAN_UNPOISON_MEMORY_REGION(addr, size) \ 971e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany __asan_unpoison_memory_region((addr), (size)) 981e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#else 991e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#define ASAN_POISON_MEMORY_REGION(addr, size) \ 1001e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany ((void)(addr), (void)(size)) 1011e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#define ASAN_UNPOISON_MEMORY_REGION(addr, size) \ 1021e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany ((void)(addr), (void)(size)) 1031e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#endif 1041e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 1051e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // Returns true iff addr is poisoned (i.e. 1-byte read/write access to this 1061e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // address will result in error report from AddressSanitizer). 107c85f91f745884e8f9bc243b506e89a4e50260e11Evgeniy Stepanov bool __asan_address_is_poisoned(void const volatile *addr) 108c85f91f745884e8f9bc243b506e89a4e50260e11Evgeniy Stepanov ASAN_INTERFACE_FUNCTION_ATTRIBUTE; 1091e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 1101e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // This is an internal function that is called to report an error. 1111e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // However it is still a part of the interface because users may want to 1121e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // set a breakpoint on this function in a debugger. 1131e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany void __asan_report_error(uintptr_t pc, uintptr_t bp, uintptr_t sp, 1141e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany uintptr_t addr, bool is_write, size_t access_size) 115669f543c1400f7a1b9a48313d2f95e54f750bd4bKostya Serebryany ASAN_INTERFACE_FUNCTION_ATTRIBUTE; 1161e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 1171e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // Sets the exit code to use when reporting an error. 1181e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // Returns the old value. 119e1fe0fd868886b53cb8d5d957afebbdd47688df7Kostya Serebryany int __asan_set_error_exit_code(int exit_code) 120e1fe0fd868886b53cb8d5d957afebbdd47688df7Kostya Serebryany ASAN_INTERFACE_FUNCTION_ATTRIBUTE; 121e1fe0fd868886b53cb8d5d957afebbdd47688df7Kostya Serebryany 122e1fe0fd868886b53cb8d5d957afebbdd47688df7Kostya Serebryany // Sets the callback to be called right before death on error. 123e1fe0fd868886b53cb8d5d957afebbdd47688df7Kostya Serebryany // Passing NULL will unset the callback. 124e1fe0fd868886b53cb8d5d957afebbdd47688df7Kostya Serebryany void __asan_set_death_callback(void (*callback)(void)) 125e1fe0fd868886b53cb8d5d957afebbdd47688df7Kostya Serebryany ASAN_INTERFACE_FUNCTION_ATTRIBUTE; 1261e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 1273fe913558354f76707e2c5584559521399854b79Alexander Potapenko void __asan_set_error_report_callback(void (*callback)(const char*)) 1283fe913558354f76707e2c5584559521399854b79Alexander Potapenko ASAN_INTERFACE_FUNCTION_ATTRIBUTE; 1293fe913558354f76707e2c5584559521399854b79Alexander Potapenko 1301e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // Returns the estimated number of bytes that will be reserved by allocator 1311e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // for request of "size" bytes. If ASan allocator can't allocate that much 1321e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // memory, returns the maximal possible allocation size, otherwise returns 1331e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // "size". 134c85f91f745884e8f9bc243b506e89a4e50260e11Evgeniy Stepanov size_t __asan_get_estimated_allocated_size(size_t size) 135c85f91f745884e8f9bc243b506e89a4e50260e11Evgeniy Stepanov ASAN_INTERFACE_FUNCTION_ATTRIBUTE; 136ca2278dacaf75a6c45473d962a331181883df02cAlexey Samsonov // Returns true if p was returned by the ASan allocator and 1371e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // is not yet freed. 138c85f91f745884e8f9bc243b506e89a4e50260e11Evgeniy Stepanov bool __asan_get_ownership(const void *p) 139c85f91f745884e8f9bc243b506e89a4e50260e11Evgeniy Stepanov ASAN_INTERFACE_FUNCTION_ATTRIBUTE; 1401e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // Returns the number of bytes reserved for the pointer p. 141ca2278dacaf75a6c45473d962a331181883df02cAlexey Samsonov // Requires (get_ownership(p) == true) or (p == NULL). 142c85f91f745884e8f9bc243b506e89a4e50260e11Evgeniy Stepanov size_t __asan_get_allocated_size(const void *p) 143c85f91f745884e8f9bc243b506e89a4e50260e11Evgeniy Stepanov ASAN_INTERFACE_FUNCTION_ATTRIBUTE; 1441e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // Number of bytes, allocated and not yet freed by the application. 145c85f91f745884e8f9bc243b506e89a4e50260e11Evgeniy Stepanov size_t __asan_get_current_allocated_bytes() 146c85f91f745884e8f9bc243b506e89a4e50260e11Evgeniy Stepanov ASAN_INTERFACE_FUNCTION_ATTRIBUTE; 1471e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // Number of bytes, mmaped by asan allocator to fulfill allocation requests. 1481e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // Generally, for request of X bytes, allocator can reserve and add to free 1491e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // lists a large number of chunks of size X to use them for future requests. 1501e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // All these chunks count toward the heap size. Currently, allocator never 1511e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // releases memory to OS (instead, it just puts freed chunks to free lists). 152c85f91f745884e8f9bc243b506e89a4e50260e11Evgeniy Stepanov size_t __asan_get_heap_size() 153c85f91f745884e8f9bc243b506e89a4e50260e11Evgeniy Stepanov ASAN_INTERFACE_FUNCTION_ATTRIBUTE; 1541e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // Number of bytes, mmaped by asan allocator, which can be used to fulfill 1551e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // allocation requests. When a user program frees memory chunk, it can first 1561e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // fall into quarantine and will count toward __asan_get_free_bytes() later. 157c85f91f745884e8f9bc243b506e89a4e50260e11Evgeniy Stepanov size_t __asan_get_free_bytes() 158c85f91f745884e8f9bc243b506e89a4e50260e11Evgeniy Stepanov ASAN_INTERFACE_FUNCTION_ATTRIBUTE; 1591e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // Number of bytes in unmapped pages, that are released to OS. Currently, 1601e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // always returns 0. 161c85f91f745884e8f9bc243b506e89a4e50260e11Evgeniy Stepanov size_t __asan_get_unmapped_bytes() 162c85f91f745884e8f9bc243b506e89a4e50260e11Evgeniy Stepanov ASAN_INTERFACE_FUNCTION_ATTRIBUTE; 1631e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // Prints accumulated stats to stderr. Used for debugging. 164c85f91f745884e8f9bc243b506e89a4e50260e11Evgeniy Stepanov void __asan_print_accumulated_stats() 165c85f91f745884e8f9bc243b506e89a4e50260e11Evgeniy Stepanov ASAN_INTERFACE_FUNCTION_ATTRIBUTE; 1661e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} // namespace 1671e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 168669f543c1400f7a1b9a48313d2f95e54f750bd4bKostya Serebryany#undef ASAN_INTERFACE_FUNCTION_ATTRIBUTE 1691e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#endif // ASAN_INTERFACE_H 170