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