https://github.com/da-viper created 
https://github.com/llvm/llvm-project/pull/218906

Crashed because std::string is constructed with a nullptr. Wrap with 
`llvm::StringRef`.

Add a unittest

>From 3d6dcad3b34df2b0869329f0ac1f25f3e3e593c8 Mon Sep 17 00:00:00 2001
From: Ebuka Ezike <[email protected]>
Date: Wed, 26 Aug 2026 12:47:01 +0100
Subject: [PATCH] [lldb][API] Fix SBEnvironment crash when Set is called with a
 nullptr.

Crashed because std::string is constructed with a nullptr.
wrap with llvm::StringRef.

Add a unittest
---
 lldb/source/API/SBEnvironment.cpp        |  8 +++++---
 lldb/unittests/API/CMakeLists.txt        |  1 +
 lldb/unittests/API/SBEnvironmentTest.cpp | 25 ++++++++++++++++++++++++
 3 files changed, 31 insertions(+), 3 deletions(-)
 create mode 100644 lldb/unittests/API/SBEnvironmentTest.cpp

diff --git a/lldb/source/API/SBEnvironment.cpp 
b/lldb/source/API/SBEnvironment.cpp
index 5fafabe02e014..e9678292589ab 100644
--- a/lldb/source/API/SBEnvironment.cpp
+++ b/lldb/source/API/SBEnvironment.cpp
@@ -75,17 +75,19 @@ const char *SBEnvironment::GetValueAtIndex(size_t index) {
 bool SBEnvironment::Set(const char *name, const char *value, bool overwrite) {
   LLDB_INSTRUMENT_VA(this, name, value, overwrite);
 
+  llvm::StringRef name_ref{name};
+  llvm::StringRef value_ref{value};
   if (overwrite) {
-    m_opaque_up->insert_or_assign(name, std::string(value));
+    m_opaque_up->insert_or_assign(name_ref, value_ref.str());
     return true;
   }
-  return m_opaque_up->try_emplace(name, std::string(value)).second;
+  return m_opaque_up->try_emplace(name_ref, value_ref.str()).second;
 }
 
 bool SBEnvironment::Unset(const char *name) {
   LLDB_INSTRUMENT_VA(this, name);
 
-  return m_opaque_up->erase(name);
+  return m_opaque_up->erase(llvm::StringRef(name));
 }
 
 SBStringList SBEnvironment::GetEntries() {
diff --git a/lldb/unittests/API/CMakeLists.txt 
b/lldb/unittests/API/CMakeLists.txt
index a7db51aea4994..be0f32b22ba5a 100644
--- a/lldb/unittests/API/CMakeLists.txt
+++ b/lldb/unittests/API/CMakeLists.txt
@@ -1,5 +1,6 @@
 add_lldb_unittest(APITests
   SBCommandInterpreterTest.cpp
+  SBEnvironmentTest.cpp
   SBLineEntryTest.cpp
   SBMutexTest.cpp
   SBBreakpointClearConditionTest.cpp
diff --git a/lldb/unittests/API/SBEnvironmentTest.cpp 
b/lldb/unittests/API/SBEnvironmentTest.cpp
new file mode 100644
index 0000000000000..2e4d7b09a21a7
--- /dev/null
+++ b/lldb/unittests/API/SBEnvironmentTest.cpp
@@ -0,0 +1,25 @@
+//===-- SBEnvironment.cpp -------------------------------------===//
+//
+// 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 "lldb/API/SBEnvironment.h"
+#include "gtest/gtest.h"
+
+TEST(SBEnvironmentTest, SetAndGetEnv) {
+
+  lldb::SBEnvironment env{};
+
+  // Setting an env var without a value does not crash.
+  env.Set("FOO", nullptr, false);
+  const char *foo_val = env.Get("FOO");
+  EXPECT_STREQ(foo_val, "");
+
+  env.Set("BAR", "BAR_VALUE", true);
+  env.Set("BAR", nullptr, true);
+  const char *bar_val = env.Get("BAR");
+  EXPECT_STREQ(bar_val, "") << "'BAR' should return the most recent value";
+}

_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to