From f9cafab97634291f9c9cff980bac712df66204d6 Mon Sep 17 00:00:00 2001 From: Andrei Maiboroda Date: Tue, 22 Mar 2022 14:16:06 +0100 Subject: [PATCH] Tests for RJUMP/RJUMPI instruction validation --- test/unittests/eof_validation_test.cpp | 103 ++++++++++++++++++++++++- 1 file changed, 102 insertions(+), 1 deletion(-) diff --git a/test/unittests/eof_validation_test.cpp b/test/unittests/eof_validation_test.cpp index d50b84947c..76b680fef3 100644 --- a/test/unittests/eof_validation_test.cpp +++ b/test/unittests/eof_validation_test.cpp @@ -233,6 +233,107 @@ TEST(eof_validation, EOF1_terminating_instructions) opcode == OP_INVALID || opcode == OP_SELFDESTRUCT) ? EOFValidationError::success : EOFValidationError::missing_terminating_instruction); - EXPECT_EQ(validate_eof(container), expected) << hex(code); + EXPECT_EQ(validate_eof(container, EVMC_CANCUN), expected) << hex(code); } } + +TEST(eof_validation, EOF1_valid_rjump) +{ + // offset = 0 + EXPECT_EQ(validate_eof("EF0001 010004 00 5C000000", EVMC_CANCUN), EOFValidationError::success); + + // offset = 3 + EXPECT_EQ( + validate_eof("EF0001 010007 00 5C000300000000", EVMC_CANCUN), EOFValidationError::success); + + // offset = -4 + EXPECT_EQ( + validate_eof("EF0001 010005 00 005CFFFC00", EVMC_CANCUN), EOFValidationError::success); +} + +TEST(eof_validation, EOF1_valid_rjumpi) +{ + // offset = 0 + EXPECT_EQ( + validate_eof("EF0001 010006 00 60005D000000", EVMC_CANCUN), EOFValidationError::success); + + // offset = 3 + EXPECT_EQ(validate_eof("EF0001 010009 00 60005D000300000000", EVMC_CANCUN), + EOFValidationError::success); + + // offset = -5 + EXPECT_EQ( + validate_eof("EF0001 010006 00 60005DFFFB00", EVMC_CANCUN), EOFValidationError::success); +} + +TEST(eof_validation, EOF1_rjump_truncated) +{ + EXPECT_EQ(validate_eof("EF0001 010001 00 5C", EVMC_CANCUN), + EOFValidationError::missing_terminating_instruction); + + EXPECT_EQ(validate_eof("EF0001 010002 00 5C00", EVMC_CANCUN), + EOFValidationError::missing_terminating_instruction); +} + +TEST(eof_validation, EOF1_rjumpi_truncated) +{ + EXPECT_EQ(validate_eof("EF0001 010003 00 60005D", EVMC_CANCUN), + EOFValidationError::missing_terminating_instruction); + + EXPECT_EQ(validate_eof("EF0001 010004 00 60005D00", EVMC_CANCUN), + EOFValidationError::missing_terminating_instruction); +} + +TEST(eof_validation, EOF1_rjump_invalid_destination) +{ + // Into header (offset = -5) + EXPECT_EQ(validate_eof("EF0001 010004 00 5CFFFB00", EVMC_CANCUN), + EOFValidationError::invalid_rjump_destination); + + // To before code begin (offset = -13) + EXPECT_EQ(validate_eof("EF0001 010004 00 5CFFF300", EVMC_CANCUN), + EOFValidationError::invalid_rjump_destination); + + // To after code end (offset = 2) + EXPECT_EQ(validate_eof("EF0001 010004 00 5C000200", EVMC_CANCUN), + EOFValidationError::invalid_rjump_destination); + + // To code end (offset = 1) + EXPECT_EQ(validate_eof("EF0001 010004 00 5C000100", EVMC_CANCUN), + EOFValidationError::invalid_rjump_destination); + + // To the same RJUMP immediate (offset = -1) + EXPECT_EQ(validate_eof("EF0001 010004 00 5CFFFF00", EVMC_CANCUN), + EOFValidationError::invalid_rjump_destination); + + // To PUSH immediate (offset = -4) + EXPECT_EQ(validate_eof("EF0001 010006 00 60005CFFFC00", EVMC_CANCUN), + EOFValidationError::invalid_rjump_destination); +} + +TEST(eof_validation, EOF1_rjumpi_invalid_destination) +{ + // Into header (offset = -7) + EXPECT_EQ(validate_eof("EF0001 010006 00 60005DFFF900", EVMC_CANCUN), + EOFValidationError::invalid_rjump_destination); + + // To before code begin (offset = -15) + EXPECT_EQ(validate_eof("EF0001 010006 00 60005DFFF100", EVMC_CANCUN), + EOFValidationError::invalid_rjump_destination); + + // To after code end (offset = 2) + EXPECT_EQ(validate_eof("EF0001 010006 00 60005D000200", EVMC_CANCUN), + EOFValidationError::invalid_rjump_destination); + + // To code end (offset = 1) + EXPECT_EQ(validate_eof("EF0001 010006 00 60005D000100", EVMC_CANCUN), + EOFValidationError::invalid_rjump_destination); + + // To the same RJUMPI immediate (offset = -1) + EXPECT_EQ(validate_eof("EF0001 010006 00 60005DFFFF00", EVMC_CANCUN), + EOFValidationError::invalid_rjump_destination); + + // To PUSH immediate (offset = -4) + EXPECT_EQ(validate_eof("EF0001 010006 00 60005DFFFC00", EVMC_CANCUN), + EOFValidationError::invalid_rjump_destination); +}