From 588dbbd6ee50cf803153eca1242ed9f08b9c0b05 Mon Sep 17 00:00:00 2001 From: Rene Greiner Date: Tue, 25 Nov 2025 22:24:41 +0100 Subject: [PATCH] fix shared_ptr self assignments see https://github.com/open-telemetry/opentelemetry-cpp/pull/3713#discussion_r2548948678 --- api/include/opentelemetry/nostd/shared_ptr.h | 8 ++++++++ api/test/nostd/shared_ptr_test.cc | 10 ++++++++++ 2 files changed, 18 insertions(+) diff --git a/api/include/opentelemetry/nostd/shared_ptr.h b/api/include/opentelemetry/nostd/shared_ptr.h index 681c4eb377..88fb07ad3f 100644 --- a/api/include/opentelemetry/nostd/shared_ptr.h +++ b/api/include/opentelemetry/nostd/shared_ptr.h @@ -119,6 +119,10 @@ class shared_ptr shared_ptr &operator=(shared_ptr &&other) noexcept { + if (this == &other) + { + return *this; + } wrapper().~shared_ptr_wrapper(); other.wrapper().MoveTo(buffer_); return *this; @@ -132,6 +136,10 @@ class shared_ptr shared_ptr &operator=(const shared_ptr &other) noexcept { + if (this == &other) + { + return *this; + } wrapper().~shared_ptr_wrapper(); other.wrapper().CopyTo(buffer_); return *this; diff --git a/api/test/nostd/shared_ptr_test.cc b/api/test/nostd/shared_ptr_test.cc index be5f6ddd5e..938ff1c9b1 100644 --- a/api/test/nostd/shared_ptr_test.cc +++ b/api/test/nostd/shared_ptr_test.cc @@ -9,6 +9,7 @@ #include #include "opentelemetry/nostd/shared_ptr.h" +#include "opentelemetry/nostd/unique_ptr.h" using opentelemetry::nostd::shared_ptr; @@ -96,6 +97,15 @@ TEST(SharedPtrTest, MoveConstructionFromStdSharedPtr) EXPECT_EQ(ptr2.get(), value); } +TEST(SharedPtrTest, MoveConstructionFromNoStdUniquePtr) +{ + opentelemetry::nostd::unique_ptr value(new int{123}); + auto p = value.get(); + shared_ptr ptr{std::move(value)}; + EXPECT_EQ(value.get(), nullptr); // NOLINT + EXPECT_EQ(ptr.get(), p); +} + TEST(SharedPtrTest, Destruction) { bool was_destructed{};