msan.h revision 450eee655289a622ab9acf87d863f38991b184c9
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 *GetOriginDescrIfStack(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 fast); 76 77void ReportUMR(StackTrace *stack, u32 origin); 78void ReportExpectedUMRNotFound(StackTrace *stack); 79void ReportAtExitStatistics(); 80 81// Unpoison first n function arguments. 82void UnpoisonParam(uptr n); 83void UnpoisonThreadLocalState(); 84 85#define GET_MALLOC_STACK_TRACE \ 86 StackTrace stack; \ 87 stack.size = 0; \ 88 if (__msan_get_track_origins() && msan_inited) \ 89 GetStackTrace(&stack, common_flags()->malloc_context_size, \ 90 StackTrace::GetCurrentPc(), GET_CURRENT_FRAME(), \ 91 common_flags()->fast_unwind_on_malloc) 92 93class ScopedThreadLocalStateBackup { 94 public: 95 ScopedThreadLocalStateBackup() { Backup(); } 96 ~ScopedThreadLocalStateBackup() { Restore(); } 97 void Backup(); 98 void Restore(); 99 private: 100 u64 va_arg_overflow_size_tls; 101}; 102} // namespace __msan 103 104#define MSAN_MALLOC_HOOK(ptr, size) \ 105 if (&__msan_malloc_hook) __msan_malloc_hook(ptr, size) 106#define MSAN_FREE_HOOK(ptr) \ 107 if (&__msan_free_hook) __msan_free_hook(ptr) 108 109#endif // MSAN_H 110