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