Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(131)

Unified Diff: unittests/Bitcode/NaClMungeWriteErrorTests.cpp

Issue 1157273004: Check for invalid abbreviation operators in munged bitcode. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-llvm.git@master
Patch Set: Fix nit. Remove copied comment from tests. Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: unittests/Bitcode/NaClMungeWriteErrorTests.cpp
diff --git a/unittests/Bitcode/NaClMungeWriteErrorTests.cpp b/unittests/Bitcode/NaClMungeWriteErrorTests.cpp
index fa2bec420b3ab7b8370658ca5cf446c3afe08eac..c974385de0a79e52a606cd6e199d4749e5d56ab7 100644
--- a/unittests/Bitcode/NaClMungeWriteErrorTests.cpp
+++ b/unittests/Bitcode/NaClMungeWriteErrorTests.cpp
@@ -38,7 +38,7 @@ const uint64_t BitcodeRecords[] = {
};
// Expected output when bitcode records are dumped.
-const char* ExpectedDump =
+const char *ExpectedDump =
" 0:0|<65532, 80, 69, 88, 69, 1, 0,|Magic Number: 'PEXE' (80, 69, "
"88, 69)\n"
" | 8, 0, 17, 0, 4, 0, 2, 0, 0, |PNaCl Version: 2\n"
@@ -60,6 +60,24 @@ const char* ExpectedDump =
" 64:0|0: <65534> |}\n"
;
+// Same as above, but just the records as generated by NaClWriteMunger.
jvoung (off chromium) 2015/05/27 20:09:37 I don't see a class named NaClWriteMunger.
Karl 2015/05/28 20:50:31 I was trying to clarify what tool generated the ou
+const char *ExpectedRecords =
+ " 1: [65535, 8, 2]\n"
+ " 1: [65535, 17, 3]\n"
+ " 3: [1, 2]\n"
+ " 3: [2]\n"
+ " 3: [21, 0, 0]\n"
+ " 0: [65534]\n"
+ " 3: [8, 1, 0, 0, 0]\n"
+ " 1: [65535, 12, 2]\n"
+ " 3: [1, 1]\n"
+ " 3: [10]\n"
+ " 0: [65534]\n"
+ " 0: [65534]\n";
+
+const char *UnableToContinue =
+ "Error: Unable to generate bitcode file due to write errors\n";
+
// Edit to change void type with an illegal abbreviation index.
const uint64_t VoidTypeIndex = 3; // Index for "@t0 = void".
const uint64_t AbbrevIndex4VoidTypeEdit[] = {
@@ -345,7 +363,7 @@ TEST(NaClMungeWriteErrorsTests, TestWritingMalformedAbbreviation) {
NaClWriteMunger Munger(ARRAY_TERM(BitcodeRecords));
EXPECT_FALSE(Munger.runTest(ARRAY(Edits)));
EXPECT_EQ(
- "Error (Block 12): Error: Bad abbreviation operand encoding 10:"
+ "Error (Block 12): Bad abbreviation operand encoding 10:"
" 2: [65533, 1, 10]\n"
"Error: Unable to generate bitcode file due to write errors\n",
Munger.getTestResults());
@@ -354,7 +372,7 @@ TEST(NaClMungeWriteErrorsTests, TestWritingMalformedAbbreviation) {
Munger.setTryToRecoverOnWrite(true);
EXPECT_TRUE(Munger.runTest(ARRAY(Edits)));
EXPECT_EQ(
- "Error (Block 12): Error: Bad abbreviation operand encoding 10: "
+ "Error (Block 12): Bad abbreviation operand encoding 10: "
"2: [65533, 1, 10]\n"
" 1: [65535, 8, 2]\n"
" 1: [65535, 17, 3]\n"
@@ -395,7 +413,7 @@ TEST(NaClMungedWriteErrorTests, TestRemovingAbbrevWithMultAbbrevs) {
Munger.setTryToRecoverOnWrite(true);
EXPECT_TRUE(Munger.runTest(ARRAY(Edits)));
EXPECT_EQ(
- "Error (Block 12): Error: Bad abbreviation operand encoding 9:"
+ "Error (Block 12): Bad abbreviation operand encoding 9:"
" 2: [65533, 1, 9]\n"
"Error (Block 12): Ignoring abbreviation: 2: [65533, 1, 1, 10]\n"
"Error (Block 12): Uses illegal abbreviation index: 5: [10]\n"
@@ -561,4 +579,130 @@ TEST(NaClMungeWriteErrorTests, RecoverWriteRecordOutsideBlock) {
Munger.getTestResults());
}
+// Runs write munging tests on BitcodeRecords, inserting bad
+// abbreviation definitions via Edit. ErrorMessage is the expected
jvoung (off chromium) 2015/05/27 20:09:37 via Edit -> via Edits ?
Karl 2015/05/28 20:50:32 Done.
+// error message to be generated by the write munger. Assumes the the
jvoung (off chromium) 2015/05/27 20:09:37 the the -> that the
Karl 2015/05/28 20:50:31 Done.
+// error recovery is to delete the bad abbreviation definitions.
jvoung (off chromium) 2015/05/27 20:09:37 error recover -> error recover method or somethin
Karl 2015/05/28 20:50:31 No longer applicable. Comments were rewritten.
+void CheckWriteBadAbbrevMunging(const uint64_t *Edits, size_t EditsSize,
+ const char *ErrorMessage) {
+ NaClWriteMunger Munger(ARRAY_TERM(BitcodeRecords));
+ EXPECT_FALSE(Munger.runTest(Edits, EditsSize));
+ std::string BadResults(ErrorMessage);
+ BadResults.append(UnableToContinue);
+ EXPECT_EQ(BadResults, Munger.getTestResults());
+
+ Munger.setTryToRecoverOnWrite(true);
+ EXPECT_TRUE(Munger.runTest(Edits, EditsSize));
+ std::string GoodResults(ErrorMessage);
+ GoodResults.append(ExpectedRecords);
+ EXPECT_EQ(GoodResults, Munger.getTestResults());
+}
+
+// Show that inserting an abbreviation with a bad fixed width is dealt with.
+TEST(NaClMungeWriteErrorTests, InvalidFixedAbbreviationSize) {
+ // Insert bad abbreviation Fixed(36) into type block.
jvoung (off chromium) 2015/05/27 20:09:37 how about static_assert(36 > naclbitc::MaxAbbrevWi
Karl 2015/05/28 20:50:31 Done.
+ const uint64_t Edit[] = {
+ VoidTypeIndex, NaClMungedBitcode::AddBefore,
+ naclbitc::DEFINE_ABBREV, naclbitc::BLK_CODE_DEFINE_ABBREV, 1,
+ 0, NaClBitCodeAbbrevOp::Fixed, 36, Terminator
jvoung (off chromium) 2015/05/27 20:09:38 can line up the 0, ... with the other array elems
Karl 2015/05/28 20:50:32 Done.
+ };
+ CheckWriteBadAbbrevMunging(
+ ARRAY(Edit),
+ "Error (Block 17): Invalid abbreviation Fixed(36) in: 2: [65533, 1, 0,"
+ " 1, 36]\n");
+}
+
+// Show that inserting an abbreviation with a bad vbr width is dealt with.
+TEST(NaClMungeWriteErrorTests, InvalidVbrAbbreviationSize) {
+ // Insert bad abbreviation Vbr(36) into type block.
+ const uint64_t Edit[] = {
+ VoidTypeIndex, NaClMungedBitcode::AddBefore,
+ naclbitc::DEFINE_ABBREV, naclbitc::BLK_CODE_DEFINE_ABBREV, 1,
+ 0, NaClBitCodeAbbrevOp::VBR, 36,
+ Terminator
+ };
+ CheckWriteBadAbbrevMunging(
+ ARRAY(Edit),
+ "Error (Block 17): Invalid abbreviation VBR(36) in: 2: [65533, 1, 0,"
+ " 2, 36]\n");
+}
+
+// Show that the array operator can't appear last.
+TEST(NaClMungeWriteErrorTests, InvalidArrayAbbreviationLast) {
+ const uint64_t Edit[] = {
+ VoidTypeIndex, NaClMungedBitcode::AddBefore,
+ naclbitc::DEFINE_ABBREV, naclbitc::BLK_CODE_DEFINE_ABBREV, 1,
+ 0, NaClBitCodeAbbrevOp::Array, Terminator
+ };
+ CheckWriteBadAbbrevMunging(
+ ARRAY(Edit),
+ "Error (Block 17): Malformed array abbreviation found: 2: [65533, 1,"
+ " 0, 3]\n");
+}
+
+// Show that the array operator can't appear before the second to last
+// operand.
+TEST(NaClMungeWriteErrorTests, InvalidArrayAbbreviationTooEarly) {
+ const uint64_t Edit[] = {
+ VoidTypeIndex, NaClMungedBitcode::AddBefore,
+ naclbitc::DEFINE_ABBREV, naclbitc::BLK_CODE_DEFINE_ABBREV, 3,
+ 0, NaClBitCodeAbbrevOp::Array, // array
+ 1, 15, // lit(15)
+ 1, 10, // lit(10)
+ Terminator
+ };
+ CheckWriteBadAbbrevMunging(
+ ARRAY(Edit),
+ "Error (Block 17): Array abbreviation must be second to last: 2: [65533,"
+ " 3, 0, 3, 1, 15, 1, 10]\n");
+}
+
+// Show that the array operator can't appear as last two operators.
+TEST(NaClMungeWriteErrorTests, InvalidArrayAbbreviationLastTwo) {
+ const uint64_t Edit[] = {
+ VoidTypeIndex, NaClMungedBitcode::AddBefore,
+ naclbitc::DEFINE_ABBREV, naclbitc::BLK_CODE_DEFINE_ABBREV, 2,
+ 0, NaClBitCodeAbbrevOp::Array, // array
+ 0, NaClBitCodeAbbrevOp::Array, // array
+ Terminator
+ };
+ CheckWriteBadAbbrevMunging(
+ ARRAY(Edit),
+ "Error (Block 17): Malformed array abbreviation found: 2: [65533, 2,"
+ " 0, 3, 0, 3]\n");
+}
+
+// Show that the code checks if specifies too few operands for an
jvoung (off chromium) 2015/05/27 20:09:37 nit: "Show that the code checks if specifies too f
Karl 2015/05/28 20:50:31 Rewritten.
+// abbreviation, based on the record size.
+TEST(NaClMungeWriteErrorTests, SpecifiesTooFewOperands) {
+ const uint64_t Edit[] = {
+ VoidTypeIndex, NaClMungedBitcode::AddBefore,
+ naclbitc::DEFINE_ABBREV, naclbitc::BLK_CODE_DEFINE_ABBREV, 1,
+ 1, 10, // lit(10)
+ 1, 15, // lit(15)
+ Terminator
+ };
+ CheckWriteBadAbbrevMunging(
+ ARRAY(Edit),
+ "Error (Block 17): Error: Too many values for number of operands (1):"
+ " 2: [65533, 1, 1, 10, 1, 15]\n");
+}
+
+// Show that the code checks if specifies too many operands for an
+// abbreviation, based on the record size.
+TEST(NaClMungeWriteErrorTests, SpecifiesTooManyOperands) {
+ // Insert bad abbreviation Vbr(36) into type block.
+ const uint64_t Edit[] = {
+ VoidTypeIndex, NaClMungedBitcode::AddBefore,
+ naclbitc::DEFINE_ABBREV, naclbitc::BLK_CODE_DEFINE_ABBREV, 3,
+ 1, 10, // lit(10)
+ 1, 15, // lit(15)
+ Terminator
+ };
+ CheckWriteBadAbbrevMunging(
+ ARRAY(Edit),
+ "Error (Block 17): Malformed abbreviation found. Expects 3 operands"
+ " but found 2: 2: [65533, 3, 1, 10, 1, 15]\n");
+}
+
} // end of namespace naclmungetest

Powered by Google App Engine
This is Rietveld 408576698