blob: 279c5f38451f9836bd199a632c4eed0619117332 [file] [log] [blame]
Kostya Serebryany1e172b42011-11-30 01:07:02 +00001//===-- asan_interceptors.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 for asan_interceptors.cc
13//===----------------------------------------------------------------------===//
14#ifndef ASAN_INTERCEPTORS_H
15#define ASAN_INTERCEPTORS_H
16
17#include "asan_internal.h"
Stephen Hines6d186232014-11-26 17:56:19 -080018#include "interception/interception.h"
Stephen Hines2d1fdb22014-05-28 23:58:16 -070019#include "sanitizer_common/sanitizer_platform_interceptors.h"
20
21// Use macro to describe if specific function should be
22// intercepted on a given platform.
23#if !SANITIZER_WINDOWS
24# define ASAN_INTERCEPT_ATOLL_AND_STRTOLL 1
25# define ASAN_INTERCEPT__LONGJMP 1
26# define ASAN_INTERCEPT_STRDUP 1
27# define ASAN_INTERCEPT_INDEX 1
28# define ASAN_INTERCEPT_PTHREAD_CREATE 1
Stephen Hines6a211c52014-07-21 00:49:56 -070029# define ASAN_INTERCEPT_FORK 1
Stephen Hines2d1fdb22014-05-28 23:58:16 -070030#else
31# define ASAN_INTERCEPT_ATOLL_AND_STRTOLL 0
32# define ASAN_INTERCEPT__LONGJMP 0
33# define ASAN_INTERCEPT_STRDUP 0
34# define ASAN_INTERCEPT_INDEX 0
35# define ASAN_INTERCEPT_PTHREAD_CREATE 0
Stephen Hines6a211c52014-07-21 00:49:56 -070036# define ASAN_INTERCEPT_FORK 0
Stephen Hines2d1fdb22014-05-28 23:58:16 -070037#endif
38
39#if SANITIZER_FREEBSD || SANITIZER_LINUX
40# define ASAN_USE_ALIAS_ATTRIBUTE_FOR_INDEX 1
41#else
42# define ASAN_USE_ALIAS_ATTRIBUTE_FOR_INDEX 0
43#endif
44
45#if !SANITIZER_MAC
46# define ASAN_INTERCEPT_STRNLEN 1
47#else
48# define ASAN_INTERCEPT_STRNLEN 0
49#endif
50
51#if SANITIZER_LINUX && !SANITIZER_ANDROID
52# define ASAN_INTERCEPT_SWAPCONTEXT 1
53#else
54# define ASAN_INTERCEPT_SWAPCONTEXT 0
55#endif
56
57#if !SANITIZER_WINDOWS
58# define ASAN_INTERCEPT_SIGNAL_AND_SIGACTION 1
59#else
60# define ASAN_INTERCEPT_SIGNAL_AND_SIGACTION 0
61#endif
62
63#if !SANITIZER_WINDOWS
64# define ASAN_INTERCEPT_SIGLONGJMP 1
65#else
66# define ASAN_INTERCEPT_SIGLONGJMP 0
67#endif
68
Stephen Hines6a211c52014-07-21 00:49:56 -070069// Android bug: https://code.google.com/p/android/issues/detail?id=61799
70#if ASAN_HAS_EXCEPTIONS && !SANITIZER_WINDOWS && \
71 !(SANITIZER_ANDROID && defined(__i386))
Stephen Hines2d1fdb22014-05-28 23:58:16 -070072# define ASAN_INTERCEPT___CXA_THROW 1
73#else
74# define ASAN_INTERCEPT___CXA_THROW 0
75#endif
76
77#if !SANITIZER_WINDOWS
78# define ASAN_INTERCEPT___CXA_ATEXIT 1
79#else
80# define ASAN_INTERCEPT___CXA_ATEXIT 0
81#endif
Alexey Samsonovf2598fc2012-02-02 10:39:40 +000082
Chandler Carruth6bae39d2012-06-25 06:53:10 +000083DECLARE_REAL(int, memcmp, const void *a1, const void *a2, uptr size)
84DECLARE_REAL(void*, memcpy, void *to, const void *from, uptr size)
85DECLARE_REAL(void*, memset, void *block, int c, uptr size)
86DECLARE_REAL(char*, strchr, const char *str, int c)
Stephen Hines6d186232014-11-26 17:56:19 -080087DECLARE_REAL(SIZE_T, strlen, const char *s)
Chandler Carruth6bae39d2012-06-25 06:53:10 +000088DECLARE_REAL(char*, strncpy, char *to, const char *from, uptr size)
89DECLARE_REAL(uptr, strnlen, const char *s, uptr maxlen)
Alexander Potapenkoeb8c46e2012-08-24 09:22:05 +000090DECLARE_REAL(char*, strstr, const char *s1, const char *s2)
Alexey Samsonovda13ba82012-02-16 17:00:45 +000091struct sigaction;
92DECLARE_REAL(int, sigaction, int signum, const struct sigaction *act,
Chandler Carruth6bae39d2012-06-25 06:53:10 +000093 struct sigaction *oldact)
Alexey Samsonov3389b8e2012-01-30 13:42:44 +000094
Pirama Arumuga Nainar7c915052015-04-08 08:58:29 -070095#if !SANITIZER_MAC
96#define ASAN_INTERCEPT_FUNC(name) \
97 do { \
98 if ((!INTERCEPT_FUNCTION(name) || !REAL(name))) \
99 VReport(1, "AddressSanitizer: failed to intercept '" #name "'\n"); \
100 } while (0)
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800101#define ASAN_INTERCEPT_FUNC_VER(name, ver) \
102 do { \
103 if ((!INTERCEPT_FUNCTION_VER(name, ver) || !REAL(name))) \
104 VReport( \
105 1, "AddressSanitizer: failed to intercept '" #name "@@" #ver "'\n"); \
106 } while (0)
Pirama Arumuga Nainar7c915052015-04-08 08:58:29 -0700107#else
108// OS X interceptors don't need to be initialized with INTERCEPT_FUNCTION.
109#define ASAN_INTERCEPT_FUNC(name)
110#endif // SANITIZER_MAC
111
Kostya Serebryany1e172b42011-11-30 01:07:02 +0000112namespace __asan {
113
Kostya Serebryany1e172b42011-11-30 01:07:02 +0000114void InitializeAsanInterceptors();
Pirama Arumuga Nainar7c915052015-04-08 08:58:29 -0700115void InitializePlatformInterceptors();
Alexey Samsonov5cf832d2012-03-21 12:29:54 +0000116
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700117#define ENSURE_ASAN_INITED() do { \
118 CHECK(!asan_init_is_running); \
119 if (UNLIKELY(!asan_inited)) { \
120 AsanInitFromRtl(); \
121 } \
122} while (0)
123
Kostya Serebryany1e172b42011-11-30 01:07:02 +0000124} // namespace __asan
125
126#endif // ASAN_INTERCEPTORS_H