annotate libsanitizer/asan/asan_posix.cpp @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 //===-- asan_posix.cpp ----------------------------------------------------===//
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 //
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 //
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 //
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 // This file is a part of AddressSanitizer, an address sanity checker.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 //
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 // Posix-specific details.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 //===----------------------------------------------------------------------===//
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 #include "sanitizer_common/sanitizer_platform.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 #if SANITIZER_POSIX
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 #include "asan_internal.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 #include "asan_interceptors.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19 #include "asan_mapping.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 #include "asan_report.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21 #include "asan_stack.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 #include "sanitizer_common/sanitizer_libc.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 #include "sanitizer_common/sanitizer_posix.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 #include "sanitizer_common/sanitizer_procmaps.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 #include <pthread.h>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 #include <stdlib.h>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 #include <sys/time.h>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 #include <sys/resource.h>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30 #include <unistd.h>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 namespace __asan {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 void AsanOnDeadlySignal(int signo, void *siginfo, void *context) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 StartReportDeadlySignal();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 SignalContext sig(siginfo, context);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 ReportDeadlySignal(sig);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 // ---------------------- TSD ---------------- {{{1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42 #if SANITIZER_NETBSD && !ASAN_DYNAMIC
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 // Thread Static Data cannot be used in early static ASan init on NetBSD.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 // Reuse the Asan TSD API for compatibility with existing code
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 // with an alternative implementation.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 static void (*tsd_destructor)(void *tsd) = nullptr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 struct tsd_key {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 tsd_key() : key(nullptr) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 ~tsd_key() {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 CHECK(tsd_destructor);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 if (key)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 (*tsd_destructor)(key);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 void *key;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 static thread_local struct tsd_key key;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61 void AsanTSDInit(void (*destructor)(void *tsd)) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 CHECK(!tsd_destructor);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 tsd_destructor = destructor;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 void *AsanTSDGet() {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 CHECK(tsd_destructor);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 return key.key;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71 void AsanTSDSet(void *tsd) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 CHECK(tsd_destructor);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73 CHECK(tsd);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 CHECK(!key.key);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 key.key = tsd;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 void PlatformTSDDtor(void *tsd) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79 CHECK(tsd_destructor);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80 CHECK_EQ(key.key, tsd);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 key.key = nullptr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82 // Make sure that signal handler can not see a stale current thread pointer.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83 atomic_signal_fence(memory_order_seq_cst);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84 AsanThread::TSDDtor(tsd);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86 #else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87 static pthread_key_t tsd_key;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88 static bool tsd_key_inited = false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89 void AsanTSDInit(void (*destructor)(void *tsd)) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90 CHECK(!tsd_key_inited);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
91 tsd_key_inited = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
92 CHECK_EQ(0, pthread_key_create(&tsd_key, destructor));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
93 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
94
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
95 void *AsanTSDGet() {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
96 CHECK(tsd_key_inited);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
97 return pthread_getspecific(tsd_key);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
98 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
99
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
100 void AsanTSDSet(void *tsd) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
101 CHECK(tsd_key_inited);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
102 pthread_setspecific(tsd_key, tsd);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
103 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
104
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
105 void PlatformTSDDtor(void *tsd) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
106 AsanThreadContext *context = (AsanThreadContext*)tsd;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
107 if (context->destructor_iterations > 1) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
108 context->destructor_iterations--;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
109 CHECK_EQ(0, pthread_setspecific(tsd_key, tsd));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
110 return;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
111 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
112 AsanThread::TSDDtor(tsd);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
113 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
114 #endif
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
115 } // namespace __asan
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
116
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
117 #endif // SANITIZER_POSIX