13cab2bb3Spatrick //===-- msan_interface.h --------------------------------------------------===// 23cab2bb3Spatrick // 33cab2bb3Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 43cab2bb3Spatrick // See https://llvm.org/LICENSE.txt for license information. 53cab2bb3Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 63cab2bb3Spatrick // 73cab2bb3Spatrick //===----------------------------------------------------------------------===// 83cab2bb3Spatrick // 93cab2bb3Spatrick // This file is a part of MemorySanitizer. 103cab2bb3Spatrick // 113cab2bb3Spatrick // Public interface header. 123cab2bb3Spatrick //===----------------------------------------------------------------------===// 133cab2bb3Spatrick #ifndef MSAN_INTERFACE_H 143cab2bb3Spatrick #define MSAN_INTERFACE_H 153cab2bb3Spatrick 163cab2bb3Spatrick #include <sanitizer/common_interface_defs.h> 173cab2bb3Spatrick 183cab2bb3Spatrick #ifdef __cplusplus 193cab2bb3Spatrick extern "C" { 203cab2bb3Spatrick #endif 213cab2bb3Spatrick /* Set raw origin for the memory range. */ 223cab2bb3Spatrick void __msan_set_origin(const volatile void *a, size_t size, uint32_t origin); 233cab2bb3Spatrick 243cab2bb3Spatrick /* Get raw origin for an address. */ 253cab2bb3Spatrick uint32_t __msan_get_origin(const volatile void *a); 263cab2bb3Spatrick 273cab2bb3Spatrick /* Test that this_id is a descendant of prev_id (or they are simply equal). 283cab2bb3Spatrick * "descendant" here means they are part of the same chain, created with 293cab2bb3Spatrick * __msan_chain_origin. */ 303cab2bb3Spatrick int __msan_origin_is_descendant_or_same(uint32_t this_id, uint32_t prev_id); 313cab2bb3Spatrick 323cab2bb3Spatrick /* Returns non-zero if tracking origins. */ 333cab2bb3Spatrick int __msan_get_track_origins(void); 343cab2bb3Spatrick 353cab2bb3Spatrick /* Returns the origin id of the latest UMR in the calling thread. */ 363cab2bb3Spatrick uint32_t __msan_get_umr_origin(void); 373cab2bb3Spatrick 383cab2bb3Spatrick /* Make memory region fully initialized (without changing its contents). */ 393cab2bb3Spatrick void __msan_unpoison(const volatile void *a, size_t size); 403cab2bb3Spatrick 413cab2bb3Spatrick /* Make a null-terminated string fully initialized (without changing its 423cab2bb3Spatrick contents). */ 433cab2bb3Spatrick void __msan_unpoison_string(const volatile char *a); 443cab2bb3Spatrick 453cab2bb3Spatrick /* Make first n parameters of the next function call fully initialized. */ 463cab2bb3Spatrick void __msan_unpoison_param(size_t n); 473cab2bb3Spatrick 483cab2bb3Spatrick /* Make memory region fully uninitialized (without changing its contents). 493cab2bb3Spatrick This is a legacy interface that does not update origin information. Use 503cab2bb3Spatrick __msan_allocated_memory() instead. */ 513cab2bb3Spatrick void __msan_poison(const volatile void *a, size_t size); 523cab2bb3Spatrick 533cab2bb3Spatrick /* Make memory region partially uninitialized (without changing its contents). 543cab2bb3Spatrick */ 553cab2bb3Spatrick void __msan_partial_poison(const volatile void *data, void *shadow, 563cab2bb3Spatrick size_t size); 573cab2bb3Spatrick 583cab2bb3Spatrick /* Returns the offset of the first (at least partially) poisoned byte in the 593cab2bb3Spatrick memory range, or -1 if the whole range is good. */ 603cab2bb3Spatrick intptr_t __msan_test_shadow(const volatile void *x, size_t size); 613cab2bb3Spatrick 623cab2bb3Spatrick /* Checks that memory range is fully initialized, and reports an error if it 633cab2bb3Spatrick * is not. */ 643cab2bb3Spatrick void __msan_check_mem_is_initialized(const volatile void *x, size_t size); 653cab2bb3Spatrick 663cab2bb3Spatrick /* For testing: 673cab2bb3Spatrick __msan_set_expect_umr(1); 683cab2bb3Spatrick ... some buggy code ... 693cab2bb3Spatrick __msan_set_expect_umr(0); 703cab2bb3Spatrick The last line will verify that a UMR happened. */ 713cab2bb3Spatrick void __msan_set_expect_umr(int expect_umr); 723cab2bb3Spatrick 733cab2bb3Spatrick /* Change the value of keep_going flag. Non-zero value means don't terminate 743cab2bb3Spatrick program execution when an error is detected. This will not affect error in 753cab2bb3Spatrick modules that were compiled without the corresponding compiler flag. */ 763cab2bb3Spatrick void __msan_set_keep_going(int keep_going); 773cab2bb3Spatrick 783cab2bb3Spatrick /* Print shadow and origin for the memory range to stderr in a human-readable 793cab2bb3Spatrick format. */ 803cab2bb3Spatrick void __msan_print_shadow(const volatile void *x, size_t size); 813cab2bb3Spatrick 823cab2bb3Spatrick /* Print shadow for the memory range to stderr in a minimalistic 833cab2bb3Spatrick human-readable format. */ 843cab2bb3Spatrick void __msan_dump_shadow(const volatile void *x, size_t size); 853cab2bb3Spatrick 863cab2bb3Spatrick /* Returns true if running under a dynamic tool (DynamoRio-based). */ 873cab2bb3Spatrick int __msan_has_dynamic_component(void); 883cab2bb3Spatrick 893cab2bb3Spatrick /* Tell MSan about newly allocated memory (ex.: custom allocator). 903cab2bb3Spatrick Memory will be marked uninitialized, with origin at the call site. */ 913cab2bb3Spatrick void __msan_allocated_memory(const volatile void* data, size_t size); 923cab2bb3Spatrick 933cab2bb3Spatrick /* Tell MSan about newly destroyed memory. Mark memory as uninitialized. */ 943cab2bb3Spatrick void __sanitizer_dtor_callback(const volatile void* data, size_t size); 95*810390e3Srobert void __sanitizer_dtor_callback_fields(const volatile void *data, size_t size); 96*810390e3Srobert void __sanitizer_dtor_callback_vptr(const volatile void *data); 973cab2bb3Spatrick 983cab2bb3Spatrick /* This function may be optionally provided by user and should return 993cab2bb3Spatrick a string containing Msan runtime options. See msan_flags.h for details. */ 1003cab2bb3Spatrick const char* __msan_default_options(void); 1013cab2bb3Spatrick 1023cab2bb3Spatrick /* Deprecated. Call __sanitizer_set_death_callback instead. */ 1033cab2bb3Spatrick void __msan_set_death_callback(void (*callback)(void)); 1043cab2bb3Spatrick 1053cab2bb3Spatrick /* Update shadow for the application copy of size bytes from src to dst. 1063cab2bb3Spatrick Src and dst are application addresses. This function does not copy the 1073cab2bb3Spatrick actual application memory, it only updates shadow and origin for such 1083cab2bb3Spatrick copy. Source and destination regions can overlap. */ 1093cab2bb3Spatrick void __msan_copy_shadow(const volatile void *dst, const volatile void *src, 1103cab2bb3Spatrick size_t size); 1113cab2bb3Spatrick 1123cab2bb3Spatrick /* Disables uninitialized memory checks in interceptors. */ 1133cab2bb3Spatrick void __msan_scoped_disable_interceptor_checks(void); 1143cab2bb3Spatrick 1153cab2bb3Spatrick /* Re-enables uninitialized memory checks in interceptors after a previous 1163cab2bb3Spatrick call to __msan_scoped_disable_interceptor_checks. */ 1173cab2bb3Spatrick void __msan_scoped_enable_interceptor_checks(void); 1183cab2bb3Spatrick 119d89ec533Spatrick void __msan_start_switch_fiber(const void *bottom, size_t size); 120d89ec533Spatrick void __msan_finish_switch_fiber(const void **bottom_old, size_t *size_old); 121d89ec533Spatrick 1223cab2bb3Spatrick #ifdef __cplusplus 1233cab2bb3Spatrick } // extern "C" 1243cab2bb3Spatrick #endif 1253cab2bb3Spatrick 1263cab2bb3Spatrick #endif 127