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