https://github.com/jeffreytan81 updated https://github.com/llvm/llvm-project/pull/69253
>From 4a668481a1a17512ee412c31b452c114626f8cde Mon Sep 17 00:00:00 2001 From: jeffreytan81 <jeffrey...@fb.com> Date: Mon, 16 Oct 2023 14:21:40 -0700 Subject: [PATCH 1/3] Guard against invalid variant index --- lldb/examples/synthetic/gnu_libstdcpp.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lldb/examples/synthetic/gnu_libstdcpp.py b/lldb/examples/synthetic/gnu_libstdcpp.py index 29c926167fb440c..f778065aaca3771 100644 --- a/lldb/examples/synthetic/gnu_libstdcpp.py +++ b/lldb/examples/synthetic/gnu_libstdcpp.py @@ -914,6 +914,11 @@ def get_variant_npos_value(index_byte_size): if index == npos_value: return " No Value" + # Invalid index can happen when the variant is not initialized yet. + template_arg_count = data_obj.GetType().GetNumberOfTemplateArguments() + if index >= template_arg_count: + return " <Invalid>" + active_type = data_obj.GetType().GetTemplateArgumentType(index) return f" Active Type = {active_type.GetDisplayTypeName()} " >From 43f808e39f727aca4199673cbbbddaa0b206dc4b Mon Sep 17 00:00:00 2001 From: jeffreytan81 <jeffrey...@fb.com> Date: Mon, 16 Oct 2023 14:21:40 -0700 Subject: [PATCH 2/3] Guard against invalid variant index --- lldb/examples/synthetic/gnu_libstdcpp.py | 5 ++++ .../TypeSystem/Clang/TypeSystemClang.cpp | 3 +++ .../TestDataFormatterLibStdcxxVariant.py | 26 +++++++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/lldb/examples/synthetic/gnu_libstdcpp.py b/lldb/examples/synthetic/gnu_libstdcpp.py index 29c926167fb440c..f778065aaca3771 100644 --- a/lldb/examples/synthetic/gnu_libstdcpp.py +++ b/lldb/examples/synthetic/gnu_libstdcpp.py @@ -914,6 +914,11 @@ def get_variant_npos_value(index_byte_size): if index == npos_value: return " No Value" + # Invalid index can happen when the variant is not initialized yet. + template_arg_count = data_obj.GetType().GetNumberOfTemplateArguments() + if index >= template_arg_count: + return " <Invalid>" + active_type = data_obj.GetType().GetTemplateArgumentType(index) return f" Active Type = {active_type.GetDisplayTypeName()} " diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp index f1353db2631ddc6..23aeb8f53ad06dc 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp @@ -7173,6 +7173,9 @@ GetNthTemplateArgument(const clang::ClassTemplateSpecializationDecl *decl, if (idx < last_idx) return &args[idx]; + if (idx >= args.size()) + return nullptr; + // We're asked for the last template argument but we don't want/need to // expand it. if (!expand_pack || args[last_idx].getKind() != clang::TemplateArgument::Pack) diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/variant/TestDataFormatterLibStdcxxVariant.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/variant/TestDataFormatterLibStdcxxVariant.py index 96a9c8d30c45b00..1aa7d463eb359a4 100644 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/variant/TestDataFormatterLibStdcxxVariant.py +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/variant/TestDataFormatterLibStdcxxVariant.py @@ -71,3 +71,29 @@ def test_with_run_command(self): substrs=["v_many_types_no_value = No Value"], ) """ + + @add_test_categories(["libstdcxx"]) + def test_invalid_variant_index(self): + """Test LibStdC++ data formatter for std::variant with invalid index.""" + self.build() + + (self.target, self.process, thread, bkpt) = lldbutil.run_to_source_breakpoint( + self, "// break here", lldb.SBFileSpec("main.cpp", False) + ) + + lldbutil.continue_to_breakpoint(self.process, bkpt) + + self.expect( + "frame variable v1", + substrs=["v1 = Active Type = int {", "Value = 12", "}"], + ) + + var_v1 = thread.frames[0].FindVariable("v1") + var_v1_raw_obj = var_v1.GetNonSyntheticValue() + index_obj = var_v1_raw_obj.GetChildMemberWithName("_M_index") + self.assertTrue(index_obj and index_obj.IsValid()) + + INVALID_INDEX = 100 + index_obj.SetValueFromCString(INVALID_INDEX) + + self.expect("frame variable v1", substrs=["v1 = <Invalid>"]) >From a042a092f3939fa9bb2c77e086e664ed044976bf Mon Sep 17 00:00:00 2001 From: jeffreytan81 <jeffrey...@fb.com> Date: Tue, 17 Oct 2023 11:28:25 -0700 Subject: [PATCH 3/3] Fix crash in GetNthTemplateArgument --- lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp | 6 +++--- .../libstdcpp/variant/TestDataFormatterLibStdcxxVariant.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp index 23aeb8f53ad06dc..0b8edbb75eb9aee 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp @@ -7173,9 +7173,6 @@ GetNthTemplateArgument(const clang::ClassTemplateSpecializationDecl *decl, if (idx < last_idx) return &args[idx]; - if (idx >= args.size()) - return nullptr; - // We're asked for the last template argument but we don't want/need to // expand it. if (!expand_pack || args[last_idx].getKind() != clang::TemplateArgument::Pack) @@ -7185,6 +7182,9 @@ GetNthTemplateArgument(const clang::ClassTemplateSpecializationDecl *decl, // Note that 'idx' counts from the beginning of all template arguments // (including the ones preceding the parameter pack). const auto &pack = args[last_idx]; + if (idx >= pack.pack_size()) + return nullptr; + const size_t pack_idx = idx - last_idx; assert(pack_idx < pack.pack_size() && "parameter pack index out-of-bounds"); return &pack.pack_elements()[pack_idx]; diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/variant/TestDataFormatterLibStdcxxVariant.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/variant/TestDataFormatterLibStdcxxVariant.py index 1aa7d463eb359a4..ba1641888b6f30f 100644 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/variant/TestDataFormatterLibStdcxxVariant.py +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/variant/TestDataFormatterLibStdcxxVariant.py @@ -93,7 +93,7 @@ def test_invalid_variant_index(self): index_obj = var_v1_raw_obj.GetChildMemberWithName("_M_index") self.assertTrue(index_obj and index_obj.IsValid()) - INVALID_INDEX = 100 + INVALID_INDEX = "100" index_obj.SetValueFromCString(INVALID_INDEX) self.expect("frame variable v1", substrs=["v1 = <Invalid>"]) _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits