msan.h revision f16dc4234098a22a9d0d56f0198d87905481e7fd
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 request_fast_unwind);
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