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