blob: 0ef0d0eb526311f97eecfa00e547ca040aa61ada [file] [log] [blame]
Kostya Serebryany1e172b42011-11-30 01:07:02 +00001//===-- asan_internal.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 AddressSanitizer, an address sanity checker.
11//
12// ASan-private header which defines various general utilities.
13//===----------------------------------------------------------------------===//
14#ifndef ASAN_INTERNAL_H
15#define ASAN_INTERNAL_H
16
Alexey Samsonov7ed1d2b2012-07-10 07:41:27 +000017#include "asan_flags.h"
Alexey Samsonovc70fa282013-01-31 13:46:14 +000018#include "asan_interface_internal.h"
Alexey Samsonov47657ce2012-06-06 07:02:44 +000019#include "sanitizer_common/sanitizer_common.h"
Alexey Samsonov94b50362012-06-05 14:25:27 +000020#include "sanitizer_common/sanitizer_internal_defs.h"
Kostya Serebryany1b5ea8f2012-08-28 14:11:57 +000021#include "sanitizer_common/sanitizer_stacktrace.h"
Kostya Serebryany16e00752012-05-31 13:42:53 +000022#include "sanitizer_common/sanitizer_libc.h"
Kostya Serebryanyb3cedf92012-05-29 12:18:18 +000023
Kostya Serebryanye31eca92013-02-15 12:00:24 +000024#if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__)
Kostya Serebryany1e172b42011-11-30 01:07:02 +000025# error "The AddressSanitizer run-time should not be"
26 " instrumented by AddressSanitizer"
27#endif
28
Kostya Serebryanyc6f22232011-12-08 18:30:42 +000029// Build-time configuration options.
30
Kostya Serebryanyc6f22232011-12-08 18:30:42 +000031// If set, asan will intercept C++ exception api call(s).
32#ifndef ASAN_HAS_EXCEPTIONS
33# define ASAN_HAS_EXCEPTIONS 1
34#endif
35
Evgeniy Stepanov8ae44ac2012-02-27 13:07:29 +000036// If set, values like allocator chunk size, as well as defaults for some flags
37// will be changed towards less memory overhead.
38#ifndef ASAN_LOW_MEMORY
Kostya Serebryanye52810d2012-12-25 07:17:17 +000039#if SANITIZER_WORDSIZE == 32
Evgeniy Stepanov9712af92012-09-28 10:07:53 +000040# define ASAN_LOW_MEMORY 1
Kostya Serebryanye52810d2012-12-25 07:17:17 +000041#else
Evgeniy Stepanov9712af92012-09-28 10:07:53 +000042# define ASAN_LOW_MEMORY 0
43# endif
Evgeniy Stepanov8ae44ac2012-02-27 13:07:29 +000044#endif
45
Stephen Hines2d1fdb22014-05-28 23:58:16 -070046#ifndef ASAN_DYNAMIC
47# ifdef PIC
48# define ASAN_DYNAMIC 1
49# else
50# define ASAN_DYNAMIC 0
51# endif
52#endif
53
Kostya Serebryany1e172b42011-11-30 01:07:02 +000054// All internal functions in asan reside inside the __asan namespace
55// to avoid namespace collisions with the user programs.
Stephen Hines2d1fdb22014-05-28 23:58:16 -070056// Separate namespace also makes it simpler to distinguish the asan run-time
Kostya Serebryany1e172b42011-11-30 01:07:02 +000057// functions from the instrumented user code in a profile.
58namespace __asan {
59
60class AsanThread;
Kostya Serebryany1b5ea8f2012-08-28 14:11:57 +000061using __sanitizer::StackTrace;
Kostya Serebryany1e172b42011-11-30 01:07:02 +000062
Stephen Hines2d1fdb22014-05-28 23:58:16 -070063void AsanInitFromRtl();
64
Kostya Serebryany218a9b72011-11-30 18:50:23 +000065// asan_rtl.cc
Timur Iskhodzhanovb55c88d2012-03-13 16:29:25 +000066void NORETURN ShowStatsAndAbort();
Kostya Serebryany1e172b42011-11-30 01:07:02 +000067
Kostya Serebryany218a9b72011-11-30 18:50:23 +000068// asan_malloc_linux.cc / asan_malloc_mac.cc
Kostya Serebryany1e172b42011-11-30 01:07:02 +000069void ReplaceSystemMalloc();
70
Alexander Potapenkof73a6a32012-02-13 17:09:40 +000071// asan_linux.cc / asan_mac.cc / asan_win.cc
Kostya Serebryany1e172b42011-11-30 01:07:02 +000072void *AsanDoesNotSupportStaticLinkage();
Stephen Hines2d1fdb22014-05-28 23:58:16 -070073void AsanCheckDynamicRTPrereqs();
74void AsanCheckIncompatibleRT();
Kostya Serebryanyde496f42011-12-28 22:58:01 +000075
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -080076void AsanOnDeadlySignal(int, void *siginfo, void *context);
Kostya Serebryanyef14ff62012-01-06 02:12:25 +000077
Alexey Samsonov57db4ba2013-01-17 15:45:28 +000078void ReadContextStack(void *context, uptr *stack, uptr *ssize);
Alexey Samsonov46efcb02013-05-24 11:46:56 +000079void StopInitOrderChecking();
Kostya Serebryanycc4e6862012-01-11 02:21:06 +000080
81// Wrapper for TLS/TSD.
Kostya Serebryanyf58f9982012-02-07 00:27:15 +000082void AsanTSDInit(void (*destructor)(void *tsd));
Kostya Serebryanycc4e6862012-01-11 02:21:06 +000083void *AsanTSDGet();
84void AsanTSDSet(void *tsd);
Sergey Matveeve86e35f2013-10-14 12:01:05 +000085void PlatformTSDDtor(void *tsd);
Kostya Serebryany4803ab92012-01-09 18:53:15 +000086
Alexey Samsonove9541012012-06-06 13:11:29 +000087void AppendToErrorMessageBuffer(const char *buffer);
Kostya Serebryany1e172b42011-11-30 01:07:02 +000088
Stephen Hines6a211c52014-07-21 00:49:56 -070089void *AsanDlSymNext(const char *sym);
90
Pirama Arumuga Nainarcdce50b2015-07-01 12:26:56 -070091void ReserveShadowMemoryRange(uptr beg, uptr end, const char *name);
Stephen Hines86277eb2015-03-23 12:06:32 -070092
Stephen Hines2d1fdb22014-05-28 23:58:16 -070093// Platform-specific options.
Evgeniy Stepanov30e110e2013-03-19 14:54:17 +000094#if SANITIZER_MAC
Alexey Samsonov38dd4ed2012-03-20 10:54:40 +000095bool PlatformHasDifferentMemcpyAndMemmove();
96# define PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE \
97 (PlatformHasDifferentMemcpyAndMemmove())
98#else
99# define PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE true
Alexey Samsonov649a2702013-04-03 07:29:53 +0000100#endif // SANITIZER_MAC
Alexey Samsonov38dd4ed2012-03-20 10:54:40 +0000101
Alexey Samsonov6a08d292012-12-07 22:01:28 +0000102// Add convenient macro for interface functions that may be represented as
103// weak hooks.
104#define ASAN_MALLOC_HOOK(ptr, size) \
Stephen Hines6a211c52014-07-21 00:49:56 -0700105 if (&__sanitizer_malloc_hook) __sanitizer_malloc_hook(ptr, size)
Alexey Samsonov6a08d292012-12-07 22:01:28 +0000106#define ASAN_FREE_HOOK(ptr) \
Stephen Hines6a211c52014-07-21 00:49:56 -0700107 if (&__sanitizer_free_hook) __sanitizer_free_hook(ptr)
Alexey Samsonov6a08d292012-12-07 22:01:28 +0000108#define ASAN_ON_ERROR() \
109 if (&__asan_on_error) __asan_on_error()
110
Kostya Serebryany1e172b42011-11-30 01:07:02 +0000111extern int asan_inited;
112// Used to avoid infinite recursion in __asan_init().
113extern bool asan_init_is_running;
Alexey Samsonov47657ce2012-06-06 07:02:44 +0000114extern void (*death_callback)(void);
Kostya Serebryany1e172b42011-11-30 01:07:02 +0000115
Kostya Serebryany1e172b42011-11-30 01:07:02 +0000116// These magic values are written to shadow for better error reporting.
117const int kAsanHeapLeftRedzoneMagic = 0xfa;
118const int kAsanHeapRightRedzoneMagic = 0xfb;
119const int kAsanHeapFreeMagic = 0xfd;
120const int kAsanStackLeftRedzoneMagic = 0xf1;
121const int kAsanStackMidRedzoneMagic = 0xf2;
122const int kAsanStackRightRedzoneMagic = 0xf3;
123const int kAsanStackPartialRedzoneMagic = 0xf4;
124const int kAsanStackAfterReturnMagic = 0xf5;
Kostya Serebryany3945c582012-08-21 14:10:25 +0000125const int kAsanInitializationOrderMagic = 0xf6;
Kostya Serebryany1e172b42011-11-30 01:07:02 +0000126const int kAsanUserPoisonedMemoryMagic = 0xf7;
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700127const int kAsanContiguousContainerOOBMagic = 0xfc;
Alexey Samsonovd4b5db82012-12-04 01:38:15 +0000128const int kAsanStackUseAfterScopeMagic = 0xf8;
Kostya Serebryany1e172b42011-11-30 01:07:02 +0000129const int kAsanGlobalRedzoneMagic = 0xf9;
Kostya Serebryany6b30e2c2011-12-15 17:41:30 +0000130const int kAsanInternalHeapMagic = 0xfe;
Stephen Hines6d186232014-11-26 17:56:19 -0800131const int kAsanArrayCookieMagic = 0xac;
132const int kAsanIntraObjectRedzone = 0xbb;
Stephen Hines86277eb2015-03-23 12:06:32 -0700133const int kAsanAllocaLeftMagic = 0xca;
134const int kAsanAllocaRightMagic = 0xcb;
Kostya Serebryany1e172b42011-11-30 01:07:02 +0000135
Kostya Serebryany3f4c3872012-05-31 14:35:53 +0000136static const uptr kCurrentStackFrameMagic = 0x41B58AB3;
137static const uptr kRetiredStackFrameMagic = 0x45E0360E;
Kostya Serebryany1e172b42011-11-30 01:07:02 +0000138
Kostya Serebryany1e172b42011-11-30 01:07:02 +0000139} // namespace __asan
140
141#endif // ASAN_INTERNAL_H