msan.h revision 5d71de26cedae3dafc17449fe0182045c0bd20e8
1//===-- msan.h --------------------------------------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file is a part of MemorySanitizer. 11// 12// Private MSan header. 13//===----------------------------------------------------------------------===// 14 15#ifndef MSAN_H 16#define MSAN_H 17 18#include "sanitizer_common/sanitizer_flags.h" 19#include "sanitizer_common/sanitizer_internal_defs.h" 20#include "sanitizer_common/sanitizer_stacktrace.h" 21#include "msan_interface_internal.h" 22#include "msan_flags.h" 23 24#ifndef MSAN_REPLACE_OPERATORS_NEW_AND_DELETE 25# define MSAN_REPLACE_OPERATORS_NEW_AND_DELETE 1 26#endif 27 28#define MEM_TO_SHADOW(mem) (((uptr)mem) & ~0x400000000000ULL) 29#define SHADOW_TO_ORIGIN(shadow) (((uptr)shadow) + 0x200000000000ULL) 30#define MEM_TO_ORIGIN(mem) (SHADOW_TO_ORIGIN(MEM_TO_SHADOW(mem))) 31#define MEM_IS_APP(mem) ((uptr)mem >= 0x600000000000ULL) 32#define MEM_IS_SHADOW(mem) \ 33 ((uptr)mem >= 0x200000000000ULL && (uptr)mem <= 0x400000000000ULL) 34 35const int kMsanParamTlsSizeInWords = 100; 36const int kMsanRetvalTlsSizeInWords = 100; 37 38namespace __msan { 39extern int msan_inited; 40extern bool msan_init_is_running; 41extern int msan_report_count; 42 43bool ProtectRange(uptr beg, uptr end); 44bool InitShadow(bool prot1, bool prot2, bool map_shadow, bool init_origins); 45char *GetProcSelfMaps(); 46void InitializeInterceptors(); 47 48void MsanAllocatorThreadFinish(); 49void *MsanReallocate(StackTrace *stack, void *oldp, uptr size, 50 uptr alignment, bool zeroise); 51void MsanDeallocate(StackTrace *stack, void *ptr); 52void InstallTrapHandler(); 53void InstallAtExitHandler(); 54void ReplaceOperatorsNewAndDelete(); 55 56const char *GetStackOriginDescr(u32 id, uptr *pc); 57 58void EnterSymbolizer(); 59void ExitSymbolizer(); 60bool IsInSymbolizer(); 61 62struct SymbolizerScope { 63 SymbolizerScope() { EnterSymbolizer(); } 64 ~SymbolizerScope() { ExitSymbolizer(); } 65}; 66 67void EnterLoader(); 68void ExitLoader(); 69 70void MsanDie(); 71void PrintWarning(uptr pc, uptr bp); 72void PrintWarningWithOrigin(uptr pc, uptr bp, u32 origin); 73 74void GetStackTrace(StackTrace *stack, uptr max_s, uptr pc, uptr bp, 75 bool request_fast_unwind); 76 77void ReportUMR(StackTrace *stack, u32 origin); 78void ReportExpectedUMRNotFound(StackTrace *stack); 79void ReportStats(); 80void ReportAtExitStatistics(); 81void DescribeMemoryRange(const void *x, uptr size); 82void ReportUMRInsideAddressRange(const char *what, const void *start, uptr size, 83 uptr offset); 84 85// Unpoison first n function arguments. 86void UnpoisonParam(uptr n); 87void UnpoisonThreadLocalState(); 88 89u32 GetOriginIfPoisoned(uptr a, uptr size); 90void SetOriginIfPoisoned(uptr addr, uptr src_shadow, uptr size, u32 src_origin); 91void CopyOrigin(void *dst, const void *src, uptr size, StackTrace *stack); 92void MovePoison(void *dst, const void *src, uptr size, StackTrace *stack); 93void CopyPoison(void *dst, const void *src, uptr size, StackTrace *stack); 94 95// Returns a "chained" origin id, pointing to the given stack trace followed by 96// the previous origin id. 97u32 ChainOrigin(u32 id, StackTrace *stack); 98 99#define GET_MALLOC_STACK_TRACE \ 100 StackTrace stack; \ 101 stack.size = 0; \ 102 if (__msan_get_track_origins() && msan_inited) \ 103 GetStackTrace(&stack, common_flags()->malloc_context_size, \ 104 StackTrace::GetCurrentPc(), GET_CURRENT_FRAME(), \ 105 common_flags()->fast_unwind_on_malloc) 106 107#define GET_STORE_STACK_TRACE_PC_BP(pc, bp) \ 108 StackTrace stack; \ 109 stack.size = 0; \ 110 if (__msan_get_track_origins() > 1 && msan_inited) \ 111 GetStackTrace(&stack, flags()->store_context_size, pc, bp, \ 112 common_flags()->fast_unwind_on_malloc) 113 114#define GET_FATAL_STACK_TRACE_PC_BP(pc, bp) \ 115 StackTrace stack; \ 116 stack.size = 0; \ 117 if (msan_inited) \ 118 GetStackTrace(&stack, kStackTraceMax, pc, bp, \ 119 common_flags()->fast_unwind_on_fatal) 120 121#define GET_STORE_STACK_TRACE \ 122 GET_STORE_STACK_TRACE_PC_BP(StackTrace::GetCurrentPc(), GET_CURRENT_FRAME()) 123 124class ScopedThreadLocalStateBackup { 125 public: 126 ScopedThreadLocalStateBackup() { Backup(); } 127 ~ScopedThreadLocalStateBackup() { Restore(); } 128 void Backup(); 129 void Restore(); 130 private: 131 u64 va_arg_overflow_size_tls; 132}; 133 134extern void (*death_callback)(void); 135 136void MsanTSDInit(void (*destructor)(void *tsd)); 137void *MsanTSDGet(); 138void MsanTSDSet(void *tsd); 139void MsanTSDDtor(void *tsd); 140 141} // namespace __msan 142 143#define MSAN_MALLOC_HOOK(ptr, size) \ 144 if (&__msan_malloc_hook) __msan_malloc_hook(ptr, size); \ 145 if (&__sanitizer_malloc_hook) __sanitizer_malloc_hook(ptr, size) 146#define MSAN_FREE_HOOK(ptr) \ 147 if (&__msan_free_hook) __msan_free_hook(ptr); \ 148 if (&__sanitizer_free_hook) __sanitizer_free_hook(ptr) 149 150#endif // MSAN_H 151