From a98d8e6b36cd015272eb973faf4109a1f46d5eb0 Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Thu, 29 May 2025 20:39:54 +0800 Subject: [PATCH] test/common: fix memory leak in librados completion tests Replace raw pointers with unique_ptr for AioCompletion instances in test_librados_completion to prevent memory leaks. Previously, each test case allocated AioCompletion objects but never freed them, causing AddressSanitizer to report leaks. The unique_ptr automatically manages the object lifecycle, ensuring cleanup when the pointer goes out of scope. Fixes ASan error: ``` `==1199357==ERROR: LeakSanitizer: detected memory leaks Direct leak of 8 byte(s) in 1 object(s) allocated from: #0 0x5602d9f0eaad in operator new(unsigned long) (/home/jenkins-build/build/workspace/ceph-pull-requests/build/bin/unittest_librados_completion+0x1f2aad) (BuildId: ef5b4b8f0a479e21b6a2686519ff4c3ef71b9f94) #1 0x7f3ac9b776f4 in librados::v14_2_0::Rados::aio_create_completion() /home/jenkins-build/build/workspace/ceph-pull-requests/src/librados/librados_cxx.cc:2892:10 #2 0x5602d9f11a0a in CoroExcept_AioComplete_Test::TestBody() /home/jenkins-build/build/workspace/ceph-pull-requests/src/test/common/test_librados_completion.cc:54:14 #3 0x5602da01d69d in void testing::internal::HandleSehExceptionsInMethodIfSupported(testing::Test*, void (testing::Test::*)(), char const*) /home/jenkins-build/build/workspace/ceph-pull-requests/src/googletest/googletest/src/gtest.cc:2653:10 ``` Signed-off-by: Kefu Chai --- src/test/common/test_librados_completion.cc | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/test/common/test_librados_completion.cc b/src/test/common/test_librados_completion.cc index d87f7ea7091..8c68dc7ed0c 100644 --- a/src/test/common/test_librados_completion.cc +++ b/src/test/common/test_librados_completion.cc @@ -37,12 +37,12 @@ namespace async = ceph::async; TEST(CoroSucc, AioComplete) { - auto lrc = librados::Rados::aio_create_completion(); + std::unique_ptr lrc{librados::Rados::aio_create_completion()}; asio::io_context c; asio::co_spawn(c.get_executor(), []() -> asio::awaitable { co_return; - }(), lrc); + }(), lrc.get()); c.run(); lrc->wait_for_complete(); auto r = lrc->get_return_value(); @@ -51,13 +51,13 @@ TEST(CoroSucc, AioComplete) TEST(CoroExcept, AioComplete) { - auto lrc = librados::Rados::aio_create_completion(); + std::unique_ptr lrc{librados::Rados::aio_create_completion()}; asio::io_context c; asio::co_spawn(c.get_executor(), []() -> asio::awaitable { throw sys::system_error{ENOENT, sys::generic_category()}; co_return; - }(), lrc); + }(), lrc.get()); c.run(); lrc->wait_for_complete(); auto r = lrc->get_return_value(); @@ -66,13 +66,13 @@ TEST(CoroExcept, AioComplete) TEST(CoroUnknownExcept, AioComplete) { - auto lrc = librados::Rados::aio_create_completion(); + std::unique_ptr lrc{librados::Rados::aio_create_completion()}; asio::io_context c; asio::co_spawn(c.get_executor(), []() -> asio::awaitable { throw std::exception{}; co_return; - }(), lrc); + }(), lrc.get()); c.run(); lrc->wait_for_complete(); auto r = lrc->get_return_value(); @@ -81,12 +81,12 @@ TEST(CoroUnknownExcept, AioComplete) TEST(Int, AioComplete) { - auto lrc = librados::Rados::aio_create_completion(); + std::unique_ptr lrc{librados::Rados::aio_create_completion()}; asio::io_context c; async::async_dispatch(c.get_executor(), []() { return -42; - }, lrc); + }, lrc.get()); c.run(); lrc->wait_for_complete(); auto r = lrc->get_return_value(); @@ -95,13 +95,13 @@ TEST(Int, AioComplete) TEST(EC, AioComplete) { - auto lrc = librados::Rados::aio_create_completion(); + std::unique_ptr lrc{librados::Rados::aio_create_completion()}; asio::io_context c; async::async_dispatch(c.get_executor(), []() { return sys::error_code(ENOENT, sys::generic_category()); - }, lrc); + }, lrc.get()); c.run(); lrc->wait_for_complete(); auto r = lrc->get_return_value(); -- 2.39.5