asan_interface.h revision 1e172b4bdec57329bf904f063a29f99cddf2d85f
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 181e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#include <stdint.h> // for __WORDSIZE 191e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#include <stdlib.h> // for size_t 201e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 211e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// This header should NOT include any other headers from ASan runtime. 221e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// All functions in this header are extern "C" and start with __asan_. 231e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 241e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyextern "C" { 251e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // This function should be called at the very beginning of the process, 261e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // before any instrumented code is executed and before any call to malloc. 271e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany void __asan_init() 281e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany __attribute__((visibility("default"))); 291e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 301e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // This function should be called by the instrumented code. 311e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // 'addr' is the address of a global variable called 'name' of 'size' bytes. 321e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany void __asan_register_global(uintptr_t addr, size_t size, const char *name) 331e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany __attribute__((visibility("default"))); 341e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 351e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // This structure describes an instrumented global variable. 361e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany struct __asan_global { 371e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany size_t beg; // The address of the global. 381e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany size_t size; // The original size of the global. 391e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany size_t size_with_redzone; // The size with the redzone. 401e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany const char *name; // Name as a C string. 411e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany }; 421e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 431e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // This function should be called by the instrumented code. 441e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // gets an array of structures describing globals. 451e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany void __asan_register_globals(__asan_global *globals, size_t n) 461e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany __attribute__((visibility("default"))); 471e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 481e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // These two functions are used by the instrumented code in the 491e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // use-after-return mode. __asan_stack_malloc allocates size bytes of 501e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // fake stack and __asan_stack_free poisons it. real_stack is a pointer to 511e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // the real stack region. 521e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany size_t __asan_stack_malloc(size_t size, size_t real_stack) 531e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany __attribute__((visibility("default"))); 541e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany void __asan_stack_free(size_t ptr, size_t size, size_t real_stack) 551e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany __attribute__((visibility("default"))); 561e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 571e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // Marks memory region [addr, addr+size) as unaddressable. 581e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // This memory must be previously allocated by the user program. Accessing 591e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // addresses in this region from instrumented code is forbidden until 601e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // this region is unpoisoned. This function is not guaranteed to poison 611e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // the whole region - it may poison only subregion of [addr, addr+size) due 621e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // to ASan alignment restrictions. 631e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // Method is NOT thread-safe in the sense that no two threads can 641e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // (un)poison memory in the same memory region simultaneously. 651e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany void __asan_poison_memory_region(void const volatile *addr, size_t size); 661e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // Marks memory region [addr, addr+size) as addressable. 671e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // This memory must be previously allocated by the user program. Accessing 681e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // addresses in this region is allowed until this region is poisoned again. 691e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // This function may unpoison a superregion of [addr, addr+size) due to 701e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // 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. 731e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany void __asan_unpoison_memory_region(void const volatile *addr, size_t size); 741e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 751e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// User code should use macro instead of functions. 761e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#ifdef ADDRESS_SANITIZER 771e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#define ASAN_POISON_MEMORY_REGION(addr, size) \ 781e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany __asan_poison_memory_region((addr), (size)) 791e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#define ASAN_UNPOISON_MEMORY_REGION(addr, size) \ 801e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany __asan_unpoison_memory_region((addr), (size)) 811e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#else 821e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#define ASAN_POISON_MEMORY_REGION(addr, size) \ 831e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany ((void)(addr), (void)(size)) 841e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#define ASAN_UNPOISON_MEMORY_REGION(addr, size) \ 851e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany ((void)(addr), (void)(size)) 861e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#endif 871e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 881e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // Returns true iff addr is poisoned (i.e. 1-byte read/write access to this 891e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // address will result in error report from AddressSanitizer). 901e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany bool __asan_address_is_poisoned(void const volatile *addr); 911e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 921e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // This is an internal function that is called to report an error. 931e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // However it is still a part of the interface because users may want to 941e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // set a breakpoint on this function in a debugger. 951e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany void __asan_report_error(uintptr_t pc, uintptr_t bp, uintptr_t sp, 961e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany uintptr_t addr, bool is_write, size_t access_size) 971e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany __attribute__((visibility("default"))); 981e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 991e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // Sets the exit code to use when reporting an error. 1001e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // Returns the old value. 1011e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany int __asan_set_error_exit_code(int exit_code); 1021e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 1031e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // Returns the estimated number of bytes that will be reserved by allocator 1041e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // for request of "size" bytes. If ASan allocator can't allocate that much 1051e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // memory, returns the maximal possible allocation size, otherwise returns 1061e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // "size". 1071e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany size_t __asan_get_estimated_allocated_size(size_t size); 1081e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // Returns true if p is NULL or if p was returned by the ASan allocator and 1091e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // is not yet freed. 1101e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany bool __asan_get_ownership(const void *p); 1111e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // Returns the number of bytes reserved for the pointer p. 1121e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // Requires (get_ownership(p) == true). 1131e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany size_t __asan_get_allocated_size(const void *p); 1141e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // Number of bytes, allocated and not yet freed by the application. 1151e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany size_t __asan_get_current_allocated_bytes(); 1161e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // Number of bytes, mmaped by asan allocator to fulfill allocation requests. 1171e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // Generally, for request of X bytes, allocator can reserve and add to free 1181e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // lists a large number of chunks of size X to use them for future requests. 1191e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // All these chunks count toward the heap size. Currently, allocator never 1201e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // releases memory to OS (instead, it just puts freed chunks to free lists). 1211e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany size_t __asan_get_heap_size(); 1221e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // Number of bytes, mmaped by asan allocator, which can be used to fulfill 1231e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // allocation requests. When a user program frees memory chunk, it can first 1241e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // fall into quarantine and will count toward __asan_get_free_bytes() later. 1251e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany size_t __asan_get_free_bytes(); 1261e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // Number of bytes in unmapped pages, that are released to OS. Currently, 1271e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // always returns 0. 1281e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany size_t __asan_get_unmapped_bytes(); 1291e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // Turns on/off statistics update. Returns the previous value. 1301e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany bool __asan_enable_statistics(bool enable); 1311e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // Prints accumulated stats to stderr. Used for debugging. 1321e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany void __asan_print_accumulated_stats(); 1331e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} // namespace 1341e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 1351e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#endif // ASAN_INTERFACE_H 136