]>
Commit | Line | Data |
---|---|---|
1a4d82fc JJ |
1 | //===-- sanitizer_stackdepot_test.cc --------------------------------------===// |
2 | // | |
3 | // The LLVM Compiler Infrastructure | |
4 | // | |
5 | // This file is distributed under the University of Illinois Open Source | |
6 | // License. See LICENSE.TXT for details. | |
7 | // | |
8 | //===----------------------------------------------------------------------===// | |
9 | // | |
10 | // This file is a part of ThreadSanitizer/AddressSanitizer runtime. | |
11 | // | |
12 | //===----------------------------------------------------------------------===// | |
13 | #include "sanitizer_common/sanitizer_stackdepot.h" | |
14 | #include "sanitizer_common/sanitizer_internal_defs.h" | |
15 | #include "sanitizer_common/sanitizer_libc.h" | |
16 | #include "gtest/gtest.h" | |
17 | ||
18 | namespace __sanitizer { | |
19 | ||
20 | TEST(SanitizerCommon, StackDepotBasic) { | |
92a42be0 SL |
21 | uptr array[] = {1, 2, 3, 4, 5}; |
22 | StackTrace s1(array, ARRAY_SIZE(array)); | |
23 | u32 i1 = StackDepotPut(s1); | |
24 | StackTrace stack = StackDepotGet(i1); | |
25 | EXPECT_NE(stack.trace, (uptr*)0); | |
26 | EXPECT_EQ(ARRAY_SIZE(array), stack.size); | |
27 | EXPECT_EQ(0, internal_memcmp(stack.trace, array, sizeof(array))); | |
1a4d82fc JJ |
28 | } |
29 | ||
30 | TEST(SanitizerCommon, StackDepotAbsent) { | |
92a42be0 SL |
31 | StackTrace stack = StackDepotGet((1 << 30) - 1); |
32 | EXPECT_EQ((uptr*)0, stack.trace); | |
1a4d82fc JJ |
33 | } |
34 | ||
35 | TEST(SanitizerCommon, StackDepotEmptyStack) { | |
92a42be0 SL |
36 | u32 i1 = StackDepotPut(StackTrace()); |
37 | StackTrace stack = StackDepotGet(i1); | |
38 | EXPECT_EQ((uptr*)0, stack.trace); | |
1a4d82fc JJ |
39 | } |
40 | ||
41 | TEST(SanitizerCommon, StackDepotZeroId) { | |
92a42be0 SL |
42 | StackTrace stack = StackDepotGet(0); |
43 | EXPECT_EQ((uptr*)0, stack.trace); | |
1a4d82fc JJ |
44 | } |
45 | ||
46 | TEST(SanitizerCommon, StackDepotSame) { | |
92a42be0 SL |
47 | uptr array[] = {1, 2, 3, 4, 6}; |
48 | StackTrace s1(array, ARRAY_SIZE(array)); | |
49 | u32 i1 = StackDepotPut(s1); | |
50 | u32 i2 = StackDepotPut(s1); | |
1a4d82fc | 51 | EXPECT_EQ(i1, i2); |
92a42be0 SL |
52 | StackTrace stack = StackDepotGet(i1); |
53 | EXPECT_NE(stack.trace, (uptr*)0); | |
54 | EXPECT_EQ(ARRAY_SIZE(array), stack.size); | |
55 | EXPECT_EQ(0, internal_memcmp(stack.trace, array, sizeof(array))); | |
1a4d82fc JJ |
56 | } |
57 | ||
58 | TEST(SanitizerCommon, StackDepotSeveral) { | |
92a42be0 SL |
59 | uptr array1[] = {1, 2, 3, 4, 7}; |
60 | StackTrace s1(array1, ARRAY_SIZE(array1)); | |
61 | u32 i1 = StackDepotPut(s1); | |
62 | uptr array2[] = {1, 2, 3, 4, 8, 9}; | |
63 | StackTrace s2(array2, ARRAY_SIZE(array2)); | |
64 | u32 i2 = StackDepotPut(s2); | |
1a4d82fc JJ |
65 | EXPECT_NE(i1, i2); |
66 | } | |
67 | ||
68 | TEST(SanitizerCommon, StackDepotReverseMap) { | |
92a42be0 SL |
69 | uptr array1[] = {1, 2, 3, 4, 5}; |
70 | uptr array2[] = {7, 1, 3, 0}; | |
71 | uptr array3[] = {10, 2, 5, 3}; | |
72 | uptr array4[] = {1, 3, 2, 5}; | |
1a4d82fc | 73 | u32 ids[4] = {0}; |
92a42be0 SL |
74 | StackTrace s1(array1, ARRAY_SIZE(array1)); |
75 | StackTrace s2(array2, ARRAY_SIZE(array2)); | |
76 | StackTrace s3(array3, ARRAY_SIZE(array3)); | |
77 | StackTrace s4(array4, ARRAY_SIZE(array4)); | |
78 | ids[0] = StackDepotPut(s1); | |
79 | ids[1] = StackDepotPut(s2); | |
80 | ids[2] = StackDepotPut(s3); | |
81 | ids[3] = StackDepotPut(s4); | |
1a4d82fc JJ |
82 | |
83 | StackDepotReverseMap map; | |
84 | ||
85 | for (uptr i = 0; i < 4; i++) { | |
92a42be0 SL |
86 | StackTrace stack = StackDepotGet(ids[i]); |
87 | StackTrace from_map = map.Get(ids[i]); | |
88 | EXPECT_EQ(stack.size, from_map.size); | |
89 | EXPECT_EQ(stack.trace, from_map.trace); | |
1a4d82fc JJ |
90 | } |
91 | } | |
92 | ||
93 | } // namespace __sanitizer |