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 18namespace __sanitizer { 19 20TEST(SanitizerCommon, StackDepotBasic) { 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))); 28} 29 30TEST(SanitizerCommon, StackDepotAbsent) { 31 StackTrace stack = StackDepotGet((1 << 30) - 1); 32 EXPECT_EQ((uptr*)0, stack.trace); 33} 34 35TEST(SanitizerCommon, StackDepotEmptyStack) { 36 u32 i1 = StackDepotPut(StackTrace()); 37 StackTrace stack = StackDepotGet(i1); 38 EXPECT_EQ((uptr*)0, stack.trace); 39} 40 41TEST(SanitizerCommon, StackDepotZeroId) { 42 StackTrace stack = StackDepotGet(0); 43 EXPECT_EQ((uptr*)0, stack.trace); 44} 45 46TEST(SanitizerCommon, StackDepotSame) { 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); 51 EXPECT_EQ(i1, i2); 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))); 56} 57 58TEST(SanitizerCommon, StackDepotSeveral) { 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); 65 EXPECT_NE(i1, i2); 66} 67 68TEST(SanitizerCommon, StackDepotReverseMap) { 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}; 73 u32 ids[4] = {0}; 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); 82 83 StackDepotReverseMap map; 84 85 for (uptr i = 0; i < 4; i++) { 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); 90 } 91} 92 93} // namespace __sanitizer 94