[Lldb-commits] [lldb] 4ffcaf6 - [lldb][SBAPI] Fix crash when calling SBProgress constructor. (#224176)

via lldb-commits lldb-commits at lists.llvm.org
Sun Sep 20 12:40:47 PDT 2026


Author: Ebuka Ezike
Date: 2026-09-20T20:40:40+01:00
New Revision: 4ffcaf61b123ba27c71daf8da7f8eb03ffdd748b

URL: https://github.com/llvm/llvm-project/commit/4ffcaf61b123ba27c71daf8da7f8eb03ffdd748b
DIFF: https://github.com/llvm/llvm-project/commit/4ffcaf61b123ba27c71daf8da7f8eb03ffdd748b.diff

LOG: [lldb][SBAPI] Fix crash when calling SBProgress constructor. (#224176)

Fix crash when calling SBProgress constructor with nullptr.

Added: 
    lldb/unittests/API/SBProgressTest.cpp

Modified: 
    lldb/source/API/SBProgress.cpp
    lldb/source/Core/Progress.cpp
    lldb/unittests/API/CMakeLists.txt

Removed: 
    


################################################################################
diff  --git a/lldb/source/API/SBProgress.cpp b/lldb/source/API/SBProgress.cpp
index e3318624c5fd1..dd9982f036704 100644
--- a/lldb/source/API/SBProgress.cpp
+++ b/lldb/source/API/SBProgress.cpp
@@ -17,7 +17,8 @@ SBProgress::SBProgress(const char *title, const char *details,
   LLDB_INSTRUMENT_VA(this, title, details, debugger);
 
   m_opaque_up = std::make_unique<lldb_private::Progress>(
-      title, details, /*total=*/std::nullopt, debugger.get(),
+      llvm::StringRef(title).str(), llvm::StringRef(details).str(),
+      /*total=*/std::nullopt, debugger.get(),
       /*minimum_report_time=*/std::nullopt,
       lldb_private::Progress::Origin::eExternal);
 }
@@ -27,7 +28,8 @@ SBProgress::SBProgress(const char *title, const char *details,
   LLDB_INSTRUMENT_VA(this, title, details, total_units, debugger);
 
   m_opaque_up = std::make_unique<lldb_private::Progress>(
-      title, details, total_units, debugger.get(),
+      llvm::StringRef(title).str(), llvm::StringRef(details).str(), total_units,
+      debugger.get(),
       /*minimum_report_time=*/std::nullopt,
       lldb_private::Progress::Origin::eExternal);
 }

diff  --git a/lldb/source/Core/Progress.cpp b/lldb/source/Core/Progress.cpp
index d29dce0a688c0..ff55feda5ac23 100644
--- a/lldb/source/Core/Progress.cpp
+++ b/lldb/source/Core/Progress.cpp
@@ -16,6 +16,7 @@
 #include <cstdint>
 #include <mutex>
 #include <optional>
+#include <utility>
 
 using namespace lldb;
 using namespace lldb_private;
@@ -31,7 +32,7 @@ Progress::Progress(std::string title, std::string details,
                    Timeout<std::nano> minimum_report_time,
                    Progress::Origin origin)
     : m_total(total.value_or(Progress::kNonDeterministicTotal)),
-      m_minimum_report_time(minimum_report_time), m_title(title),
+      m_minimum_report_time(minimum_report_time), m_title(std::move(title)),
       m_progress_id(++g_id),
       m_debugger_id(debugger ? std::optional<user_id_t>(debugger->GetID())
                              : std::nullopt),

diff  --git a/lldb/unittests/API/CMakeLists.txt b/lldb/unittests/API/CMakeLists.txt
index 3ea6fe872b39d..ac7061c96bfd3 100644
--- a/lldb/unittests/API/CMakeLists.txt
+++ b/lldb/unittests/API/CMakeLists.txt
@@ -5,6 +5,7 @@ add_lldb_unittest(APITests
   SBMutexTest.cpp
   SBBreakpointClearConditionTest.cpp
   SBProtocolServerTest.cpp
+  SBProgressTest.cpp
 
   SBAPITEST
 

diff  --git a/lldb/unittests/API/SBProgressTest.cpp b/lldb/unittests/API/SBProgressTest.cpp
new file mode 100644
index 0000000000000..250331fc79241
--- /dev/null
+++ b/lldb/unittests/API/SBProgressTest.cpp
@@ -0,0 +1,66 @@
+//===---------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===/
+
+#include "gtest/gtest.h"
+
+#include "TestingSupport/SubsystemRAII.h"
+
+#include "lldb/API/LLDB.h"
+#include "lldb/lldb-enumerations.h"
+#include "llvm/Support/JSON.h"
+#include "llvm/Testing/Support/Error.h"
+
+using namespace lldb_private;
+using namespace lldb;
+
+class SBProgressTest : public testing::Test {
+protected:
+  void SetUp() override {
+    debugger = SBDebugger::Create(/*source_init_files=*/false);
+    debugger.SetAsync(false);
+  }
+
+  void TearDown() override { SBDebugger::Destroy(debugger); }
+
+  SubsystemRAII<SBDebugger> subsystems;
+  SBDebugger debugger;
+};
+
+TEST_F(SBProgressTest, Constructor) {
+  // Calling the constructor with null values does not crash.
+  SBProgress progress(nullptr, nullptr, debugger);
+  SBProgress progress2(nullptr, nullptr, /*total_units=*/10, debugger);
+
+  SBListener listener("Test Listener");
+  SBBroadcaster broadcaster = debugger.GetBroadcaster();
+  broadcaster.AddListener(listener, lldb::eBroadcastBitExternalProgress);
+
+  progress.Increment(2, nullptr);
+  progress.Increment(2, "Other");
+  progress.Finalize();
+
+  SBEvent event;
+  EXPECT_TRUE(listener.GetNextEvent(event));
+
+  const SBStructuredData sdata = SBDebugger::GetProgressDataFromEvent(event);
+  SBStream stream;
+  sdata.GetAsJSON(stream);
+  llvm::StringRef data(stream.GetData(), stream.GetSize());
+  llvm::Expected<llvm::json::Value> progress_data = llvm::json::parse(data);
+
+  ASSERT_THAT_EXPECTED(progress_data, llvm::Succeeded());
+  auto *proj_json = progress_data->getAsObject();
+  ASSERT_NE(proj_json, nullptr);
+  for (llvm::StringRef field : {"message", "title", "details"}) {
+    auto field_val = proj_json->getString(field);
+    ASSERT_TRUE(field_val.has_value());
+    EXPECT_EQ(field_val.value(), llvm::StringRef(""));
+  }
+
+  EXPECT_TRUE(event.GetDescription(stream));
+}


        


More information about the lldb-commits mailing list