Author: Med Ismail Bennani Date: 2020-07-07T20:37:13+02:00 New Revision: 7177e63fb554cfac3c252327e344fb5a17d6bd65
URL: https://github.com/llvm/llvm-project/commit/7177e63fb554cfac3c252327e344fb5a17d6bd65 DIFF: https://github.com/llvm/llvm-project/commit/7177e63fb554cfac3c252327e344fb5a17d6bd65.diff LOG: [lldb/Core] Fix crash in ValueObject::CreateChildAtIndex The patch fixes a crash in ValueObject::CreateChildAtIndex caused by a null pointer dereferencing. This is a corner case that is happening when trying to dereference a variable with an incomplete type, and this same variable doesn't have a synthetic value to get the child ValueObject. If this happens, lldb will now return a null pointer that will results in an error message. rdar://65181171 Signed-off-by: Med Ismail Bennani <medismail.benn...@gmail.com> Added: lldb/test/API/functionalities/target_var/main.c Modified: lldb/source/Core/ValueObject.cpp lldb/test/API/functionalities/target_var/Makefile lldb/test/API/functionalities/target_var/TestTargetVar.py Removed: lldb/test/API/functionalities/target_var/globals.c lldb/test/API/functionalities/target_var/globals.ll ################################################################################ diff --git a/lldb/source/Core/ValueObject.cpp b/lldb/source/Core/ValueObject.cpp index dfadb3c5233f..8600469580e8 100644 --- a/lldb/source/Core/ValueObject.cpp +++ b/lldb/source/Core/ValueObject.cpp @@ -687,10 +687,15 @@ ValueObject *ValueObject::CreateChildAtIndex(size_t idx, language_flags); } - if (!valobj && synthetic_array_member) - valobj = GetSyntheticValue() - ->GetChildAtIndex(synthetic_index, synthetic_array_member) - .get(); + // In case of an incomplete type, LLDB will try to use the ValueObject's + // synthetic value to create the child ValueObject. + if (!valobj && synthetic_array_member) { + if (ValueObjectSP synth_valobj_sp = GetSyntheticValue()) { + valobj = synth_valobj_sp + ->GetChildAtIndex(synthetic_index, synthetic_array_member) + .get(); + } + } return valobj; } diff --git a/lldb/test/API/functionalities/target_var/Makefile b/lldb/test/API/functionalities/target_var/Makefile index e51de3a02a46..10495940055b 100644 --- a/lldb/test/API/functionalities/target_var/Makefile +++ b/lldb/test/API/functionalities/target_var/Makefile @@ -1,5 +1,3 @@ -include Makefile.rules +C_SOURCES := main.c -a.out: globals.ll - $(CC) $(CFLAGS) -g -c $^ -o globals.o - $(LD) $(LDFLAGS) -g globals.o -o $@ +include Makefile.rules diff --git a/lldb/test/API/functionalities/target_var/TestTargetVar.py b/lldb/test/API/functionalities/target_var/TestTargetVar.py index f8c2a6901472..4eee0e61816e 100644 --- a/lldb/test/API/functionalities/target_var/TestTargetVar.py +++ b/lldb/test/API/functionalities/target_var/TestTargetVar.py @@ -20,3 +20,5 @@ def testTargetVarExpr(self): self.build() lldbutil.run_to_name_breakpoint(self, 'main') self.expect("target variable i", substrs=['i', '42']) + self.expect("target variable var", patterns=['\(incomplete \*\) var = 0[xX](0)*dead']) + self.expect("target variable var[0]", error=True, substrs=["can't find global variable 'var[0]'"]) diff --git a/lldb/test/API/functionalities/target_var/globals.c b/lldb/test/API/functionalities/target_var/globals.c deleted file mode 100644 index 266192849641..000000000000 --- a/lldb/test/API/functionalities/target_var/globals.c +++ /dev/null @@ -1,6 +0,0 @@ -int i = 42; -int *p = &i; - -int main() { - return *p; -} diff --git a/lldb/test/API/functionalities/target_var/globals.ll b/lldb/test/API/functionalities/target_var/globals.ll deleted file mode 100644 index 192d4e126981..000000000000 --- a/lldb/test/API/functionalities/target_var/globals.ll +++ /dev/null @@ -1,42 +0,0 @@ -source_filename = "globals.c" -target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" -target triple = "x86_64-apple-macosx10.14.0" - -@i = global i32 42, align 4 -@p = global i32* @i, align 8, !dbg !0, !dbg !6 - -; Function Attrs: noinline nounwind optnone ssp uwtable -define i32 @main() #0 !dbg !15 { -entry: - %retval = alloca i32, align 4 - store i32 0, i32* %retval, align 4 - %0 = load i32*, i32** @p, align 8, !dbg !18 - %1 = load i32, i32* %0, align 4, !dbg !18 - ret i32 %1, !dbg !18 -} - -attributes #0 = { noinline nounwind optnone ssp uwtable } - -!llvm.dbg.cu = !{!2} -!llvm.module.flags = !{!10, !11, !12, !13} -!llvm.ident = !{!14} - -!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression(DW_OP_deref)) -!1 = distinct !DIGlobalVariable(name: "i", scope: !2, file: !3, line: 1, type: !9, isLocal: false, isDefinition: true) -!2 = distinct !DICompileUnit(language: DW_LANG_C99, file: !3, emissionKind: FullDebug, globals: !5) -!3 = !DIFile(filename: "globals.c", directory: "/") -!4 = !{} -!5 = !{!0, !6} -!6 = !DIGlobalVariableExpression(var: !7, expr: !DIExpression()) -!7 = distinct !DIGlobalVariable(name: "p", scope: !2, file: !3, line: 2, type: !8, isLocal: false, isDefinition: true) -!8 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !9, size: 64) -!9 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) -!10 = !{i32 2, !"Dwarf Version", i32 4} -!11 = !{i32 2, !"Debug Info Version", i32 3} -!12 = !{i32 1, !"wchar_size", i32 4} -!13 = !{i32 7, !"PIC Level", i32 2} -!14 = !{!"clang version 8.0.0 (trunk 340838) (llvm/trunk 340843)"} -!15 = distinct !DISubprogram(name: "main", scope: !3, file: !3, line: 4, type: !16, isLocal: false, isDefinition: true, scopeLine: 4, isOptimized: false, unit: !2, retainedNodes: !4) -!16 = !DISubroutineType(types: !17) -!17 = !{!9} -!18 = !DILocation(line: 5, scope: !15) diff --git a/lldb/test/API/functionalities/target_var/main.c b/lldb/test/API/functionalities/target_var/main.c new file mode 100644 index 000000000000..cbc379d9f093 --- /dev/null +++ b/lldb/test/API/functionalities/target_var/main.c @@ -0,0 +1,7 @@ +int i = 42; +int *p = &i; + +struct incomplete; +struct incomplete *var = (struct incomplete *)0xdead; + +int main() { return *p; } _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits