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 @@ -528,9 +528,18 @@ auto DumpStrSection = [&](StringRef Section) { DataExtractor StrData(Section, isLittleEndian(), 0); + + Error Err = Error::success(); + (void)!Err; + uint64_t Offset = 0; uint64_t StrOffset = 0; - while (const char *CStr = StrData.getCStr(&Offset)) { + while (StrData.isValidOffset(Offset)) { + 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 no null terminated string. + +## "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