15cb0ca83bcae67c4ba026f2498c4da69b44d8142Evgeniy Stepanov//===-- msan_interface.h --------------------------------------------------===//
25cb0ca83bcae67c4ba026f2498c4da69b44d8142Evgeniy Stepanov//
35cb0ca83bcae67c4ba026f2498c4da69b44d8142Evgeniy Stepanov//                     The LLVM Compiler Infrastructure
45cb0ca83bcae67c4ba026f2498c4da69b44d8142Evgeniy Stepanov//
55cb0ca83bcae67c4ba026f2498c4da69b44d8142Evgeniy Stepanov// This file is distributed under the University of Illinois Open Source
65cb0ca83bcae67c4ba026f2498c4da69b44d8142Evgeniy Stepanov// License. See LICENSE.TXT for details.
75cb0ca83bcae67c4ba026f2498c4da69b44d8142Evgeniy Stepanov//
85cb0ca83bcae67c4ba026f2498c4da69b44d8142Evgeniy Stepanov//===----------------------------------------------------------------------===//
95cb0ca83bcae67c4ba026f2498c4da69b44d8142Evgeniy Stepanov//
105cb0ca83bcae67c4ba026f2498c4da69b44d8142Evgeniy Stepanov// This file is a part of MemorySanitizer.
115cb0ca83bcae67c4ba026f2498c4da69b44d8142Evgeniy Stepanov//
125cb0ca83bcae67c4ba026f2498c4da69b44d8142Evgeniy Stepanov// Public interface header.
135cb0ca83bcae67c4ba026f2498c4da69b44d8142Evgeniy Stepanov//===----------------------------------------------------------------------===//
145cb0ca83bcae67c4ba026f2498c4da69b44d8142Evgeniy Stepanov#ifndef MSAN_INTERFACE_H
155cb0ca83bcae67c4ba026f2498c4da69b44d8142Evgeniy Stepanov#define MSAN_INTERFACE_H
165cb0ca83bcae67c4ba026f2498c4da69b44d8142Evgeniy Stepanov
175cb0ca83bcae67c4ba026f2498c4da69b44d8142Evgeniy Stepanov#include <sanitizer/common_interface_defs.h>
185cb0ca83bcae67c4ba026f2498c4da69b44d8142Evgeniy Stepanov
195cb0ca83bcae67c4ba026f2498c4da69b44d8142Evgeniy Stepanov#ifdef __cplusplus
205cb0ca83bcae67c4ba026f2498c4da69b44d8142Evgeniy Stepanovextern "C" {
215cb0ca83bcae67c4ba026f2498c4da69b44d8142Evgeniy Stepanov#endif
2212c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  /* Set raw origin for the memory range. */
231e7a3d7ebebf7e2b7b44e2946d33ae127b94c064Evgeniy Stepanov  void __msan_set_origin(const volatile void *a, size_t size, uint32_t origin);
2412c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov
2512c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  /* Get raw origin for an address. */
261e7a3d7ebebf7e2b7b44e2946d33ae127b94c064Evgeniy Stepanov  uint32_t __msan_get_origin(const volatile void *a);
2712c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov
2812c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  /* Returns non-zero if tracking origins. */
2912c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  int __msan_get_track_origins();
3012c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov
3112c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  /* Returns the origin id of the latest UMR in the calling thread. */
32250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  uint32_t __msan_get_umr_origin();
3312c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov
3412c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  /* Make memory region fully initialized (without changing its contents). */
351e7a3d7ebebf7e2b7b44e2946d33ae127b94c064Evgeniy Stepanov  void __msan_unpoison(const volatile void *a, size_t size);
3612c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov
372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  /* Make a null-terminated string fully initialized (without changing its
382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines     contents). */
392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  void __msan_unpoison_string(const volatile char *a);
402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
4112c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  /* Make memory region fully uninitialized (without changing its contents). */
421e7a3d7ebebf7e2b7b44e2946d33ae127b94c064Evgeniy Stepanov  void __msan_poison(const volatile void *a, size_t size);
4312c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov
4412c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  /* Make memory region partially uninitialized (without changing its contents).
4512c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov   */
461e7a3d7ebebf7e2b7b44e2946d33ae127b94c064Evgeniy Stepanov  void __msan_partial_poison(const volatile void *data, void *shadow,
471e7a3d7ebebf7e2b7b44e2946d33ae127b94c064Evgeniy Stepanov                             size_t size);
4812c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov
4912c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  /* Returns the offset of the first (at least partially) poisoned byte in the
5012c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov     memory range, or -1 if the whole range is good. */
511e7a3d7ebebf7e2b7b44e2946d33ae127b94c064Evgeniy Stepanov  intptr_t __msan_test_shadow(const volatile void *x, size_t size);
5212c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov
532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  /* Checks that memory range is fully initialized, and reports an error if it
542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines   * is not. */
552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  void __msan_check_mem_is_initialized(const volatile void *x, size_t size);
562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
5712c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  /* Set exit code when error(s) were detected.
5812c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov     Value of 0 means don't change the program exit code. */
5912c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  void __msan_set_exit_code(int exit_code);
6012c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov
6112c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  /* For testing:
6212c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov     __msan_set_expect_umr(1);
6312c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov     ... some buggy code ...
6412c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov     __msan_set_expect_umr(0);
6512c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov     The last line will verify that a UMR happened. */
6612c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  void __msan_set_expect_umr(int expect_umr);
6712c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov
68bb881c736eff073a84cc640d431ae1e58a5e07d4Evgeniy Stepanov  /* Change the value of keep_going flag. Non-zero value means don't terminate
69bb881c736eff073a84cc640d431ae1e58a5e07d4Evgeniy Stepanov     program execution when an error is detected. This will not affect error in
70bb881c736eff073a84cc640d431ae1e58a5e07d4Evgeniy Stepanov     modules that were compiled without the corresponding compiler flag. */
71bb881c736eff073a84cc640d431ae1e58a5e07d4Evgeniy Stepanov  void __msan_set_keep_going(int keep_going);
72bb881c736eff073a84cc640d431ae1e58a5e07d4Evgeniy Stepanov
732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  /* Print shadow and origin for the memory range to stderr in a human-readable
7412c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov     format. */
751e7a3d7ebebf7e2b7b44e2946d33ae127b94c064Evgeniy Stepanov  void __msan_print_shadow(const volatile void *x, size_t size);
7612c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov
772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  /* Print shadow for the memory range to stderr in a minimalistic
7812c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov     human-readable format. */
792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  void __msan_dump_shadow(const volatile void *x, size_t size);
8012c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov
8112c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  /* Returns true if running under a dynamic tool (DynamoRio-based). */
8212c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  int  __msan_has_dynamic_component();
8312c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov
8412c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  /* Tell MSan about newly allocated memory (ex.: custom allocator).
8512c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov     Memory will be marked uninitialized, with origin at the call site. */
861e7a3d7ebebf7e2b7b44e2946d33ae127b94c064Evgeniy Stepanov  void __msan_allocated_memory(const volatile void* data, size_t size);
8712c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov
885c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  /* This function may be optionally provided by user and should return
895c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov     a string containing Msan runtime options. See msan_flags.h for details. */
905c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  const char* __msan_default_options();
915c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov
925d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  /* Sets the callback to be called right before death on error.
935d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines     Passing 0 will unset the callback. */
942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  void __msan_set_death_callback(void (*callback)(void));
955c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov
965c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  /***********************************/
975c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  /* Allocator statistics interface. */
985c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov
995c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  /* Returns the estimated number of bytes that will be reserved by allocator
1005c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov     for request of "size" bytes. If Msan allocator can't allocate that much
1015c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov     memory, returns the maximal possible allocation size, otherwise returns
1025c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov     "size". */
1035d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  /* DEPRECATED: Use __sanitizer_get_estimated_allocated_size instead. */
1045c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  size_t __msan_get_estimated_allocated_size(size_t size);
1055c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov
1065c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  /* Returns true if p was returned by the Msan allocator and
1075c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov     is not yet freed. */
1085d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  /* DEPRECATED: Use __sanitizer_get_ownership instead. */
1091e7a3d7ebebf7e2b7b44e2946d33ae127b94c064Evgeniy Stepanov  int __msan_get_ownership(const volatile void *p);
1105c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov
1115c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  /* Returns the number of bytes reserved for the pointer p.
1125c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov     Requires (get_ownership(p) == true) or (p == 0). */
1135d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  /* DEPRECATED: Use __sanitizer_get_allocated_size instead. */
1141e7a3d7ebebf7e2b7b44e2946d33ae127b94c064Evgeniy Stepanov  size_t __msan_get_allocated_size(const volatile void *p);
1155c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov
1165c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  /* Number of bytes, allocated and not yet freed by the application. */
1175d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  /* DEPRECATED: Use __sanitizer_get_current_allocated_bytes instead. */
1185c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  size_t __msan_get_current_allocated_bytes();
1195c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov
1205c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  /* Number of bytes, mmaped by msan allocator to fulfill allocation requests.
1215c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov     Generally, for request of X bytes, allocator can reserve and add to free
1225c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov     lists a large number of chunks of size X to use them for future requests.
1235c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov     All these chunks count toward the heap size. Currently, allocator never
1245c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov     releases memory to OS (instead, it just puts freed chunks to free
1255c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov     lists). */
1265d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  /* DEPRECATED: Use __sanitizer_get_heap_size instead. */
1275c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  size_t __msan_get_heap_size();
1285c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov
1295c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  /* Number of bytes, mmaped by msan allocator, which can be used to fulfill
1305c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov     allocation requests. When a user program frees memory chunk, it can first
1315c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov     fall into quarantine and will count toward __msan_get_free_bytes()
1325c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov     later. */
1335d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  /* DEPRECATED: Use __sanitizer_get_free_bytes instead. */
1345c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  size_t __msan_get_free_bytes();
1355c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov
1365c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  /* Number of bytes in unmapped pages, that are released to OS. Currently,
1375c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov     always returns 0. */
1385d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  /* DEPRECATED: Use __sanitizer_get_unmapped_bytes instead. */
1395c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  size_t __msan_get_unmapped_bytes();
1405c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov
1415c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  /* Malloc hooks that may be optionally provided by user.
1425c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov     __msan_malloc_hook(ptr, size) is called immediately after
1435c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov       allocation of "size" bytes, which returned "ptr".
1445c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov     __msan_free_hook(ptr) is called immediately before
1455c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov       deallocation of "ptr". */
1465d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  /* DEPRECATED: Use __sanitizer_malloc_hook / __sanitizer_free_hook instead. */
1471e7a3d7ebebf7e2b7b44e2946d33ae127b94c064Evgeniy Stepanov  void __msan_malloc_hook(const volatile void *ptr, size_t size);
1481e7a3d7ebebf7e2b7b44e2946d33ae127b94c064Evgeniy Stepanov  void __msan_free_hook(const volatile void *ptr);
1495d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
1505cb0ca83bcae67c4ba026f2498c4da69b44d8142Evgeniy Stepanov#ifdef __cplusplus
1515cb0ca83bcae67c4ba026f2498c4da69b44d8142Evgeniy Stepanov}  // extern "C"
1525cb0ca83bcae67c4ba026f2498c4da69b44d8142Evgeniy Stepanov#endif
1535cb0ca83bcae67c4ba026f2498c4da69b44d8142Evgeniy Stepanov
1545cb0ca83bcae67c4ba026f2498c4da69b44d8142Evgeniy Stepanov#endif
155