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