xref: /openbsd-src/gnu/llvm/compiler-rt/include/sanitizer/msan_interface.h (revision 810390e339a5425391477d5d41c78d7cab2424ac)
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