| //===-- sanitizer_stackdepot_test.cc --------------------------------------===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file is a part of ThreadSanitizer/AddressSanitizer runtime. |
| // |
| //===----------------------------------------------------------------------===// |
| #include "sanitizer_common/sanitizer_stackdepot.h" |
| #include "sanitizer_common/sanitizer_internal_defs.h" |
| #include "sanitizer_common/sanitizer_libc.h" |
| #include "gtest/gtest.h" |
| |
| namespace __sanitizer { |
| |
| TEST(SanitizerCommon, StackDepotBasic) { |
| uptr array[] = {1, 2, 3, 4, 5}; |
| StackTrace s1(array, ARRAY_SIZE(array)); |
| u32 i1 = StackDepotPut(s1); |
| StackTrace stack = StackDepotGet(i1); |
| EXPECT_NE(stack.trace, (uptr*)0); |
| EXPECT_EQ(ARRAY_SIZE(array), stack.size); |
| EXPECT_EQ(0, internal_memcmp(stack.trace, array, sizeof(array))); |
| } |
| |
| TEST(SanitizerCommon, StackDepotAbsent) { |
| StackTrace stack = StackDepotGet((1 << 30) - 1); |
| EXPECT_EQ((uptr*)0, stack.trace); |
| } |
| |
| TEST(SanitizerCommon, StackDepotEmptyStack) { |
| u32 i1 = StackDepotPut(StackTrace()); |
| StackTrace stack = StackDepotGet(i1); |
| EXPECT_EQ((uptr*)0, stack.trace); |
| } |
| |
| TEST(SanitizerCommon, StackDepotZeroId) { |
| StackTrace stack = StackDepotGet(0); |
| EXPECT_EQ((uptr*)0, stack.trace); |
| } |
| |
| TEST(SanitizerCommon, StackDepotSame) { |
| uptr array[] = {1, 2, 3, 4, 6}; |
| StackTrace s1(array, ARRAY_SIZE(array)); |
| u32 i1 = StackDepotPut(s1); |
| u32 i2 = StackDepotPut(s1); |
| EXPECT_EQ(i1, i2); |
| StackTrace stack = StackDepotGet(i1); |
| EXPECT_NE(stack.trace, (uptr*)0); |
| EXPECT_EQ(ARRAY_SIZE(array), stack.size); |
| EXPECT_EQ(0, internal_memcmp(stack.trace, array, sizeof(array))); |
| } |
| |
| TEST(SanitizerCommon, StackDepotSeveral) { |
| uptr array1[] = {1, 2, 3, 4, 7}; |
| StackTrace s1(array1, ARRAY_SIZE(array1)); |
| u32 i1 = StackDepotPut(s1); |
| uptr array2[] = {1, 2, 3, 4, 8, 9}; |
| StackTrace s2(array2, ARRAY_SIZE(array2)); |
| u32 i2 = StackDepotPut(s2); |
| EXPECT_NE(i1, i2); |
| } |
| |
| TEST(SanitizerCommon, StackDepotReverseMap) { |
| uptr array1[] = {1, 2, 3, 4, 5}; |
| uptr array2[] = {7, 1, 3, 0}; |
| uptr array3[] = {10, 2, 5, 3}; |
| uptr array4[] = {1, 3, 2, 5}; |
| u32 ids[4] = {0}; |
| StackTrace s1(array1, ARRAY_SIZE(array1)); |
| StackTrace s2(array2, ARRAY_SIZE(array2)); |
| StackTrace s3(array3, ARRAY_SIZE(array3)); |
| StackTrace s4(array4, ARRAY_SIZE(array4)); |
| ids[0] = StackDepotPut(s1); |
| ids[1] = StackDepotPut(s2); |
| ids[2] = StackDepotPut(s3); |
| ids[3] = StackDepotPut(s4); |
| |
| StackDepotReverseMap map; |
| |
| for (uptr i = 0; i < 4; i++) { |
| StackTrace stack = StackDepotGet(ids[i]); |
| StackTrace from_map = map.Get(ids[i]); |
| EXPECT_EQ(stack.size, from_map.size); |
| EXPECT_EQ(stack.trace, from_map.trace); |
| } |
| } |
| |
| } // namespace __sanitizer |