annotate libsanitizer/asan/asan_errors.h @ 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
111
kono
parents:
diff changeset
1 //===-- asan_errors.h -------------------------------------------*- C++ -*-===//
kono
parents:
diff changeset
2 //
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
111
kono
parents:
diff changeset
6 //
kono
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
kono
parents:
diff changeset
8 //
kono
parents:
diff changeset
9 // This file is a part of AddressSanitizer, an address sanity checker.
kono
parents:
diff changeset
10 //
kono
parents:
diff changeset
11 // ASan-private header for error structures.
kono
parents:
diff changeset
12 //===----------------------------------------------------------------------===//
kono
parents:
diff changeset
13 #ifndef ASAN_ERRORS_H
kono
parents:
diff changeset
14 #define ASAN_ERRORS_H
kono
parents:
diff changeset
15
kono
parents:
diff changeset
16 #include "asan_descriptions.h"
kono
parents:
diff changeset
17 #include "asan_scariness_score.h"
kono
parents:
diff changeset
18 #include "sanitizer_common/sanitizer_common.h"
kono
parents:
diff changeset
19
kono
parents:
diff changeset
20 namespace __asan {
kono
parents:
diff changeset
21
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
22 // (*) VS2013 does not implement unrestricted unions, so we need a trivial
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
23 // default constructor explicitly defined for each particular error.
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
24
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
25 // None of the error classes own the stack traces mentioned in them.
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
26
111
kono
parents:
diff changeset
27 struct ErrorBase {
kono
parents:
diff changeset
28 ScarinessScoreBase scariness;
kono
parents:
diff changeset
29 u32 tid;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
30
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
31 ErrorBase() = default; // (*)
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
32 explicit ErrorBase(u32 tid_) : tid(tid_) {}
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
33 ErrorBase(u32 tid_, int initial_score, const char *reason) : tid(tid_) {
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
34 scariness.Clear();
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
35 scariness.Scare(initial_score, reason);
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
36 }
111
kono
parents:
diff changeset
37 };
kono
parents:
diff changeset
38
kono
parents:
diff changeset
39 struct ErrorDeadlySignal : ErrorBase {
kono
parents:
diff changeset
40 SignalContext signal;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
41
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
42 ErrorDeadlySignal() = default; // (*)
111
kono
parents:
diff changeset
43 ErrorDeadlySignal(u32 tid, const SignalContext &sig)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
44 : ErrorBase(tid),
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
45 signal(sig) {
111
kono
parents:
diff changeset
46 scariness.Clear();
kono
parents:
diff changeset
47 if (signal.IsStackOverflow()) {
kono
parents:
diff changeset
48 scariness.Scare(10, "stack-overflow");
kono
parents:
diff changeset
49 } else if (!signal.is_memory_access) {
kono
parents:
diff changeset
50 scariness.Scare(10, "signal");
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
51 } else if (signal.is_true_faulting_addr &&
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
52 signal.addr < GetPageSizeCached()) {
111
kono
parents:
diff changeset
53 scariness.Scare(10, "null-deref");
kono
parents:
diff changeset
54 } else if (signal.addr == signal.pc) {
kono
parents:
diff changeset
55 scariness.Scare(60, "wild-jump");
kono
parents:
diff changeset
56 } else if (signal.write_flag == SignalContext::WRITE) {
kono
parents:
diff changeset
57 scariness.Scare(30, "wild-addr-write");
kono
parents:
diff changeset
58 } else if (signal.write_flag == SignalContext::READ) {
kono
parents:
diff changeset
59 scariness.Scare(20, "wild-addr-read");
kono
parents:
diff changeset
60 } else {
kono
parents:
diff changeset
61 scariness.Scare(25, "wild-addr");
kono
parents:
diff changeset
62 }
kono
parents:
diff changeset
63 }
kono
parents:
diff changeset
64 void Print();
kono
parents:
diff changeset
65 };
kono
parents:
diff changeset
66
kono
parents:
diff changeset
67 struct ErrorDoubleFree : ErrorBase {
kono
parents:
diff changeset
68 const BufferedStackTrace *second_free_stack;
kono
parents:
diff changeset
69 HeapAddressDescription addr_description;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
70
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
71 ErrorDoubleFree() = default; // (*)
111
kono
parents:
diff changeset
72 ErrorDoubleFree(u32 tid, BufferedStackTrace *stack, uptr addr)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
73 : ErrorBase(tid, 42, "double-free"),
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
74 second_free_stack(stack) {
111
kono
parents:
diff changeset
75 CHECK_GT(second_free_stack->size, 0);
kono
parents:
diff changeset
76 GetHeapAddressInformation(addr, 1, &addr_description);
kono
parents:
diff changeset
77 }
kono
parents:
diff changeset
78 void Print();
kono
parents:
diff changeset
79 };
kono
parents:
diff changeset
80
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
81 struct ErrorNewDeleteTypeMismatch : ErrorBase {
111
kono
parents:
diff changeset
82 const BufferedStackTrace *free_stack;
kono
parents:
diff changeset
83 HeapAddressDescription addr_description;
kono
parents:
diff changeset
84 uptr delete_size;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
85 uptr delete_alignment;
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
86
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
87 ErrorNewDeleteTypeMismatch() = default; // (*)
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
88 ErrorNewDeleteTypeMismatch(u32 tid, BufferedStackTrace *stack, uptr addr,
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
89 uptr delete_size_, uptr delete_alignment_)
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
90 : ErrorBase(tid, 10, "new-delete-type-mismatch"),
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
91 free_stack(stack),
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
92 delete_size(delete_size_),
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
93 delete_alignment(delete_alignment_) {
111
kono
parents:
diff changeset
94 GetHeapAddressInformation(addr, 1, &addr_description);
kono
parents:
diff changeset
95 }
kono
parents:
diff changeset
96 void Print();
kono
parents:
diff changeset
97 };
kono
parents:
diff changeset
98
kono
parents:
diff changeset
99 struct ErrorFreeNotMalloced : ErrorBase {
kono
parents:
diff changeset
100 const BufferedStackTrace *free_stack;
kono
parents:
diff changeset
101 AddressDescription addr_description;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
102
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
103 ErrorFreeNotMalloced() = default; // (*)
111
kono
parents:
diff changeset
104 ErrorFreeNotMalloced(u32 tid, BufferedStackTrace *stack, uptr addr)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
105 : ErrorBase(tid, 40, "bad-free"),
111
kono
parents:
diff changeset
106 free_stack(stack),
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
107 addr_description(addr, /*shouldLockThreadRegistry=*/false) {}
111
kono
parents:
diff changeset
108 void Print();
kono
parents:
diff changeset
109 };
kono
parents:
diff changeset
110
kono
parents:
diff changeset
111 struct ErrorAllocTypeMismatch : ErrorBase {
kono
parents:
diff changeset
112 const BufferedStackTrace *dealloc_stack;
kono
parents:
diff changeset
113 AllocType alloc_type, dealloc_type;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
114 AddressDescription addr_description;
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
115
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
116 ErrorAllocTypeMismatch() = default; // (*)
111
kono
parents:
diff changeset
117 ErrorAllocTypeMismatch(u32 tid, BufferedStackTrace *stack, uptr addr,
kono
parents:
diff changeset
118 AllocType alloc_type_, AllocType dealloc_type_)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
119 : ErrorBase(tid, 10, "alloc-dealloc-mismatch"),
111
kono
parents:
diff changeset
120 dealloc_stack(stack),
kono
parents:
diff changeset
121 alloc_type(alloc_type_),
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
122 dealloc_type(dealloc_type_),
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
123 addr_description(addr, 1, false) {}
111
kono
parents:
diff changeset
124 void Print();
kono
parents:
diff changeset
125 };
kono
parents:
diff changeset
126
kono
parents:
diff changeset
127 struct ErrorMallocUsableSizeNotOwned : ErrorBase {
kono
parents:
diff changeset
128 const BufferedStackTrace *stack;
kono
parents:
diff changeset
129 AddressDescription addr_description;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
130
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
131 ErrorMallocUsableSizeNotOwned() = default; // (*)
111
kono
parents:
diff changeset
132 ErrorMallocUsableSizeNotOwned(u32 tid, BufferedStackTrace *stack_, uptr addr)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
133 : ErrorBase(tid, 10, "bad-malloc_usable_size"),
111
kono
parents:
diff changeset
134 stack(stack_),
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
135 addr_description(addr, /*shouldLockThreadRegistry=*/false) {}
111
kono
parents:
diff changeset
136 void Print();
kono
parents:
diff changeset
137 };
kono
parents:
diff changeset
138
kono
parents:
diff changeset
139 struct ErrorSanitizerGetAllocatedSizeNotOwned : ErrorBase {
kono
parents:
diff changeset
140 const BufferedStackTrace *stack;
kono
parents:
diff changeset
141 AddressDescription addr_description;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
142
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
143 ErrorSanitizerGetAllocatedSizeNotOwned() = default; // (*)
111
kono
parents:
diff changeset
144 ErrorSanitizerGetAllocatedSizeNotOwned(u32 tid, BufferedStackTrace *stack_,
kono
parents:
diff changeset
145 uptr addr)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
146 : ErrorBase(tid, 10, "bad-__sanitizer_get_allocated_size"),
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
147 stack(stack_),
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
148 addr_description(addr, /*shouldLockThreadRegistry=*/false) {}
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
149 void Print();
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
150 };
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
151
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
152 struct ErrorCallocOverflow : ErrorBase {
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
153 const BufferedStackTrace *stack;
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
154 uptr count;
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
155 uptr size;
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
156
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
157 ErrorCallocOverflow() = default; // (*)
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
158 ErrorCallocOverflow(u32 tid, BufferedStackTrace *stack_, uptr count_,
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
159 uptr size_)
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
160 : ErrorBase(tid, 10, "calloc-overflow"),
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
161 stack(stack_),
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
162 count(count_),
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
163 size(size_) {}
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
164 void Print();
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
165 };
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
166
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
167 struct ErrorReallocArrayOverflow : ErrorBase {
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
168 const BufferedStackTrace *stack;
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
169 uptr count;
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
170 uptr size;
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
171
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
172 ErrorReallocArrayOverflow() = default; // (*)
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
173 ErrorReallocArrayOverflow(u32 tid, BufferedStackTrace *stack_, uptr count_,
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
174 uptr size_)
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
175 : ErrorBase(tid, 10, "reallocarray-overflow"),
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
176 stack(stack_),
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
177 count(count_),
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
178 size(size_) {}
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
179 void Print();
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
180 };
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
181
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
182 struct ErrorPvallocOverflow : ErrorBase {
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
183 const BufferedStackTrace *stack;
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
184 uptr size;
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
185
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
186 ErrorPvallocOverflow() = default; // (*)
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
187 ErrorPvallocOverflow(u32 tid, BufferedStackTrace *stack_, uptr size_)
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
188 : ErrorBase(tid, 10, "pvalloc-overflow"),
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
189 stack(stack_),
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
190 size(size_) {}
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
191 void Print();
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
192 };
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
193
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
194 struct ErrorInvalidAllocationAlignment : ErrorBase {
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
195 const BufferedStackTrace *stack;
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
196 uptr alignment;
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
197
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
198 ErrorInvalidAllocationAlignment() = default; // (*)
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
199 ErrorInvalidAllocationAlignment(u32 tid, BufferedStackTrace *stack_,
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
200 uptr alignment_)
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
201 : ErrorBase(tid, 10, "invalid-allocation-alignment"),
111
kono
parents:
diff changeset
202 stack(stack_),
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
203 alignment(alignment_) {}
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
204 void Print();
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
205 };
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
206
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
207 struct ErrorInvalidAlignedAllocAlignment : ErrorBase {
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
208 const BufferedStackTrace *stack;
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
209 uptr size;
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
210 uptr alignment;
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
211
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
212 ErrorInvalidAlignedAllocAlignment() = default; // (*)
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
213 ErrorInvalidAlignedAllocAlignment(u32 tid, BufferedStackTrace *stack_,
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
214 uptr size_, uptr alignment_)
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
215 : ErrorBase(tid, 10, "invalid-aligned-alloc-alignment"),
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
216 stack(stack_),
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
217 size(size_),
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
218 alignment(alignment_) {}
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
219 void Print();
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
220 };
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
221
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
222 struct ErrorInvalidPosixMemalignAlignment : ErrorBase {
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
223 const BufferedStackTrace *stack;
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
224 uptr alignment;
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
225
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
226 ErrorInvalidPosixMemalignAlignment() = default; // (*)
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
227 ErrorInvalidPosixMemalignAlignment(u32 tid, BufferedStackTrace *stack_,
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
228 uptr alignment_)
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
229 : ErrorBase(tid, 10, "invalid-posix-memalign-alignment"),
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
230 stack(stack_),
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
231 alignment(alignment_) {}
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
232 void Print();
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
233 };
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
234
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
235 struct ErrorAllocationSizeTooBig : ErrorBase {
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
236 const BufferedStackTrace *stack;
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
237 uptr user_size;
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
238 uptr total_size;
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
239 uptr max_size;
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
240
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
241 ErrorAllocationSizeTooBig() = default; // (*)
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
242 ErrorAllocationSizeTooBig(u32 tid, BufferedStackTrace *stack_,
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
243 uptr user_size_, uptr total_size_, uptr max_size_)
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
244 : ErrorBase(tid, 10, "allocation-size-too-big"),
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
245 stack(stack_),
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
246 user_size(user_size_),
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
247 total_size(total_size_),
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
248 max_size(max_size_) {}
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
249 void Print();
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
250 };
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
251
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
252 struct ErrorRssLimitExceeded : ErrorBase {
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
253 const BufferedStackTrace *stack;
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
254
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
255 ErrorRssLimitExceeded() = default; // (*)
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
256 ErrorRssLimitExceeded(u32 tid, BufferedStackTrace *stack_)
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
257 : ErrorBase(tid, 10, "rss-limit-exceeded"),
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
258 stack(stack_) {}
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
259 void Print();
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
260 };
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
261
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
262 struct ErrorOutOfMemory : ErrorBase {
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
263 const BufferedStackTrace *stack;
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
264 uptr requested_size;
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
265
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
266 ErrorOutOfMemory() = default; // (*)
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
267 ErrorOutOfMemory(u32 tid, BufferedStackTrace *stack_, uptr requested_size_)
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
268 : ErrorBase(tid, 10, "out-of-memory"),
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
269 stack(stack_),
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
270 requested_size(requested_size_) {}
111
kono
parents:
diff changeset
271 void Print();
kono
parents:
diff changeset
272 };
kono
parents:
diff changeset
273
kono
parents:
diff changeset
274 struct ErrorStringFunctionMemoryRangesOverlap : ErrorBase {
kono
parents:
diff changeset
275 const BufferedStackTrace *stack;
kono
parents:
diff changeset
276 uptr length1, length2;
kono
parents:
diff changeset
277 AddressDescription addr1_description;
kono
parents:
diff changeset
278 AddressDescription addr2_description;
kono
parents:
diff changeset
279 const char *function;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
280
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
281 ErrorStringFunctionMemoryRangesOverlap() = default; // (*)
111
kono
parents:
diff changeset
282 ErrorStringFunctionMemoryRangesOverlap(u32 tid, BufferedStackTrace *stack_,
kono
parents:
diff changeset
283 uptr addr1, uptr length1_, uptr addr2,
kono
parents:
diff changeset
284 uptr length2_, const char *function_)
kono
parents:
diff changeset
285 : ErrorBase(tid),
kono
parents:
diff changeset
286 stack(stack_),
kono
parents:
diff changeset
287 length1(length1_),
kono
parents:
diff changeset
288 length2(length2_),
kono
parents:
diff changeset
289 addr1_description(addr1, length1, /*shouldLockThreadRegistry=*/false),
kono
parents:
diff changeset
290 addr2_description(addr2, length2, /*shouldLockThreadRegistry=*/false),
kono
parents:
diff changeset
291 function(function_) {
kono
parents:
diff changeset
292 char bug_type[100];
kono
parents:
diff changeset
293 internal_snprintf(bug_type, sizeof(bug_type), "%s-param-overlap", function);
kono
parents:
diff changeset
294 scariness.Clear();
kono
parents:
diff changeset
295 scariness.Scare(10, bug_type);
kono
parents:
diff changeset
296 }
kono
parents:
diff changeset
297 void Print();
kono
parents:
diff changeset
298 };
kono
parents:
diff changeset
299
kono
parents:
diff changeset
300 struct ErrorStringFunctionSizeOverflow : ErrorBase {
kono
parents:
diff changeset
301 const BufferedStackTrace *stack;
kono
parents:
diff changeset
302 AddressDescription addr_description;
kono
parents:
diff changeset
303 uptr size;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
304
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
305 ErrorStringFunctionSizeOverflow() = default; // (*)
111
kono
parents:
diff changeset
306 ErrorStringFunctionSizeOverflow(u32 tid, BufferedStackTrace *stack_,
kono
parents:
diff changeset
307 uptr addr, uptr size_)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
308 : ErrorBase(tid, 10, "negative-size-param"),
111
kono
parents:
diff changeset
309 stack(stack_),
kono
parents:
diff changeset
310 addr_description(addr, /*shouldLockThreadRegistry=*/false),
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
311 size(size_) {}
111
kono
parents:
diff changeset
312 void Print();
kono
parents:
diff changeset
313 };
kono
parents:
diff changeset
314
kono
parents:
diff changeset
315 struct ErrorBadParamsToAnnotateContiguousContainer : ErrorBase {
kono
parents:
diff changeset
316 const BufferedStackTrace *stack;
kono
parents:
diff changeset
317 uptr beg, end, old_mid, new_mid;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
318
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
319 ErrorBadParamsToAnnotateContiguousContainer() = default; // (*)
111
kono
parents:
diff changeset
320 // PS4: Do we want an AddressDescription for beg?
kono
parents:
diff changeset
321 ErrorBadParamsToAnnotateContiguousContainer(u32 tid,
kono
parents:
diff changeset
322 BufferedStackTrace *stack_,
kono
parents:
diff changeset
323 uptr beg_, uptr end_,
kono
parents:
diff changeset
324 uptr old_mid_, uptr new_mid_)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
325 : ErrorBase(tid, 10, "bad-__sanitizer_annotate_contiguous_container"),
111
kono
parents:
diff changeset
326 stack(stack_),
kono
parents:
diff changeset
327 beg(beg_),
kono
parents:
diff changeset
328 end(end_),
kono
parents:
diff changeset
329 old_mid(old_mid_),
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
330 new_mid(new_mid_) {}
111
kono
parents:
diff changeset
331 void Print();
kono
parents:
diff changeset
332 };
kono
parents:
diff changeset
333
kono
parents:
diff changeset
334 struct ErrorODRViolation : ErrorBase {
kono
parents:
diff changeset
335 __asan_global global1, global2;
kono
parents:
diff changeset
336 u32 stack_id1, stack_id2;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
337
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
338 ErrorODRViolation() = default; // (*)
111
kono
parents:
diff changeset
339 ErrorODRViolation(u32 tid, const __asan_global *g1, u32 stack_id1_,
kono
parents:
diff changeset
340 const __asan_global *g2, u32 stack_id2_)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
341 : ErrorBase(tid, 10, "odr-violation"),
111
kono
parents:
diff changeset
342 global1(*g1),
kono
parents:
diff changeset
343 global2(*g2),
kono
parents:
diff changeset
344 stack_id1(stack_id1_),
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
345 stack_id2(stack_id2_) {}
111
kono
parents:
diff changeset
346 void Print();
kono
parents:
diff changeset
347 };
kono
parents:
diff changeset
348
kono
parents:
diff changeset
349 struct ErrorInvalidPointerPair : ErrorBase {
kono
parents:
diff changeset
350 uptr pc, bp, sp;
kono
parents:
diff changeset
351 AddressDescription addr1_description;
kono
parents:
diff changeset
352 AddressDescription addr2_description;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
353
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
354 ErrorInvalidPointerPair() = default; // (*)
111
kono
parents:
diff changeset
355 ErrorInvalidPointerPair(u32 tid, uptr pc_, uptr bp_, uptr sp_, uptr p1,
kono
parents:
diff changeset
356 uptr p2)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
357 : ErrorBase(tid, 10, "invalid-pointer-pair"),
111
kono
parents:
diff changeset
358 pc(pc_),
kono
parents:
diff changeset
359 bp(bp_),
kono
parents:
diff changeset
360 sp(sp_),
kono
parents:
diff changeset
361 addr1_description(p1, 1, /*shouldLockThreadRegistry=*/false),
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
362 addr2_description(p2, 1, /*shouldLockThreadRegistry=*/false) {}
111
kono
parents:
diff changeset
363 void Print();
kono
parents:
diff changeset
364 };
kono
parents:
diff changeset
365
kono
parents:
diff changeset
366 struct ErrorGeneric : ErrorBase {
kono
parents:
diff changeset
367 AddressDescription addr_description;
kono
parents:
diff changeset
368 uptr pc, bp, sp;
kono
parents:
diff changeset
369 uptr access_size;
kono
parents:
diff changeset
370 const char *bug_descr;
kono
parents:
diff changeset
371 bool is_write;
kono
parents:
diff changeset
372 u8 shadow_val;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
373
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
374 ErrorGeneric() = default; // (*)
111
kono
parents:
diff changeset
375 ErrorGeneric(u32 tid, uptr addr, uptr pc_, uptr bp_, uptr sp_, bool is_write_,
kono
parents:
diff changeset
376 uptr access_size_);
kono
parents:
diff changeset
377 void Print();
kono
parents:
diff changeset
378 };
kono
parents:
diff changeset
379
kono
parents:
diff changeset
380 // clang-format off
kono
parents:
diff changeset
381 #define ASAN_FOR_EACH_ERROR_KIND(macro) \
kono
parents:
diff changeset
382 macro(DeadlySignal) \
kono
parents:
diff changeset
383 macro(DoubleFree) \
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
384 macro(NewDeleteTypeMismatch) \
111
kono
parents:
diff changeset
385 macro(FreeNotMalloced) \
kono
parents:
diff changeset
386 macro(AllocTypeMismatch) \
kono
parents:
diff changeset
387 macro(MallocUsableSizeNotOwned) \
kono
parents:
diff changeset
388 macro(SanitizerGetAllocatedSizeNotOwned) \
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
389 macro(CallocOverflow) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
390 macro(ReallocArrayOverflow) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
391 macro(PvallocOverflow) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
392 macro(InvalidAllocationAlignment) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
393 macro(InvalidAlignedAllocAlignment) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
394 macro(InvalidPosixMemalignAlignment) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
395 macro(AllocationSizeTooBig) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
396 macro(RssLimitExceeded) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
397 macro(OutOfMemory) \
111
kono
parents:
diff changeset
398 macro(StringFunctionMemoryRangesOverlap) \
kono
parents:
diff changeset
399 macro(StringFunctionSizeOverflow) \
kono
parents:
diff changeset
400 macro(BadParamsToAnnotateContiguousContainer) \
kono
parents:
diff changeset
401 macro(ODRViolation) \
kono
parents:
diff changeset
402 macro(InvalidPointerPair) \
kono
parents:
diff changeset
403 macro(Generic)
kono
parents:
diff changeset
404 // clang-format on
kono
parents:
diff changeset
405
kono
parents:
diff changeset
406 #define ASAN_DEFINE_ERROR_KIND(name) kErrorKind##name,
kono
parents:
diff changeset
407 #define ASAN_ERROR_DESCRIPTION_MEMBER(name) Error##name name;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
408 #define ASAN_ERROR_DESCRIPTION_CONSTRUCTOR(name) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
409 ErrorDescription(Error##name const &e) : kind(kErrorKind##name) { \
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
410 internal_memcpy(&name, &e, sizeof(name)); \
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
411 }
111
kono
parents:
diff changeset
412 #define ASAN_ERROR_DESCRIPTION_PRINT(name) \
kono
parents:
diff changeset
413 case kErrorKind##name: \
kono
parents:
diff changeset
414 return name.Print();
kono
parents:
diff changeset
415
kono
parents:
diff changeset
416 enum ErrorKind {
kono
parents:
diff changeset
417 kErrorKindInvalid = 0,
kono
parents:
diff changeset
418 ASAN_FOR_EACH_ERROR_KIND(ASAN_DEFINE_ERROR_KIND)
kono
parents:
diff changeset
419 };
kono
parents:
diff changeset
420
kono
parents:
diff changeset
421 struct ErrorDescription {
kono
parents:
diff changeset
422 ErrorKind kind;
kono
parents:
diff changeset
423 // We're using a tagged union because it allows us to have a trivially
kono
parents:
diff changeset
424 // copiable type and use the same structures as the public interface.
kono
parents:
diff changeset
425 //
kono
parents:
diff changeset
426 // We can add a wrapper around it to make it "more c++-like", but that would
kono
parents:
diff changeset
427 // add a lot of code and the benefit wouldn't be that big.
kono
parents:
diff changeset
428 union {
kono
parents:
diff changeset
429 ErrorBase Base;
kono
parents:
diff changeset
430 ASAN_FOR_EACH_ERROR_KIND(ASAN_ERROR_DESCRIPTION_MEMBER)
kono
parents:
diff changeset
431 };
kono
parents:
diff changeset
432
kono
parents:
diff changeset
433 ErrorDescription() { internal_memset(this, 0, sizeof(*this)); }
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
434 explicit ErrorDescription(LinkerInitialized) {}
111
kono
parents:
diff changeset
435 ASAN_FOR_EACH_ERROR_KIND(ASAN_ERROR_DESCRIPTION_CONSTRUCTOR)
kono
parents:
diff changeset
436
kono
parents:
diff changeset
437 bool IsValid() { return kind != kErrorKindInvalid; }
kono
parents:
diff changeset
438 void Print() {
kono
parents:
diff changeset
439 switch (kind) {
kono
parents:
diff changeset
440 ASAN_FOR_EACH_ERROR_KIND(ASAN_ERROR_DESCRIPTION_PRINT)
kono
parents:
diff changeset
441 case kErrorKindInvalid:
kono
parents:
diff changeset
442 CHECK(0);
kono
parents:
diff changeset
443 }
kono
parents:
diff changeset
444 CHECK(0);
kono
parents:
diff changeset
445 }
kono
parents:
diff changeset
446 };
kono
parents:
diff changeset
447
kono
parents:
diff changeset
448 #undef ASAN_FOR_EACH_ERROR_KIND
kono
parents:
diff changeset
449 #undef ASAN_DEFINE_ERROR_KIND
kono
parents:
diff changeset
450 #undef ASAN_ERROR_DESCRIPTION_MEMBER
kono
parents:
diff changeset
451 #undef ASAN_ERROR_DESCRIPTION_CONSTRUCTOR
kono
parents:
diff changeset
452 #undef ASAN_ERROR_DESCRIPTION_PRINT
kono
parents:
diff changeset
453
kono
parents:
diff changeset
454 } // namespace __asan
kono
parents:
diff changeset
455
kono
parents:
diff changeset
456 #endif // ASAN_ERRORS_H