diff --git a/debuggerd/libdebuggerd/test/mte_stack_record_test.cpp b/debuggerd/libdebuggerd/test/mte_stack_record_test.cpp index 4b788f3b7..bcda0ca5d 100644 --- a/debuggerd/libdebuggerd/test/mte_stack_record_test.cpp +++ b/debuggerd/libdebuggerd/test/mte_stack_record_test.cpp @@ -26,6 +26,8 @@ #include "unwindstack/Memory.h" #include +#include + #include "gtest/gtest.h" #include "libdebuggerd/tombstone.h" @@ -82,6 +84,33 @@ TEST(MteStackHistoryUnwindTest, TestOne) { EXPECT_EQ(e.tag(), 1ULL); } +static std::optional FindMapping(void* data) { + std::optional result; + android::procinfo::ReadMapFile( + "/proc/self/maps", [&result, data](const android::procinfo::MapInfo& info) { + auto data_int = reinterpret_cast(data) & ((1ULL << 56ULL) - 1ULL); + if (info.start <= data_int && data_int < info.end) { + result = info; + } + }); + return result; +} + +TEST_P(MteStackHistoryTest, TestFree) { + int size_cls = GetParam(); + size_t size = stack_mte_ringbuffer_size(size_cls); + void* data = stack_mte_ringbuffer_allocate(size_cls, nullptr); + EXPECT_EQ(stack_mte_ringbuffer_size_from_pointer(reinterpret_cast(data)), size); + auto before = FindMapping(data); + ASSERT_TRUE(before.has_value()); + EXPECT_EQ(before->end - before->start, size); + stack_mte_free_ringbuffer(reinterpret_cast(data)); + for (size_t i = 0; i < size; i += page_size()) { + auto after = FindMapping(static_cast(data) + i); + EXPECT_TRUE(!after.has_value() || after->name != before->name); + } +} + TEST_P(MteStackHistoryTest, TestEmpty) { int size_cls = GetParam(); size_t size = stack_mte_ringbuffer_size(size_cls);