aboutsummaryrefslogtreecommitdiff
path: root/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp
diff options
context:
space:
mode:
authornerix <nerixdev@outlook.de>2025-05-30 21:43:53 +0200
committerGitHub <noreply@github.com>2025-05-30 20:43:53 +0100
commit9e9626b3d5aa56828b71b03d99bf3167fdfeb08d (patch)
tree1086e1e6401aff9184443b39d27333a7a2acc87d /lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp
parentc5f3018668efea156831feb24843e34e4602a8e6 (diff)
downloadllvm-9e9626b3d5aa56828b71b03d99bf3167fdfeb08d.zip
llvm-9e9626b3d5aa56828b71b03d99bf3167fdfeb08d.tar.gz
llvm-9e9626b3d5aa56828b71b03d99bf3167fdfeb08d.tar.bz2
[LLDB] Avoid crashes when inspecting MSVC STL types (#140761)
When inspecting/printing types from MSVC's STL, LLDB would crash because it assumes these types were from libstdc++. Specifically, `std::shared_ptr` and `std::optional` would crash because of a null pointer dereference. I added a minimal test that tests the types with C++ helpers for libstdc++ (only tests for crashes). - Fixes #115216 - Fixes #120310 This still has one unresolved discussion: What about MS STL types? This is https://github.com/llvm/llvm-project/issues/24834, but there was a bit of discussion in #120310 as well. The main issue is that MSVC's STL uses the same type names as libstdc++ (i.e. neither uses an inline namespace like libc++ for some types).
Diffstat (limited to 'lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp')
-rw-r--r--lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp3
1 files changed, 3 insertions, 0 deletions
diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp
index 02113ba..08cfcd4 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp
+++ b/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp
@@ -379,6 +379,9 @@ LibStdcppSharedPtrSyntheticFrontEnd::CalculateNumChildren() {
lldb::ValueObjectSP
LibStdcppSharedPtrSyntheticFrontEnd::GetChildAtIndex(uint32_t idx) {
+ if (!m_ptr_obj)
+ return nullptr;
+
if (idx == 0)
return m_ptr_obj->GetSP();
if (idx == 1) {