diff options
| author | JF Bastien <jfbastien@apple.com> | 2019-06-26 19:50:12 +0000 |
|---|---|---|
| committer | JF Bastien <jfbastien@apple.com> | 2019-06-26 19:50:12 +0000 |
| commit | 0e828958264734e60115ba2482437008c822d7db (patch) | |
| tree | 3fc2aa5876f36d46ae328df9b7a5ee7dfa781894 /llvm/unittests/Bitcode/BitstreamReaderTest.cpp | |
| parent | afa58b6ba19a54e6fd41ab3994e114f0f6bcb239 (diff) | |
| download | bcm5719-llvm-0e828958264734e60115ba2482437008c822d7db.tar.gz bcm5719-llvm-0e828958264734e60115ba2482437008c822d7db.zip | |
BitStream reader: propagate errors
The bitstream reader handles errors poorly. This has two effects:
* Bugs in file handling (especially modules) manifest as an "unexpected end of
file" crash
* Users of clang as a library end up aborting because the code unconditionally
calls `report_fatal_error`
The bitstream reader should be more resilient and return Expected / Error as
soon as an error is encountered, not way late like it does now. This patch
starts doing so and adopting the error handling where I think it makes sense.
There's plenty more to do: this patch propagates errors to be minimally useful,
and follow-ups will propagate them further and improve diagnostics.
https://bugs.llvm.org/show_bug.cgi?id=42311
<rdar://problem/33159405>
Differential Revision: https://reviews.llvm.org/D63518
llvm-svn: 364464
Diffstat (limited to 'llvm/unittests/Bitcode/BitstreamReaderTest.cpp')
| -rw-r--r-- | llvm/unittests/Bitcode/BitstreamReaderTest.cpp | 36 |
1 files changed, 25 insertions, 11 deletions
diff --git a/llvm/unittests/Bitcode/BitstreamReaderTest.cpp b/llvm/unittests/Bitcode/BitstreamReaderTest.cpp index 85954858609..89657d9e992 100644 --- a/llvm/unittests/Bitcode/BitstreamReaderTest.cpp +++ b/llvm/unittests/Bitcode/BitstreamReaderTest.cpp @@ -22,15 +22,17 @@ TEST(BitstreamReaderTest, AtEndOfStream) { BitstreamCursor Cursor(Bytes); EXPECT_FALSE(Cursor.AtEndOfStream()); - (void)Cursor.Read(8); + Expected<SimpleBitstreamCursor::word_t> MaybeRead = Cursor.Read(8); + EXPECT_TRUE((bool)MaybeRead); EXPECT_FALSE(Cursor.AtEndOfStream()); - (void)Cursor.Read(24); + MaybeRead = Cursor.Read(24); + EXPECT_TRUE((bool)MaybeRead); EXPECT_TRUE(Cursor.AtEndOfStream()); - Cursor.JumpToBit(0); + EXPECT_FALSE(Cursor.JumpToBit(0)); EXPECT_FALSE(Cursor.AtEndOfStream()); - Cursor.JumpToBit(32); + EXPECT_FALSE(Cursor.JumpToBit(32)); EXPECT_TRUE(Cursor.AtEndOfStream()); } @@ -40,7 +42,7 @@ TEST(BitstreamReaderTest, AtEndOfStreamJump) { }; BitstreamCursor Cursor(Bytes); - Cursor.JumpToBit(32); + EXPECT_FALSE(Cursor.JumpToBit(32)); EXPECT_TRUE(Cursor.AtEndOfStream()); } @@ -56,7 +58,8 @@ TEST(BitstreamReaderTest, getCurrentByteNo) { for (unsigned I = 0, E = 32; I != E; ++I) { EXPECT_EQ(I / 8, Cursor.getCurrentByteNo()); - (void)Cursor.Read(1); + Expected<SimpleBitstreamCursor::word_t> MaybeRead = Cursor.Read(1); + EXPECT_TRUE((bool)MaybeRead); } EXPECT_EQ(4u, Cursor.getCurrentByteNo()); } @@ -116,24 +119,33 @@ TEST(BitstreamReaderTest, readRecordWithBlobWhileStreaming) { // Header. Included in test so that we can run llvm-bcanalyzer to debug // when there are problems. - ASSERT_EQ(Magic, Stream.Read(32)); + Expected<SimpleBitstreamCursor::word_t> MaybeRead = Stream.Read(32); + ASSERT_TRUE((bool)MaybeRead); + ASSERT_EQ(Magic, MaybeRead.get()); // Block. - BitstreamEntry Entry = + Expected<BitstreamEntry> MaybeEntry = Stream.advance(BitstreamCursor::AF_DontAutoprocessAbbrevs); + ASSERT_TRUE((bool)MaybeEntry); + BitstreamEntry Entry = MaybeEntry.get(); ASSERT_EQ(BitstreamEntry::SubBlock, Entry.Kind); ASSERT_EQ(BlockID, Entry.ID); ASSERT_FALSE(Stream.EnterSubBlock(BlockID)); // Abbreviation. - Entry = Stream.advance(); + MaybeEntry = Stream.advance(); + ASSERT_TRUE((bool)MaybeEntry); + Entry = MaybeEntry.get(); ASSERT_EQ(BitstreamEntry::Record, Entry.Kind); ASSERT_EQ(AbbrevID, Entry.ID); // Record. StringRef BlobOut; SmallVector<uint64_t, 1> Record; - ASSERT_EQ(RecordID, Stream.readRecord(Entry.ID, Record, &BlobOut)); + Expected<unsigned> MaybeRecord = + Stream.readRecord(Entry.ID, Record, &BlobOut); + ASSERT_TRUE((bool)MaybeRecord); + ASSERT_EQ(RecordID, MaybeRecord.get()); EXPECT_TRUE(Record.empty()); EXPECT_EQ(BlobIn, BlobOut); } @@ -143,7 +155,9 @@ TEST(BitstreamReaderTest, shortRead) { uint8_t Bytes[] = {8, 7, 6, 5, 4, 3, 2, 1}; for (unsigned I = 1; I != 8; ++I) { SimpleBitstreamCursor Cursor(ArrayRef<uint8_t>(Bytes, I)); - EXPECT_EQ(8ull, Cursor.Read(8)); + Expected<SimpleBitstreamCursor::word_t> MaybeRead = Cursor.Read(8); + ASSERT_TRUE((bool)MaybeRead); + EXPECT_EQ(8ull, MaybeRead.get()); } } |

