msan_interface.h revision 251034
1245614Sandrew//===-- msan_interface.h --------------------------------------------------===// 2245614Sandrew// 3245614Sandrew// The LLVM Compiler Infrastructure 4245614Sandrew// 5245614Sandrew// This file is distributed under the University of Illinois Open Source 6245614Sandrew// License. See LICENSE.TXT for details. 7245614Sandrew// 8245614Sandrew//===----------------------------------------------------------------------===// 9245614Sandrew// 10245614Sandrew// This file is a part of MemorySanitizer. 11245614Sandrew// 12245614Sandrew// Public interface header. 13245614Sandrew//===----------------------------------------------------------------------===// 14245614Sandrew#ifndef MSAN_INTERFACE_H 15245614Sandrew#define MSAN_INTERFACE_H 16245614Sandrew 17245614Sandrew#include <sanitizer/common_interface_defs.h> 18245614Sandrew 19245614Sandrew#ifdef __cplusplus 20245614Sandrewextern "C" { 21245614Sandrew#endif 22245614Sandrew 23251034Sed#if __has_feature(memory_sanitizer) 24251034Sed /* Returns a string describing a stack origin. 25251034Sed Return NULL if the origin is invalid, or is not a stack origin. */ 26251034Sed const char *__msan_get_origin_descr_if_stack(uint32_t id); 27245614Sandrew 28245614Sandrew 29251034Sed /* Set raw origin for the memory range. */ 30251034Sed void __msan_set_origin(const void *a, size_t size, uint32_t origin); 31245614Sandrew 32251034Sed /* Get raw origin for an address. */ 33251034Sed uint32_t __msan_get_origin(const void *a); 34245614Sandrew 35251034Sed /* Returns non-zero if tracking origins. */ 36251034Sed int __msan_get_track_origins(); 37245614Sandrew 38251034Sed /* Returns the origin id of the latest UMR in the calling thread. */ 39251034Sed uint32_t __msan_get_umr_origin(); 40245614Sandrew 41251034Sed /* Make memory region fully initialized (without changing its contents). */ 42251034Sed void __msan_unpoison(const void *a, size_t size); 43245614Sandrew 44251034Sed /* Make memory region fully uninitialized (without changing its contents). */ 45251034Sed void __msan_poison(const void *a, size_t size); 46245614Sandrew 47251034Sed /* Make memory region partially uninitialized (without changing its contents). 48251034Sed */ 49251034Sed void __msan_partial_poison(const void* data, void* shadow, size_t size); 50245614Sandrew 51251034Sed /* Returns the offset of the first (at least partially) poisoned byte in the 52251034Sed memory range, or -1 if the whole range is good. */ 53251034Sed intptr_t __msan_test_shadow(const void *x, size_t size); 54245614Sandrew 55251034Sed /* Set exit code when error(s) were detected. 56251034Sed Value of 0 means don't change the program exit code. */ 57251034Sed void __msan_set_exit_code(int exit_code); 58245614Sandrew 59251034Sed /* For testing: 60251034Sed __msan_set_expect_umr(1); 61251034Sed ... some buggy code ... 62251034Sed __msan_set_expect_umr(0); 63251034Sed The last line will verify that a UMR happened. */ 64251034Sed void __msan_set_expect_umr(int expect_umr); 65245614Sandrew 66251034Sed /* Print shadow and origin for the memory range to stdout in a human-readable 67251034Sed format. */ 68251034Sed void __msan_print_shadow(const void *x, size_t size); 69245614Sandrew 70251034Sed /* Print current function arguments shadow and origin to stdout in a 71251034Sed human-readable format. */ 72251034Sed void __msan_print_param_shadow(); 73245614Sandrew 74251034Sed /* Returns true if running under a dynamic tool (DynamoRio-based). */ 75251034Sed int __msan_has_dynamic_component(); 76245614Sandrew 77251034Sed /* Tell MSan about newly allocated memory (ex.: custom allocator). 78251034Sed Memory will be marked uninitialized, with origin at the call site. */ 79251034Sed void __msan_allocated_memory(const void* data, size_t size); 80251034Sed 81251034Sed#else // __has_feature(memory_sanitizer) 82251034Sed 83251034Sed#define __msan_get_origin_descr_if_stack(id) ((const char*)0) 84251034Sed#define __msan_set_origin(a, size, origin) 85251034Sed#define __msan_get_origin(a) ((uint32_t)-1) 86251034Sed#define __msan_get_track_origins() (0) 87251034Sed#define __msan_get_umr_origin() ((uint32_t)-1) 88251034Sed#define __msan_unpoison(a, size) 89251034Sed#define __msan_poison(a, size) 90251034Sed#define __msan_partial_poison(data, shadow, size) 91251034Sed#define __msan_test_shadow(x, size) ((intptr_t)-1) 92251034Sed#define __msan_set_exit_code(exit_code) 93251034Sed#define __msan_set_expect_umr(expect_umr) 94251034Sed#define __msan_print_shadow(x, size) 95251034Sed#define __msan_print_param_shadow() 96251034Sed#define __msan_has_dynamic_component() (0) 97251034Sed#define __msan_allocated_memory(data, size) 98251034Sed 99251034Sed#endif // __has_feature(memory_sanitizer) 100251034Sed 101245614Sandrew#ifdef __cplusplus 102245614Sandrew} // extern "C" 103245614Sandrew#endif 104245614Sandrew 105245614Sandrew#endif 106