From 6ae49839bfa5e32396f5fc7c6849273ed020a2a4 Mon Sep 17 00:00:00 2001 From: chenBright Date: Thu, 12 Nov 2026 23:02:47 +0800 Subject: [PATCH] Fix object pool size reporting under ASan --- src/butil/object_pool_inl.h | 2 +- test/object_pool_unittest.cpp | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/butil/object_pool_inl.h b/src/butil/object_pool_inl.h index c807b68167..1519321307 100644 --- a/src/butil/object_pool_inl.h +++ b/src/butil/object_pool_inl.h @@ -380,7 +380,7 @@ class BAIDU_CACHELINE_ALIGNMENT ObjectPool { } } } - info.total_size = info.block_num * info.block_item_num * sizeof(T); + info.total_size = info.block_num * info.block_item_num * sizeof(BlockItem); return info; } diff --git a/test/object_pool_unittest.cpp b/test/object_pool_unittest.cpp index 6282035519..b8cd8418f2 100644 --- a/test/object_pool_unittest.cpp +++ b/test/object_pool_unittest.cpp @@ -138,6 +138,7 @@ void check_block_capacity(size_t expected_capacity) { } clear_objects(); + EXPECT_EQ(0u, describe_objects().total_size); EXPECT_EQ(expected_capacity, describe_objects().block_item_num); std::vector objects; for (size_t i = 0; i < expected_capacity; ++i) { @@ -147,9 +148,11 @@ void check_block_capacity(size_t expected_capacity) { objects.push_back(obj); } EXPECT_EQ(1u, describe_objects().block_num); + EXPECT_EQ(sizeof(Block::items), describe_objects().total_size); T* next = get_object(); ASSERT_TRUE(next); EXPECT_EQ(2u, describe_objects().block_num); + EXPECT_EQ(2 * sizeof(Block::items), describe_objects().total_size); EXPECT_EQ(0, return_object(next)); EXPECT_EQ(next, get_object()); EXPECT_EQ(0, return_object(next)); @@ -157,7 +160,27 @@ void check_block_capacity(size_t expected_capacity) { EXPECT_EQ('x', obj->data[0]); EXPECT_EQ(0, return_object(obj)); } + EXPECT_EQ(2 * sizeof(Block::items), describe_objects().total_size); clear_objects(); + EXPECT_EQ(0u, describe_objects().total_size); +} + +TEST_F(ObjectPoolTest, total_size_counts_slot_storage) { + clear_objects(); + EXPECT_EQ(0u, describe_objects().total_size); + char* obj = get_object(); + ASSERT_TRUE(obj); + const ObjectPoolInfo info = describe_objects(); + EXPECT_EQ(1u, info.item_num); +#ifdef BUTIL_USE_ASAN + EXPECT_EQ(2048u, info.total_size); +#else + EXPECT_EQ(256u, info.total_size); +#endif + EXPECT_EQ(0, return_object(obj)); + EXPECT_EQ(info.total_size, describe_objects().total_size); + clear_objects(); + EXPECT_EQ(0u, describe_objects().total_size); } TEST_F(ObjectPoolTest, block_size_limit_includes_slot_padding) {