1 : // Copyright 2014 Google Inc. All Rights Reserved.
2 : //
3 : // Licensed under the Apache License, Version 2.0 (the "License");
4 : // you may not use this file except in compliance with the License.
5 : // You may obtain a copy of the License at
6 : //
7 : // http://www.apache.org/licenses/LICENSE-2.0
8 : //
9 : // Unless required by applicable law or agreed to in writing, software
10 : // distributed under the License is distributed on an "AS IS" BASIS,
11 : // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 : // See the License for the specific language governing permissions and
13 : // limitations under the License.
14 :
15 : #include "syzygy/agent/asan/shadow_marker.h"
16 :
17 : #include "gtest/gtest.h"
18 :
19 : namespace agent {
20 : namespace asan {
21 :
22 : namespace {
23 :
24 : // A list of all of the defined enumeration values.
25 : #define EXTRACT_ENUM_NAME_MACRO(x, y) x,
26 : static const ShadowMarker kValidShadowMarkers[] = {
27 : SHADOW_MARKER_GENERATOR(EXTRACT_ENUM_NAME_MACRO)
28 : };
29 : #undef EXTRACT_ENUM_NAME_MACRO
30 :
31 : static const ShadowMarker kRedzoneShadowMarkers[] = {
32 : kHeapHistoricBlockStartMarker0,
33 : kHeapHistoricBlockStartMarker1,
34 : kHeapHistoricBlockStartMarker2,
35 : kHeapHistoricBlockStartMarker3,
36 : kHeapHistoricBlockStartMarker4,
37 : kHeapHistoricBlockStartMarker5,
38 : kHeapHistoricBlockStartMarker6,
39 : kHeapHistoricBlockStartMarker7,
40 : kHeapHistoricNestedBlockStartMarker0,
41 : kHeapHistoricNestedBlockStartMarker1,
42 : kHeapHistoricNestedBlockStartMarker2,
43 : kHeapHistoricNestedBlockStartMarker3,
44 : kHeapHistoricNestedBlockStartMarker4,
45 : kHeapHistoricNestedBlockStartMarker5,
46 : kHeapHistoricNestedBlockStartMarker6,
47 : kHeapHistoricNestedBlockStartMarker7,
48 : kHeapHistoricBlockEndMarker,
49 : kHeapHistoricNestedBlockEndMarker,
50 : kHeapHistoricLeftPaddingMarker,
51 : kHeapHistoricRightPaddingMarker,
52 : kHeapHistoricFreedMarker,
53 : kHeapBlockStartMarker0,
54 : kHeapBlockStartMarker1,
55 : kHeapBlockStartMarker2,
56 : kHeapBlockStartMarker3,
57 : kHeapBlockStartMarker4,
58 : kHeapBlockStartMarker5,
59 : kHeapBlockStartMarker6,
60 : kHeapBlockStartMarker7,
61 : kHeapNestedBlockStartMarker0,
62 : kHeapNestedBlockStartMarker1,
63 : kHeapNestedBlockStartMarker2,
64 : kHeapNestedBlockStartMarker3,
65 : kHeapNestedBlockStartMarker4,
66 : kHeapNestedBlockStartMarker5,
67 : kHeapNestedBlockStartMarker6,
68 : kHeapNestedBlockStartMarker7,
69 : kAsanMemoryMarker,
70 : kInvalidAddressMarker,
71 : kUserRedzoneMarker,
72 : kHeapBlockEndMarker,
73 : kHeapNestedBlockEndMarker,
74 : kHeapLeftPaddingMarker,
75 : kHeapRightPaddingMarker,
76 : kAsanReservedMarker,
77 : kHeapFreedMarker,
78 : };
79 :
80 : static const ShadowMarker kActiveBlockShadowMarkers[] = {
81 : kHeapBlockStartMarker0,
82 : kHeapBlockStartMarker1,
83 : kHeapBlockStartMarker2,
84 : kHeapBlockStartMarker3,
85 : kHeapBlockStartMarker4,
86 : kHeapBlockStartMarker5,
87 : kHeapBlockStartMarker6,
88 : kHeapBlockStartMarker7,
89 : kHeapNestedBlockStartMarker0,
90 : kHeapNestedBlockStartMarker1,
91 : kHeapNestedBlockStartMarker2,
92 : kHeapNestedBlockStartMarker3,
93 : kHeapNestedBlockStartMarker4,
94 : kHeapNestedBlockStartMarker5,
95 : kHeapNestedBlockStartMarker6,
96 : kHeapNestedBlockStartMarker7,
97 : kHeapBlockEndMarker,
98 : kHeapNestedBlockEndMarker,
99 : kHeapLeftPaddingMarker,
100 : kHeapRightPaddingMarker,
101 : kHeapFreedMarker,
102 : };
103 :
104 : static const ShadowMarker kHistoricBlockShadowMarkers[] = {
105 : kHeapHistoricBlockStartMarker0,
106 : kHeapHistoricBlockStartMarker1,
107 : kHeapHistoricBlockStartMarker2,
108 : kHeapHistoricBlockStartMarker3,
109 : kHeapHistoricBlockStartMarker4,
110 : kHeapHistoricBlockStartMarker5,
111 : kHeapHistoricBlockStartMarker6,
112 : kHeapHistoricBlockStartMarker7,
113 : kHeapHistoricNestedBlockStartMarker0,
114 : kHeapHistoricNestedBlockStartMarker1,
115 : kHeapHistoricNestedBlockStartMarker2,
116 : kHeapHistoricNestedBlockStartMarker3,
117 : kHeapHistoricNestedBlockStartMarker4,
118 : kHeapHistoricNestedBlockStartMarker5,
119 : kHeapHistoricNestedBlockStartMarker6,
120 : kHeapHistoricNestedBlockStartMarker7,
121 : kHeapHistoricBlockEndMarker,
122 : kHeapHistoricNestedBlockEndMarker,
123 : kHeapHistoricLeftPaddingMarker,
124 : kHeapHistoricRightPaddingMarker,
125 : kHeapHistoricFreedMarker,
126 : };
127 :
128 : static const ShadowMarker kBlockShadowMarkers[] = {
129 : kHeapHistoricBlockStartMarker0,
130 : kHeapHistoricBlockStartMarker1,
131 : kHeapHistoricBlockStartMarker2,
132 : kHeapHistoricBlockStartMarker3,
133 : kHeapHistoricBlockStartMarker4,
134 : kHeapHistoricBlockStartMarker5,
135 : kHeapHistoricBlockStartMarker6,
136 : kHeapHistoricBlockStartMarker7,
137 : kHeapHistoricNestedBlockStartMarker0,
138 : kHeapHistoricNestedBlockStartMarker1,
139 : kHeapHistoricNestedBlockStartMarker2,
140 : kHeapHistoricNestedBlockStartMarker3,
141 : kHeapHistoricNestedBlockStartMarker4,
142 : kHeapHistoricNestedBlockStartMarker5,
143 : kHeapHistoricNestedBlockStartMarker6,
144 : kHeapHistoricNestedBlockStartMarker7,
145 : kHeapHistoricBlockEndMarker,
146 : kHeapHistoricNestedBlockEndMarker,
147 : kHeapHistoricLeftPaddingMarker,
148 : kHeapHistoricRightPaddingMarker,
149 : kHeapHistoricFreedMarker,
150 : kHeapBlockStartMarker0,
151 : kHeapBlockStartMarker1,
152 : kHeapBlockStartMarker2,
153 : kHeapBlockStartMarker3,
154 : kHeapBlockStartMarker4,
155 : kHeapBlockStartMarker5,
156 : kHeapBlockStartMarker6,
157 : kHeapBlockStartMarker7,
158 : kHeapNestedBlockStartMarker0,
159 : kHeapNestedBlockStartMarker1,
160 : kHeapNestedBlockStartMarker2,
161 : kHeapNestedBlockStartMarker3,
162 : kHeapNestedBlockStartMarker4,
163 : kHeapNestedBlockStartMarker5,
164 : kHeapNestedBlockStartMarker6,
165 : kHeapNestedBlockStartMarker7,
166 : kHeapBlockEndMarker,
167 : kHeapNestedBlockEndMarker,
168 : kHeapLeftPaddingMarker,
169 : kHeapRightPaddingMarker,
170 : kHeapFreedMarker,
171 : };
172 :
173 : static const ShadowMarker kActiveBlockStartShadowMarkers[] = {
174 : kHeapBlockStartMarker0,
175 : kHeapBlockStartMarker1,
176 : kHeapBlockStartMarker2,
177 : kHeapBlockStartMarker3,
178 : kHeapBlockStartMarker4,
179 : kHeapBlockStartMarker5,
180 : kHeapBlockStartMarker6,
181 : kHeapBlockStartMarker7,
182 : kHeapNestedBlockStartMarker0,
183 : kHeapNestedBlockStartMarker1,
184 : kHeapNestedBlockStartMarker2,
185 : kHeapNestedBlockStartMarker3,
186 : kHeapNestedBlockStartMarker4,
187 : kHeapNestedBlockStartMarker5,
188 : kHeapNestedBlockStartMarker6,
189 : kHeapNestedBlockStartMarker7,
190 : };
191 :
192 : static const ShadowMarker kHistoricBlockStartShadowMarkers[] = {
193 : kHeapHistoricBlockStartMarker0,
194 : kHeapHistoricBlockStartMarker1,
195 : kHeapHistoricBlockStartMarker2,
196 : kHeapHistoricBlockStartMarker3,
197 : kHeapHistoricBlockStartMarker4,
198 : kHeapHistoricBlockStartMarker5,
199 : kHeapHistoricBlockStartMarker6,
200 : kHeapHistoricBlockStartMarker7,
201 : kHeapHistoricNestedBlockStartMarker0,
202 : kHeapHistoricNestedBlockStartMarker1,
203 : kHeapHistoricNestedBlockStartMarker2,
204 : kHeapHistoricNestedBlockStartMarker3,
205 : kHeapHistoricNestedBlockStartMarker4,
206 : kHeapHistoricNestedBlockStartMarker5,
207 : kHeapHistoricNestedBlockStartMarker6,
208 : kHeapHistoricNestedBlockStartMarker7,
209 : };
210 :
211 : static const ShadowMarker kBlockStartShadowMarkers[] = {
212 : kHeapBlockStartMarker0,
213 : kHeapBlockStartMarker1,
214 : kHeapBlockStartMarker2,
215 : kHeapBlockStartMarker3,
216 : kHeapBlockStartMarker4,
217 : kHeapBlockStartMarker5,
218 : kHeapBlockStartMarker6,
219 : kHeapBlockStartMarker7,
220 : kHeapNestedBlockStartMarker0,
221 : kHeapNestedBlockStartMarker1,
222 : kHeapNestedBlockStartMarker2,
223 : kHeapNestedBlockStartMarker3,
224 : kHeapNestedBlockStartMarker4,
225 : kHeapNestedBlockStartMarker5,
226 : kHeapNestedBlockStartMarker6,
227 : kHeapNestedBlockStartMarker7,
228 : kHeapHistoricBlockStartMarker0,
229 : kHeapHistoricBlockStartMarker1,
230 : kHeapHistoricBlockStartMarker2,
231 : kHeapHistoricBlockStartMarker3,
232 : kHeapHistoricBlockStartMarker4,
233 : kHeapHistoricBlockStartMarker5,
234 : kHeapHistoricBlockStartMarker6,
235 : kHeapHistoricBlockStartMarker7,
236 : kHeapHistoricNestedBlockStartMarker0,
237 : kHeapHistoricNestedBlockStartMarker1,
238 : kHeapHistoricNestedBlockStartMarker2,
239 : kHeapHistoricNestedBlockStartMarker3,
240 : kHeapHistoricNestedBlockStartMarker4,
241 : kHeapHistoricNestedBlockStartMarker5,
242 : kHeapHistoricNestedBlockStartMarker6,
243 : kHeapHistoricNestedBlockStartMarker7,
244 : };
245 :
246 : static const ShadowMarker kNestedBlockStartShadowMarkers[] = {
247 : kHeapNestedBlockStartMarker0,
248 : kHeapNestedBlockStartMarker1,
249 : kHeapNestedBlockStartMarker2,
250 : kHeapNestedBlockStartMarker3,
251 : kHeapNestedBlockStartMarker4,
252 : kHeapNestedBlockStartMarker5,
253 : kHeapNestedBlockStartMarker6,
254 : kHeapNestedBlockStartMarker7,
255 : kHeapHistoricNestedBlockStartMarker0,
256 : kHeapHistoricNestedBlockStartMarker1,
257 : kHeapHistoricNestedBlockStartMarker2,
258 : kHeapHistoricNestedBlockStartMarker3,
259 : kHeapHistoricNestedBlockStartMarker4,
260 : kHeapHistoricNestedBlockStartMarker5,
261 : kHeapHistoricNestedBlockStartMarker6,
262 : kHeapHistoricNestedBlockStartMarker7,
263 : };
264 :
265 : static const ShadowMarker kActiveBlockEndShadowMarkers[] = {
266 : kHeapBlockEndMarker,
267 : kHeapNestedBlockEndMarker,
268 : };
269 :
270 : static const ShadowMarker kHistoricBlockEndShadowMarkers[] = {
271 : kHeapHistoricBlockEndMarker,
272 : kHeapHistoricNestedBlockEndMarker,
273 : };
274 :
275 : static const ShadowMarker kBlockEndShadowMarkers[] = {
276 : kHeapHistoricBlockEndMarker,
277 : kHeapHistoricNestedBlockEndMarker,
278 : kHeapBlockEndMarker,
279 : kHeapNestedBlockEndMarker,
280 : };
281 :
282 : static const ShadowMarker kNestedBlockEndShadowMarkers[] = {
283 : kHeapHistoricNestedBlockEndMarker,
284 : kHeapNestedBlockEndMarker,
285 : };
286 :
287 : static const ShadowMarker kHistoricLeftRedzoneShadowMarkers[] = {
288 : kHeapHistoricBlockStartMarker0,
289 : kHeapHistoricBlockStartMarker1,
290 : kHeapHistoricBlockStartMarker2,
291 : kHeapHistoricBlockStartMarker3,
292 : kHeapHistoricBlockStartMarker4,
293 : kHeapHistoricBlockStartMarker5,
294 : kHeapHistoricBlockStartMarker6,
295 : kHeapHistoricBlockStartMarker7,
296 : kHeapHistoricNestedBlockStartMarker0,
297 : kHeapHistoricNestedBlockStartMarker1,
298 : kHeapHistoricNestedBlockStartMarker2,
299 : kHeapHistoricNestedBlockStartMarker3,
300 : kHeapHistoricNestedBlockStartMarker4,
301 : kHeapHistoricNestedBlockStartMarker5,
302 : kHeapHistoricNestedBlockStartMarker6,
303 : kHeapHistoricNestedBlockStartMarker7,
304 : kHeapHistoricLeftPaddingMarker,
305 : };
306 :
307 : static const ShadowMarker kActiveLeftRedzoneShadowMarkers[] = {
308 : kHeapBlockStartMarker0,
309 : kHeapBlockStartMarker1,
310 : kHeapBlockStartMarker2,
311 : kHeapBlockStartMarker3,
312 : kHeapBlockStartMarker4,
313 : kHeapBlockStartMarker5,
314 : kHeapBlockStartMarker6,
315 : kHeapBlockStartMarker7,
316 : kHeapNestedBlockStartMarker0,
317 : kHeapNestedBlockStartMarker1,
318 : kHeapNestedBlockStartMarker2,
319 : kHeapNestedBlockStartMarker3,
320 : kHeapNestedBlockStartMarker4,
321 : kHeapNestedBlockStartMarker5,
322 : kHeapNestedBlockStartMarker6,
323 : kHeapNestedBlockStartMarker7,
324 : kHeapLeftPaddingMarker,
325 : };
326 :
327 : static const ShadowMarker kLeftRedzoneShadowMarkers[] = {
328 : kHeapHistoricBlockStartMarker0,
329 : kHeapHistoricBlockStartMarker1,
330 : kHeapHistoricBlockStartMarker2,
331 : kHeapHistoricBlockStartMarker3,
332 : kHeapHistoricBlockStartMarker4,
333 : kHeapHistoricBlockStartMarker5,
334 : kHeapHistoricBlockStartMarker6,
335 : kHeapHistoricBlockStartMarker7,
336 : kHeapHistoricNestedBlockStartMarker0,
337 : kHeapHistoricNestedBlockStartMarker1,
338 : kHeapHistoricNestedBlockStartMarker2,
339 : kHeapHistoricNestedBlockStartMarker3,
340 : kHeapHistoricNestedBlockStartMarker4,
341 : kHeapHistoricNestedBlockStartMarker5,
342 : kHeapHistoricNestedBlockStartMarker6,
343 : kHeapHistoricNestedBlockStartMarker7,
344 : kHeapHistoricLeftPaddingMarker,
345 : kHeapBlockStartMarker0,
346 : kHeapBlockStartMarker1,
347 : kHeapBlockStartMarker2,
348 : kHeapBlockStartMarker3,
349 : kHeapBlockStartMarker4,
350 : kHeapBlockStartMarker5,
351 : kHeapBlockStartMarker6,
352 : kHeapBlockStartMarker7,
353 : kHeapNestedBlockStartMarker0,
354 : kHeapNestedBlockStartMarker1,
355 : kHeapNestedBlockStartMarker2,
356 : kHeapNestedBlockStartMarker3,
357 : kHeapNestedBlockStartMarker4,
358 : kHeapNestedBlockStartMarker5,
359 : kHeapNestedBlockStartMarker6,
360 : kHeapNestedBlockStartMarker7,
361 : kHeapLeftPaddingMarker,
362 : };
363 :
364 : static const ShadowMarker kHistoricRightRedzoneShadowMarkers[] = {
365 : kHeapHistoricBlockEndMarker,
366 : kHeapHistoricNestedBlockEndMarker,
367 : kHeapHistoricRightPaddingMarker,
368 : };
369 :
370 : static const ShadowMarker kActiveRightRedzoneShadowMarkers[] = {
371 : kHeapBlockEndMarker,
372 : kHeapNestedBlockEndMarker,
373 : kHeapRightPaddingMarker,
374 : };
375 :
376 : static const ShadowMarker kRightRedzoneShadowMarkers[] = {
377 : kHeapHistoricBlockEndMarker,
378 : kHeapHistoricNestedBlockEndMarker,
379 : kHeapHistoricRightPaddingMarker,
380 : kHeapBlockEndMarker,
381 : kHeapNestedBlockEndMarker,
382 : kHeapRightPaddingMarker,
383 : };
384 :
385 : // Pointer to a query function.
386 : typedef bool (*ShadowMarkerQueryFunctionPtr)(ShadowMarkerValue marker);
387 :
388 : // Tests a shadow marker query function. Iterates over all markers defined in
389 : // both |shadow_markers_to_test| and |passing_shadow_markers|. Expects the
390 : // function to return true if the marker is in |passing_shadow_markers|, false
391 : // otherwise. Markers may be defined in both lists.
392 : //
393 : // Meant to be called via EXPECT_NO_FATAL_FAILURES or ASSERT_NO_FATAL_FAILURES.
394 : void TestShadowMarkerQueryFunction(
395 : const char* function_name,
396 : const ShadowMarker* shadow_markers_to_test,
397 : size_t num_shadow_markers_to_test,
398 : const ShadowMarker* passing_shadow_markers,
399 : size_t num_passing_shadow_markers,
400 E : ShadowMarkerQueryFunctionPtr function) {
401 : std::set<ShadowMarker> expect_fail(
402 : shadow_markers_to_test,
403 E : shadow_markers_to_test + num_shadow_markers_to_test);
404 :
405 E : char buffer[5] = {};
406 E : for (size_t i = 0; i < num_passing_shadow_markers; ++i) {
407 E : ShadowMarker marker = passing_shadow_markers[i];
408 E : if (!(*function)(marker)) {
409 i : ::_snprintf(buffer, arraysize(buffer), "0x%02X", marker);
410 i : ADD_FAILURE() << function_name << "(" << kShadowMarkerNames[marker]
411 : << " = " << buffer << ") returned false, expected true.";
412 : }
413 E : expect_fail.erase(marker);
414 E : }
415 :
416 E : std::set<ShadowMarker>::const_iterator it = expect_fail.begin();
417 E : for (; it != expect_fail.end(); ++it) {
418 E : if ((*function)(*it)) {
419 i : ::_snprintf(buffer, arraysize(buffer), "0x%02X", *it);
420 i : ADD_FAILURE() << function_name << "(" << kShadowMarkerNames[*it]
421 : << " = " << buffer << ") returned true, expected false.";
422 : }
423 E : }
424 E : }
425 :
426 : // A version of the function that explicitly tests against all shadow markers.
427 : void TestShadowMarkerQueryFunction(
428 : const char* function_name,
429 : const ShadowMarker* passing_shadow_markers,
430 : size_t num_passing_shadow_markers,
431 E : ShadowMarkerQueryFunctionPtr function) {
432 : TestShadowMarkerQueryFunction(function_name,
433 : kValidShadowMarkers,
434 : arraysize(kValidShadowMarkers),
435 : passing_shadow_markers,
436 : num_passing_shadow_markers,
437 E : function);
438 E : }
439 :
440 : } // namespace
441 :
442 : #define TEST_SHADOW_MARKER_FUNCTION_COMPLETE(Name) \
443 : TEST(ShadowMarkerHelperTest, Is ## Name) { \
444 : EXPECT_NO_FATAL_FAILURE(TestShadowMarkerQueryFunction( \
445 : "ShadowMarkerHerlp::Is" _STRINGIZE(Name), \
446 : k ## Name ## ShadowMarkers, \
447 : arraysize(k ## Name ## ShadowMarkers), \
448 : &ShadowMarkerHelper::Is ## Name)); \
449 : }
450 :
451 : // This tests the various shadow marker querying functions.
452 E : TEST_SHADOW_MARKER_FUNCTION_COMPLETE(Redzone);
453 E : TEST_SHADOW_MARKER_FUNCTION_COMPLETE(ActiveBlock);
454 E : TEST_SHADOW_MARKER_FUNCTION_COMPLETE(HistoricBlock);
455 E : TEST_SHADOW_MARKER_FUNCTION_COMPLETE(Block);
456 E : TEST_SHADOW_MARKER_FUNCTION_COMPLETE(ActiveBlockStart);
457 E : TEST_SHADOW_MARKER_FUNCTION_COMPLETE(HistoricBlockStart);
458 E : TEST_SHADOW_MARKER_FUNCTION_COMPLETE(BlockStart);
459 E : TEST_SHADOW_MARKER_FUNCTION_COMPLETE(NestedBlockStart);
460 E : TEST_SHADOW_MARKER_FUNCTION_COMPLETE(ActiveBlockEnd);
461 E : TEST_SHADOW_MARKER_FUNCTION_COMPLETE(HistoricBlockEnd);
462 E : TEST_SHADOW_MARKER_FUNCTION_COMPLETE(BlockEnd);
463 E : TEST_SHADOW_MARKER_FUNCTION_COMPLETE(NestedBlockEnd);
464 E : TEST_SHADOW_MARKER_FUNCTION_COMPLETE(HistoricLeftRedzone);
465 E : TEST_SHADOW_MARKER_FUNCTION_COMPLETE(ActiveLeftRedzone);
466 E : TEST_SHADOW_MARKER_FUNCTION_COMPLETE(LeftRedzone);
467 E : TEST_SHADOW_MARKER_FUNCTION_COMPLETE(HistoricRightRedzone);
468 E : TEST_SHADOW_MARKER_FUNCTION_COMPLETE(ActiveRightRedzone);
469 E : TEST_SHADOW_MARKER_FUNCTION_COMPLETE(RightRedzone);
470 : #undef TEST_SHADOW_MARKER_FUNCTION_COMPLETE
471 :
472 E : TEST(ShadowMarkerHelperTest, GetBlockStartData) {
473 : EXPECT_EQ(0u, ShadowMarkerHelper::GetBlockStartData(
474 E : kHeapHistoricBlockStartMarker0));
475 : EXPECT_EQ(1u, ShadowMarkerHelper::GetBlockStartData(
476 E : kHeapHistoricBlockStartMarker1));
477 : EXPECT_EQ(2u, ShadowMarkerHelper::GetBlockStartData(
478 E : kHeapHistoricBlockStartMarker2));
479 : EXPECT_EQ(3u, ShadowMarkerHelper::GetBlockStartData(
480 E : kHeapHistoricBlockStartMarker3));
481 : EXPECT_EQ(4u, ShadowMarkerHelper::GetBlockStartData(
482 E : kHeapHistoricBlockStartMarker4));
483 : EXPECT_EQ(5u, ShadowMarkerHelper::GetBlockStartData(
484 E : kHeapHistoricBlockStartMarker5));
485 : EXPECT_EQ(6u, ShadowMarkerHelper::GetBlockStartData(
486 E : kHeapHistoricBlockStartMarker6));
487 : EXPECT_EQ(7u, ShadowMarkerHelper::GetBlockStartData(
488 E : kHeapHistoricBlockStartMarker7));
489 : EXPECT_EQ(0u, ShadowMarkerHelper::GetBlockStartData(
490 E : kHeapHistoricNestedBlockStartMarker0));
491 : EXPECT_EQ(1u, ShadowMarkerHelper::GetBlockStartData(
492 E : kHeapHistoricNestedBlockStartMarker1));
493 : EXPECT_EQ(2u, ShadowMarkerHelper::GetBlockStartData(
494 E : kHeapHistoricNestedBlockStartMarker2));
495 : EXPECT_EQ(3u, ShadowMarkerHelper::GetBlockStartData(
496 E : kHeapHistoricNestedBlockStartMarker3));
497 : EXPECT_EQ(4u, ShadowMarkerHelper::GetBlockStartData(
498 E : kHeapHistoricNestedBlockStartMarker4));
499 : EXPECT_EQ(5u, ShadowMarkerHelper::GetBlockStartData(
500 E : kHeapHistoricNestedBlockStartMarker5));
501 : EXPECT_EQ(6u, ShadowMarkerHelper::GetBlockStartData(
502 E : kHeapHistoricNestedBlockStartMarker6));
503 : EXPECT_EQ(7u, ShadowMarkerHelper::GetBlockStartData(
504 E : kHeapHistoricNestedBlockStartMarker7));
505 : EXPECT_EQ(0u, ShadowMarkerHelper::GetBlockStartData(
506 E : kHeapBlockStartMarker0));
507 : EXPECT_EQ(1u, ShadowMarkerHelper::GetBlockStartData(
508 E : kHeapBlockStartMarker1));
509 : EXPECT_EQ(2u, ShadowMarkerHelper::GetBlockStartData(
510 E : kHeapBlockStartMarker2));
511 : EXPECT_EQ(3u, ShadowMarkerHelper::GetBlockStartData(
512 E : kHeapBlockStartMarker3));
513 : EXPECT_EQ(4u, ShadowMarkerHelper::GetBlockStartData(
514 E : kHeapBlockStartMarker4));
515 : EXPECT_EQ(5u, ShadowMarkerHelper::GetBlockStartData(
516 E : kHeapBlockStartMarker5));
517 : EXPECT_EQ(6u, ShadowMarkerHelper::GetBlockStartData(
518 E : kHeapBlockStartMarker6));
519 : EXPECT_EQ(7u, ShadowMarkerHelper::GetBlockStartData(
520 E : kHeapBlockStartMarker7));
521 : EXPECT_EQ(0u, ShadowMarkerHelper::GetBlockStartData(
522 E : kHeapNestedBlockStartMarker0));
523 : EXPECT_EQ(1u, ShadowMarkerHelper::GetBlockStartData(
524 E : kHeapNestedBlockStartMarker1));
525 : EXPECT_EQ(2u, ShadowMarkerHelper::GetBlockStartData(
526 E : kHeapNestedBlockStartMarker2));
527 : EXPECT_EQ(3u, ShadowMarkerHelper::GetBlockStartData(
528 E : kHeapNestedBlockStartMarker3));
529 : EXPECT_EQ(4u, ShadowMarkerHelper::GetBlockStartData(
530 E : kHeapNestedBlockStartMarker4));
531 : EXPECT_EQ(5u, ShadowMarkerHelper::GetBlockStartData(
532 E : kHeapNestedBlockStartMarker5));
533 : EXPECT_EQ(6u, ShadowMarkerHelper::GetBlockStartData(
534 E : kHeapNestedBlockStartMarker6));
535 : EXPECT_EQ(7u, ShadowMarkerHelper::GetBlockStartData(
536 E : kHeapNestedBlockStartMarker7));
537 E : }
538 :
539 E : TEST(ShadowMarkerHelper, ToHistoric) {
540 : EXPECT_EQ(kHeapHistoricBlockStartMarker0,
541 E : ShadowMarkerHelper::ToHistoric(kHeapBlockStartMarker0));
542 : EXPECT_EQ(kHeapHistoricBlockStartMarker1,
543 E : ShadowMarkerHelper::ToHistoric(kHeapBlockStartMarker1));
544 : EXPECT_EQ(kHeapHistoricBlockStartMarker2,
545 E : ShadowMarkerHelper::ToHistoric(kHeapBlockStartMarker2));
546 : EXPECT_EQ(kHeapHistoricBlockStartMarker3,
547 E : ShadowMarkerHelper::ToHistoric(kHeapBlockStartMarker3));
548 : EXPECT_EQ(kHeapHistoricBlockStartMarker4,
549 E : ShadowMarkerHelper::ToHistoric(kHeapBlockStartMarker4));
550 : EXPECT_EQ(kHeapHistoricBlockStartMarker5,
551 E : ShadowMarkerHelper::ToHistoric(kHeapBlockStartMarker5));
552 : EXPECT_EQ(kHeapHistoricBlockStartMarker6,
553 E : ShadowMarkerHelper::ToHistoric(kHeapBlockStartMarker6));
554 : EXPECT_EQ(kHeapHistoricBlockStartMarker7,
555 E : ShadowMarkerHelper::ToHistoric(kHeapBlockStartMarker7));
556 : EXPECT_EQ(kHeapHistoricNestedBlockStartMarker0,
557 E : ShadowMarkerHelper::ToHistoric(kHeapNestedBlockStartMarker0));
558 : EXPECT_EQ(kHeapHistoricNestedBlockStartMarker1,
559 E : ShadowMarkerHelper::ToHistoric(kHeapNestedBlockStartMarker1));
560 : EXPECT_EQ(kHeapHistoricNestedBlockStartMarker2,
561 E : ShadowMarkerHelper::ToHistoric(kHeapNestedBlockStartMarker2));
562 : EXPECT_EQ(kHeapHistoricNestedBlockStartMarker3,
563 E : ShadowMarkerHelper::ToHistoric(kHeapNestedBlockStartMarker3));
564 : EXPECT_EQ(kHeapHistoricNestedBlockStartMarker4,
565 E : ShadowMarkerHelper::ToHistoric(kHeapNestedBlockStartMarker4));
566 : EXPECT_EQ(kHeapHistoricNestedBlockStartMarker5,
567 E : ShadowMarkerHelper::ToHistoric(kHeapNestedBlockStartMarker5));
568 : EXPECT_EQ(kHeapHistoricNestedBlockStartMarker6,
569 E : ShadowMarkerHelper::ToHistoric(kHeapNestedBlockStartMarker6));
570 : EXPECT_EQ(kHeapHistoricNestedBlockStartMarker7,
571 E : ShadowMarkerHelper::ToHistoric(kHeapNestedBlockStartMarker7));
572 : EXPECT_EQ(kHeapHistoricBlockEndMarker,
573 E : ShadowMarkerHelper::ToHistoric(kHeapBlockEndMarker));
574 : EXPECT_EQ(kHeapHistoricNestedBlockEndMarker,
575 E : ShadowMarkerHelper::ToHistoric(kHeapNestedBlockEndMarker));
576 : EXPECT_EQ(kHeapHistoricLeftPaddingMarker,
577 E : ShadowMarkerHelper::ToHistoric(kHeapLeftPaddingMarker));
578 : EXPECT_EQ(kHeapHistoricRightPaddingMarker,
579 E : ShadowMarkerHelper::ToHistoric(kHeapRightPaddingMarker));
580 : EXPECT_EQ(kHeapHistoricFreedMarker,
581 E : ShadowMarkerHelper::ToHistoric(kHeapFreedMarker));
582 E : }
583 :
584 E : TEST(ShadowMarkerHelper, BuildBlockStart) {
585 : EXPECT_EQ(kHeapHistoricBlockStartMarker0,
586 E : ShadowMarkerHelper::BuildBlockStart(false, false, 0));
587 : EXPECT_EQ(kHeapHistoricBlockStartMarker1,
588 E : ShadowMarkerHelper::BuildBlockStart(false, false, 1));
589 : EXPECT_EQ(kHeapHistoricBlockStartMarker2,
590 E : ShadowMarkerHelper::BuildBlockStart(false, false, 2));
591 : EXPECT_EQ(kHeapHistoricBlockStartMarker3,
592 E : ShadowMarkerHelper::BuildBlockStart(false, false, 3));
593 : EXPECT_EQ(kHeapHistoricBlockStartMarker4,
594 E : ShadowMarkerHelper::BuildBlockStart(false, false, 4));
595 : EXPECT_EQ(kHeapHistoricBlockStartMarker5,
596 E : ShadowMarkerHelper::BuildBlockStart(false, false, 5));
597 : EXPECT_EQ(kHeapHistoricBlockStartMarker6,
598 E : ShadowMarkerHelper::BuildBlockStart(false, false, 6));
599 : EXPECT_EQ(kHeapHistoricBlockStartMarker7,
600 E : ShadowMarkerHelper::BuildBlockStart(false, false, 7));
601 :
602 : EXPECT_EQ(kHeapHistoricNestedBlockStartMarker0,
603 E : ShadowMarkerHelper::BuildBlockStart(false, true, 0));
604 : EXPECT_EQ(kHeapHistoricNestedBlockStartMarker1,
605 E : ShadowMarkerHelper::BuildBlockStart(false, true, 1));
606 : EXPECT_EQ(kHeapHistoricNestedBlockStartMarker2,
607 E : ShadowMarkerHelper::BuildBlockStart(false, true, 2));
608 : EXPECT_EQ(kHeapHistoricNestedBlockStartMarker3,
609 E : ShadowMarkerHelper::BuildBlockStart(false, true, 3));
610 : EXPECT_EQ(kHeapHistoricNestedBlockStartMarker4,
611 E : ShadowMarkerHelper::BuildBlockStart(false, true, 4));
612 : EXPECT_EQ(kHeapHistoricNestedBlockStartMarker5,
613 E : ShadowMarkerHelper::BuildBlockStart(false, true, 5));
614 : EXPECT_EQ(kHeapHistoricNestedBlockStartMarker6,
615 E : ShadowMarkerHelper::BuildBlockStart(false, true, 6));
616 : EXPECT_EQ(kHeapHistoricNestedBlockStartMarker7,
617 E : ShadowMarkerHelper::BuildBlockStart(false, true, 7));
618 :
619 : EXPECT_EQ(kHeapBlockStartMarker0,
620 E : ShadowMarkerHelper::BuildBlockStart(true, false, 0));
621 : EXPECT_EQ(kHeapBlockStartMarker1,
622 E : ShadowMarkerHelper::BuildBlockStart(true, false, 1));
623 : EXPECT_EQ(kHeapBlockStartMarker2,
624 E : ShadowMarkerHelper::BuildBlockStart(true, false, 2));
625 : EXPECT_EQ(kHeapBlockStartMarker3,
626 E : ShadowMarkerHelper::BuildBlockStart(true, false, 3));
627 : EXPECT_EQ(kHeapBlockStartMarker4,
628 E : ShadowMarkerHelper::BuildBlockStart(true, false, 4));
629 : EXPECT_EQ(kHeapBlockStartMarker5,
630 E : ShadowMarkerHelper::BuildBlockStart(true, false, 5));
631 : EXPECT_EQ(kHeapBlockStartMarker6,
632 E : ShadowMarkerHelper::BuildBlockStart(true, false, 6));
633 : EXPECT_EQ(kHeapBlockStartMarker7,
634 E : ShadowMarkerHelper::BuildBlockStart(true, false, 7));
635 :
636 : EXPECT_EQ(kHeapNestedBlockStartMarker0,
637 E : ShadowMarkerHelper::BuildBlockStart(true, true, 0));
638 : EXPECT_EQ(kHeapNestedBlockStartMarker1,
639 E : ShadowMarkerHelper::BuildBlockStart(true, true, 1));
640 : EXPECT_EQ(kHeapNestedBlockStartMarker2,
641 E : ShadowMarkerHelper::BuildBlockStart(true, true, 2));
642 : EXPECT_EQ(kHeapNestedBlockStartMarker3,
643 E : ShadowMarkerHelper::BuildBlockStart(true, true, 3));
644 : EXPECT_EQ(kHeapNestedBlockStartMarker4,
645 E : ShadowMarkerHelper::BuildBlockStart(true, true, 4));
646 : EXPECT_EQ(kHeapNestedBlockStartMarker5,
647 E : ShadowMarkerHelper::BuildBlockStart(true, true, 5));
648 : EXPECT_EQ(kHeapNestedBlockStartMarker6,
649 E : ShadowMarkerHelper::BuildBlockStart(true, true, 6));
650 : EXPECT_EQ(kHeapNestedBlockStartMarker7,
651 E : ShadowMarkerHelper::BuildBlockStart(true, true, 7));
652 E : }
653 :
654 E : TEST(ShadowMarkerHelper, BuildBlockEnd) {
655 : EXPECT_EQ(kHeapHistoricBlockEndMarker,
656 E : ShadowMarkerHelper::BuildBlockEnd(false, false));
657 : EXPECT_EQ(kHeapHistoricNestedBlockEndMarker,
658 E : ShadowMarkerHelper::BuildBlockEnd(false, true));
659 : EXPECT_EQ(kHeapBlockEndMarker,
660 E : ShadowMarkerHelper::BuildBlockEnd(true, false));
661 : EXPECT_EQ(kHeapNestedBlockEndMarker,
662 E : ShadowMarkerHelper::BuildBlockEnd(true, true));
663 E : }
664 :
665 : } // namespace asan
666 : } // namespace agent
|