1 //===-- msan.h --------------------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file is a part of MemorySanitizer.
12 // Private MSan header.
13 //===----------------------------------------------------------------------===//
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"
24 #ifndef MSAN_REPLACE_OPERATORS_NEW_AND_DELETE
25 # define MSAN_REPLACE_OPERATORS_NEW_AND_DELETE 1
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)
35 const int kMsanParamTlsSizeInWords
= 100;
36 const int kMsanRetvalTlsSizeInWords
= 100;
39 extern int msan_inited
;
40 extern bool msan_init_is_running
;
41 extern int msan_report_count
;
43 bool ProtectRange(uptr beg
, uptr end
);
44 bool InitShadow(bool prot1
, bool prot2
, bool map_shadow
, bool init_origins
);
45 char *GetProcSelfMaps();
46 void InitializeInterceptors();
48 void MsanAllocatorThreadFinish();
49 void *MsanReallocate(StackTrace
*stack
, void *oldp
, uptr size
,
50 uptr alignment
, bool zeroise
);
51 void MsanDeallocate(StackTrace
*stack
, void *ptr
);
52 void InstallTrapHandler();
53 void InstallAtExitHandler();
54 void ReplaceOperatorsNewAndDelete();
56 const char *GetStackOriginDescr(u32 id
, uptr
*pc
);
58 void EnterSymbolizer();
59 void ExitSymbolizer();
60 bool IsInSymbolizer();
62 struct SymbolizerScope
{
63 SymbolizerScope() { EnterSymbolizer(); }
64 ~SymbolizerScope() { ExitSymbolizer(); }
71 void PrintWarning(uptr pc
, uptr bp
);
72 void PrintWarningWithOrigin(uptr pc
, uptr bp
, u32 origin
);
74 void GetStackTrace(StackTrace
*stack
, uptr max_s
, uptr pc
, uptr bp
,
75 bool request_fast_unwind
);
77 void ReportUMR(StackTrace
*stack
, u32 origin
);
78 void ReportExpectedUMRNotFound(StackTrace
*stack
);
80 void ReportAtExitStatistics();
81 void DescribeMemoryRange(const void *x
, uptr size
);
82 void ReportUMRInsideAddressRange(const char *what
, const void *start
, uptr size
,
85 // Unpoison first n function arguments.
86 void UnpoisonParam(uptr n
);
87 void UnpoisonThreadLocalState();
89 u32
GetOriginIfPoisoned(uptr a
, uptr size
);
90 void SetOriginIfPoisoned(uptr addr
, uptr src_shadow
, uptr size
, u32 src_origin
);
91 void CopyOrigin(void *dst
, const void *src
, uptr size
, StackTrace
*stack
);
92 void MovePoison(void *dst
, const void *src
, uptr size
, StackTrace
*stack
);
93 void CopyPoison(void *dst
, const void *src
, uptr size
, StackTrace
*stack
);
95 // Returns a "chained" origin id, pointing to the given stack trace followed by
96 // the previous origin id.
97 u32
ChainOrigin(u32 id
, StackTrace
*stack
);
99 #define GET_MALLOC_STACK_TRACE \
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)
107 #define GET_STORE_STACK_TRACE_PC_BP(pc, bp) \
110 if (__msan_get_track_origins() > 1 && msan_inited) \
111 GetStackTrace(&stack, common_flags()->malloc_context_size, pc, bp, \
112 common_flags()->fast_unwind_on_malloc)
114 #define GET_FATAL_STACK_TRACE_PC_BP(pc, bp) \
118 GetStackTrace(&stack, kStackTraceMax, pc, bp, \
119 common_flags()->fast_unwind_on_fatal)
121 #define GET_STORE_STACK_TRACE \
122 GET_STORE_STACK_TRACE_PC_BP(StackTrace::GetCurrentPc(), GET_CURRENT_FRAME())
124 class ScopedThreadLocalStateBackup
{
126 ScopedThreadLocalStateBackup() { Backup(); }
127 ~ScopedThreadLocalStateBackup() { Restore(); }
131 u64 va_arg_overflow_size_tls
;
134 extern void (*death_callback
)(void);
136 void MsanTSDInit(void (*destructor
)(void *tsd
));
138 void MsanTSDSet(void *tsd
);
139 void MsanTSDDtor(void *tsd
);
141 } // namespace __msan
143 #define MSAN_MALLOC_HOOK(ptr, size) \
144 if (&__msan_malloc_hook) __msan_malloc_hook(ptr, size)
145 #define MSAN_FREE_HOOK(ptr) \
146 if (&__msan_free_hook) __msan_free_hook(ptr)