From 025ed8aacdeb39e3537a71f5bcd2fa02abfd1b1c Mon Sep 17 00:00:00 2001 From: Colin Cross Date: Mon, 20 May 2019 12:55:33 -0700 Subject: [PATCH] Improve memunreachable ABI before making it vendor_available vendor_available: true means that some prebuilts will end up with references to classes defined in memunreachable.h. Add version numbers and reserved fields to the classes and default initialize everything to zero. Bug: 132302484 Test: memunreachable_unit_test Change-Id: Ic183fcc766acd2c4c7dc62efafcc2c75a636e407 --- libmemunreachable/MemUnreachable.cpp | 6 +++ .../include/memunreachable/memunreachable.h | 39 +++++++++++-------- .../tests/MemUnreachable_test.cpp | 8 ++++ 3 files changed, 37 insertions(+), 16 deletions(-) diff --git a/libmemunreachable/MemUnreachable.cpp b/libmemunreachable/MemUnreachable.cpp index 299c320ac..ce937fd81 100644 --- a/libmemunreachable/MemUnreachable.cpp +++ b/libmemunreachable/MemUnreachable.cpp @@ -280,6 +280,12 @@ static inline const char* plural(T val) { } bool GetUnreachableMemory(UnreachableMemoryInfo& info, size_t limit) { + if (info.version > 0) { + MEM_ALOGE("unsupported UnreachableMemoryInfo.version %zu in GetUnreachableMemory", + info.version); + return false; + } + int parent_pid = getpid(); int parent_tid = gettid(); diff --git a/libmemunreachable/include/memunreachable/memunreachable.h b/libmemunreachable/include/memunreachable/memunreachable.h index c028eabf2..011443fe3 100644 --- a/libmemunreachable/include/memunreachable/memunreachable.h +++ b/libmemunreachable/include/memunreachable/memunreachable.h @@ -28,38 +28,45 @@ namespace android { struct Leak { - uintptr_t begin; - size_t size; + uintptr_t begin = 0; + size_t size = 0; - size_t referenced_count; - size_t referenced_size; + size_t referenced_count = 0; + size_t referenced_size = 0; - size_t similar_count; - size_t similar_size; - size_t similar_referenced_count; - size_t similar_referenced_size; + size_t similar_count = 0; + size_t similar_size = 0; + size_t similar_referenced_count = 0; + size_t similar_referenced_size = 0; - size_t total_size; + size_t total_size = 0; static const size_t contents_length = 32; - char contents[contents_length]; + char contents[contents_length] = {}; struct Backtrace { - size_t num_frames; + size_t num_frames = 0; static const size_t max_frames = 16; - uintptr_t frames[max_frames]; + uintptr_t frames[max_frames] = {}; + + size_t reserved[8] = {}; } backtrace; + size_t reserved[8] = {}; + std::string ToString(bool log_contents) const; }; struct UnreachableMemoryInfo { std::vector leaks; - size_t num_leaks; - size_t leak_bytes; - size_t num_allocations; - size_t allocation_bytes; + size_t num_leaks = 0; + size_t leak_bytes = 0; + size_t num_allocations = 0; + size_t allocation_bytes = 0; + + size_t version = 0; // Must be 0 + size_t reserved[8] = {}; UnreachableMemoryInfo() {} ~UnreachableMemoryInfo(); diff --git a/libmemunreachable/tests/MemUnreachable_test.cpp b/libmemunreachable/tests/MemUnreachable_test.cpp index bba0c6d11..e464872e2 100644 --- a/libmemunreachable/tests/MemUnreachable_test.cpp +++ b/libmemunreachable/tests/MemUnreachable_test.cpp @@ -264,4 +264,12 @@ TEST_F(MemunreachableTest, leak_lots) { ASSERT_TRUE(LogUnreachableMemory(true, 100)); } +TEST_F(MemunreachableTest, version) { + UnreachableMemoryInfo info; + info.version = 1; + + ASSERT_FALSE(GetUnreachableMemory(info)); + ASSERT_EQ(0U, info.leaks.size()); +} + } // namespace android