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

Unified Diff: unittest/IceParseTypesTest.cpp

Issue 1182323011: Fix handling of TYPE_CODE_NUMENTRY record when size large. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Fix nits. Created 5 years, 6 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
« no previous file with comments | « src/PNaClTranslator.cpp ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: unittest/IceParseTypesTest.cpp
diff --git a/unittest/IceParseTypesTest.cpp b/unittest/IceParseTypesTest.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..6449697667052f902914c954557ee3497570792e
--- /dev/null
+++ b/unittest/IceParseTypesTest.cpp
@@ -0,0 +1,89 @@
+//===- unittest/IceParseTypesTest.cpp -------------------------------------===//
+// Tests parser for PNaCl bitcode.
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests record errors in the types block when parsing PNaCl bitcode.
+
+// TODO(kschimpf) Add more tests.
+
+#include "BitcodeMunge.h"
+#include "unittests/Bitcode/NaClMungeTest.h"
+
+using namespace llvm;
+using namespace naclmungetest;
+using namespace IceTest;
+
+namespace {
+
+static const unsigned NO_LOCAL_ABBREVS =
+ NaClBitsNeededForValue(naclbitc::DEFAULT_MAX_ABBREV);
+
+const uint64_t BitcodeRecords[] = {
+ naclbitc::ENTER_SUBBLOCK, naclbitc::BLK_CODE_ENTER,
+ naclbitc::MODULE_BLOCK_ID, NO_LOCAL_ABBREVS, Terminator,
+ naclbitc::ENTER_SUBBLOCK, naclbitc::BLK_CODE_ENTER,
+ naclbitc::TYPE_BLOCK_ID_NEW, NO_LOCAL_ABBREVS, Terminator,
+ naclbitc::UNABBREV_RECORD, naclbitc::TYPE_CODE_NUMENTRY, 2, Terminator,
+ naclbitc::UNABBREV_RECORD, naclbitc::TYPE_CODE_INTEGER, 32, Terminator,
+ naclbitc::UNABBREV_RECORD, naclbitc::TYPE_CODE_FLOAT, Terminator,
+ naclbitc::END_BLOCK, naclbitc::BLK_CODE_EXIT, Terminator,
+ naclbitc::END_BLOCK, naclbitc::BLK_CODE_EXIT, Terminator};
+
+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"
+ " | 0> |\n"
+ " 16:0|1: <65535, 8, 2> |module { // BlockID = 8\n"
+ " 24:0| 1: <65535, 17, 2> | types { // BlockID = 17\n"
+ " 32:0| 3: <1, 2> | count 2;\n"
+ " 34:4| 3: <7, 32> | @t0 = i32;\n"
+ " 37:6| 3: <3> | @t1 = float;\n"
+ " 39:4| 0: <65534> | }\n"
+ " 40:0|0: <65534> |}\n";
+
+TEST(NaClParseTypesTest, ShowExpectedDump) {
+ NaClObjDumpMunger Munger(ARRAY_TERM(BitcodeRecords));
+ EXPECT_TRUE(Munger.runTest());
+ EXPECT_EQ(ExpectedDump, Munger.getTestResults());
+}
+
+// Show what happens when misdefining: @t1 = float"
+TEST(NaClParseTypesTest, BadFloatTypeDefinition) {
+ // Index for "@t1 = float;" record.
+ const uint64_t FloatTypeIndex = 4;
+ const uint64_t Edit[] = {FloatTypeIndex, NaClMungedBitcode::Replace,
+ // Add extraneous 1 to end of float record.
+ naclbitc::UNABBREV_RECORD, naclbitc::TYPE_CODE_FLOAT,
+ 1, Terminator};
+
+ SubzeroBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords));
+ EXPECT_FALSE(Munger.runTest(ARRAY(Edit)));
+ EXPECT_EQ("Error(37:6): Invalid type record: <3 1>\n",
+ Munger.getTestResults());
+}
+
+// Show what happens when the count record value is way too big.
+// See: https://code.google.com/p/nativeclient/issues/detail?id=4195
+TEST(NaClParseTypesTest, BadTypeCountRecord) {
+ // Index for "count 2;".
+ const uint64_t CountRecordIndex = 2;
+ const uint64_t Edit[] = {
+ CountRecordIndex, NaClMungedBitcode::Replace, naclbitc::UNABBREV_RECORD,
+ naclbitc::TYPE_CODE_NUMENTRY, 18446744073709547964ULL, Terminator};
+
+ SubzeroBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords));
+ Munger.Flags.setGenerateUnitTestMessages(false);
+ EXPECT_FALSE(Munger.runTest(ARRAY(Edit)));
+ EXPECT_EQ("Error(32:0): Size to big for count record: 18446744073709547964\n"
+ "Error(48:4): Types block expected 4294963644 types but found: 2\n",
+ Munger.getTestResults());
+}
+
+} // end of anonymous namespace
« no previous file with comments | « src/PNaClTranslator.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698