[DataExtractor] Improve error message when we run off the end of the buffer
authorPavel Labath <pavel@labath.sk>
Thu, 27 Feb 2020 15:22:12 +0000 (16:22 +0100)
committerPavel Labath <pavel@labath.sk>
Fri, 28 Feb 2020 08:02:33 +0000 (09:02 +0100)
Summary: Include the offset at which this happened.

Reviewers: dblaikie, jhenderson

Subscribers: hiraditya, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D75265

llvm/lib/Support/DataExtractor.cpp
llvm/test/DebugInfo/X86/dwarfdump-debug-loc-error-cases2.s
llvm/test/DebugInfo/X86/dwarfdump-debug-loclists-error-cases2.s
llvm/unittests/DebugInfo/DWARF/DWARFDataExtractorTest.cpp
llvm/unittests/DebugInfo/DWARF/DWARFDieTest.cpp

index 3d19b4d..d6fd9a5 100644 (file)
 
 using namespace llvm;
 
-static void unexpectedEndReached(Error *E) {
+static void unexpectedEndReached(Error *E, uint64_t Offset) {
   if (E)
     *E = createStringError(errc::illegal_byte_sequence,
-                           "unexpected end of data");
+                           "unexpected end of data at offset 0x%" PRIx64,
+                           Offset);
 }
 
 static bool isError(Error *E) { return E && *E; }
@@ -33,7 +34,7 @@ static T getU(uint64_t *offset_ptr, const DataExtractor *de,
 
   uint64_t offset = *offset_ptr;
   if (!de->isValidOffsetForDataOfSize(offset, sizeof(T))) {
-    unexpectedEndReached(Err);
+    unexpectedEndReached(Err, offset);
     return val;
   }
   std::memcpy(&val, &Data[offset], sizeof(val));
@@ -56,7 +57,7 @@ static T *getUs(uint64_t *offset_ptr, T *dst, uint32_t count,
   uint64_t offset = *offset_ptr;
 
   if (!de->isValidOffsetForDataOfSize(offset, sizeof(*dst) * count)) {
-    unexpectedEndReached(Err);
+    unexpectedEndReached(Err, offset);
     return nullptr;
   }
   for (T *value_ptr = dst, *end = dst + count; value_ptr != end;
@@ -229,5 +230,5 @@ void DataExtractor::skip(Cursor &C, uint64_t Length) const {
   if (isValidOffsetForDataOfSize(C.Offset, Length))
     C.Offset += Length;
   else
-    unexpectedEndReached(&C.Err);
+    unexpectedEndReached(&C.Err, C.Offset);
 }
index f15deb5..7e951e5 100644 (file)
@@ -8,11 +8,11 @@
 
 # CHECK:      DW_AT_name        ("x1")
 # CHECK-NEXT: DW_AT_location    (0xdeadbeef
-# CHECK-NEXT:    error: unexpected end of data)
+# CHECK-NEXT:    error: unexpected end of data at offset 0xdeadbeef)
 
 # CHECK:      DW_AT_name        ("x2")
 # CHECK-NEXT: DW_AT_location    (0x00000036
-# CHECK-NEXT:    error: unexpected end of data)
+# CHECK-NEXT:    error: unexpected end of data at offset 0x48)
 
 
         .type   f,@function
index 48ae8d4..7a0c42c 100644 (file)
@@ -8,11 +8,11 @@
 
 # CHECK:      DW_AT_name        ("x1")
 # CHECK-NEXT: DW_AT_location    (0xdeadbeef
-# CHECK-NEXT:    error: unexpected end of data)
+# CHECK-NEXT:    error: unexpected end of data at offset 0xdeadbeef)
 
 # CHECK:      DW_AT_name        ("x2")
 # CHECK-NEXT: DW_AT_location    (0x00000025
-# CHECK-NEXT:    error: unexpected end of data)
+# CHECK-NEXT:    error: unexpected end of data at offset 0x34)
 
 
         .type   f,@function
index 589ae3f..6528cd0 100644 (file)
@@ -41,13 +41,15 @@ TEST(DWARFDataExtractorTest, getInitialLength) {
   auto ErrorResult = std::make_tuple(0, dwarf::DWARF32, 0);
 
   // Empty data.
-  EXPECT_THAT_EXPECTED(GetWithError({}),
-                       FailedWithMessage("unexpected end of data"));
+  EXPECT_THAT_EXPECTED(
+      GetWithError({}),
+      FailedWithMessage("unexpected end of data at offset 0x0"));
   EXPECT_EQ(GetWithoutError({}), ErrorResult);
 
   // Not long enough for the U32 field.
-  EXPECT_THAT_EXPECTED(GetWithError({0x00, 0x01, 0x02}),
-                       FailedWithMessage("unexpected end of data"));
+  EXPECT_THAT_EXPECTED(
+      GetWithError({0x00, 0x01, 0x02}),
+      FailedWithMessage("unexpected end of data at offset 0x0"));
   EXPECT_EQ(GetWithoutError({0x00, 0x01, 0x02}), ErrorResult);
 
   EXPECT_THAT_EXPECTED(
@@ -72,14 +74,15 @@ TEST(DWARFDataExtractorTest, getInitialLength) {
   EXPECT_EQ(GetWithoutError({0xff, 0xff, 0xff, 0xf0}), ErrorResult);
 
   // DWARF64 marker without the subsequent length field.
-  EXPECT_THAT_EXPECTED(GetWithError({0xff, 0xff, 0xff, 0xff}),
-                       FailedWithMessage("unexpected end of data"));
+  EXPECT_THAT_EXPECTED(
+      GetWithError({0xff, 0xff, 0xff, 0xff}),
+      FailedWithMessage("unexpected end of data at offset 0x4"));
   EXPECT_EQ(GetWithoutError({0xff, 0xff, 0xff, 0xff}), ErrorResult);
 
   // Not enough data for the U64 length.
   EXPECT_THAT_EXPECTED(
       GetWithError({0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0x02, 0x03}),
-      FailedWithMessage("unexpected end of data"));
+      FailedWithMessage("unexpected end of data at offset 0x4"));
   EXPECT_EQ(GetWithoutError({0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0x02, 0x03}),
             ErrorResult);
 
index 5312492..b662965 100644 (file)
@@ -105,9 +105,9 @@ TEST(DWARFDie, getLocations) {
           &ErrorInfoBase::message,
           "Unable to resolve indirect address 1 for: DW_LLE_startx_length")));
 
-  EXPECT_THAT_EXPECTED(Die.getLocations(DW_AT_call_data_location),
-                       Failed<ErrorInfoBase>(testing::Property(
-                           &ErrorInfoBase::message, "unexpected end of data")));
+  EXPECT_THAT_EXPECTED(
+      Die.getLocations(DW_AT_call_data_location),
+      FailedWithMessage("unexpected end of data at offset 0x20"));
 
   EXPECT_THAT_EXPECTED(
       Die.getLocations(DW_AT_call_data_value),