[Lldb-commits] [lldb] 7177e63 - [lldb/Core] Fix crash in ValueObject::CreateChildAtIndex

Med Ismail Bennani via lldb-commits lldb-commits at lists.llvm.org
Tue Jul 7 11:38:14 PDT 2020


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.bennani at 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"
-
- at i = global i32 42, align 4
- at 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; }


        


More information about the lldb-commits mailing list