diff --git a/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp b/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp --- a/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp @@ -530,7 +530,13 @@ DataExtractor StrData(Section, isLittleEndian(), 0); uint64_t Offset = 0; uint64_t StrOffset = 0; - while (const char *CStr = StrData.getCStr(&Offset)) { + while (StrData.isValidOffset(Offset)) { + Error Err = Error::success(); + const char *CStr = StrData.getCStr(&Offset, &Err); + if (Err) { + DumpOpts.WarningHandler(std::move(Err)); + return; + } OS << format("0x%8.8" PRIx64 ": \"", StrOffset); OS.write_escaped(CStr); OS << "\"\n"; diff --git a/llvm/test/tools/llvm-dwarfdump/debug-str.yaml b/llvm/test/tools/llvm-dwarfdump/debug-str.yaml --- a/llvm/test/tools/llvm-dwarfdump/debug-str.yaml +++ b/llvm/test/tools/llvm-dwarfdump/debug-str.yaml @@ -44,3 +44,16 @@ # ESCAPED-NEXT: 0x00000002: "\001" # ESCAPED-NEXT: 0x00000004: "\\001" # ESCAPED-EMPTY: + +## c) Test that llvm-dwarfdump emits a warning when it encounters a string without a null terminator. + +## "abc\0" "abc" +# RUN: yaml2obj -DCONTENT="61626300616263" %s -o %t3.o +# RUN: llvm-dwarfdump --debug-str %t3.o 2>&1 | FileCheck %s --check-prefix=WARN + +# WARN: .debug_str contents: +# WARN-NEXT: 0x00000000: "abc" +# WARN-NEXT: warning: no null terminated string at offset 0x4 +# WARN: .debug_str.dwo contents: +# WARN-NEXT: 0x00000000: "abc" +# WARN-NEXT: warning: no null terminated string at offset 0x4