]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
test/common: fix memory leak in librados completion tests 63595/head
authorKefu Chai <tchaikov@gmail.com>
Thu, 29 May 2025 12:39:54 +0000 (20:39 +0800)
committerKefu Chai <tchaikov@gmail.com>
Thu, 29 May 2025 15:00:49 +0000 (23:00 +0800)
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*, 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 <tchaikov@gmail.com>
src/test/common/test_librados_completion.cc

index d87f7ea70911dd1c52e6c407a461d4f97b872f6c..8c68dc7ed0c401f173c6a7da0ec2e44b94f4fe91 100644 (file)
@@ -37,12 +37,12 @@ namespace async = ceph::async;
 
 TEST(CoroSucc, AioComplete)
 {
-  auto lrc = librados::Rados::aio_create_completion();
+  std::unique_ptr<librados::AioCompletion> lrc{librados::Rados::aio_create_completion()};
   asio::io_context c;
   asio::co_spawn(c.get_executor(),
                  []() -> asio::awaitable<void> {
                    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<librados::AioCompletion> lrc{librados::Rados::aio_create_completion()};
   asio::io_context c;
   asio::co_spawn(c.get_executor(),
                  []() -> asio::awaitable<void> {
                    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<librados::AioCompletion> lrc{librados::Rados::aio_create_completion()};
   asio::io_context c;
   asio::co_spawn(c.get_executor(),
                  []() -> asio::awaitable<void> {
                    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<librados::AioCompletion> 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<librados::AioCompletion> 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();