diff --git a/test/unittests/eof_validation_test.cpp b/test/unittests/eof_validation_test.cpp index 67473c508f..3ec3669982 100644 --- a/test/unittests/eof_validation_test.cpp +++ b/test/unittests/eof_validation_test.cpp @@ -233,6 +233,108 @@ 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(from_hex("EF0001 010004 00 5C000000"), EVMC_CANCUN), + EOFValidationError::success); + + // offset = 3 + EXPECT_EQ(validate_eof(from_hex("EF0001 010007 00 5C000300000000"), EVMC_CANCUN), + EOFValidationError::success); + + // offset = -4 + EXPECT_EQ(validate_eof(from_hex("EF0001 010005 00 005CFFFC00"), EVMC_CANCUN), + EOFValidationError::success); +} + +TEST(eof_validation, EOF1_valid_rjumpi) +{ + // offset = 0 + EXPECT_EQ(validate_eof(from_hex("EF0001 010006 00 60005D000000"), EVMC_CANCUN), + EOFValidationError::success); + + // offset = 3 + EXPECT_EQ(validate_eof(from_hex("EF0001 010009 00 60005D000300000000"), EVMC_CANCUN), + EOFValidationError::success); + + // offset = -5 + EXPECT_EQ(validate_eof(from_hex("EF0001 010006 00 60005DFFFB00"), EVMC_CANCUN), + EOFValidationError::success); +} + +TEST(eof_validation, EOF1_rjump_truncated) +{ + EXPECT_EQ(validate_eof(from_hex("EF0001 010001 00 5C"), EVMC_CANCUN), + EOFValidationError::missing_terminating_instruction); + + EXPECT_EQ(validate_eof(from_hex("EF0001 010002 00 5C00"), EVMC_CANCUN), + EOFValidationError::missing_terminating_instruction); +} + +TEST(eof_validation, EOF1_rjumpi_truncated) +{ + EXPECT_EQ(validate_eof(from_hex("EF0001 010003 00 60005D"), EVMC_CANCUN), + EOFValidationError::missing_terminating_instruction); + + EXPECT_EQ(validate_eof(from_hex("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(from_hex("EF0001 010004 00 5CFFFB00"), EVMC_CANCUN), + EOFValidationError::invalid_rjump_destination); + + // To before code begin (offset = -13) + EXPECT_EQ(validate_eof(from_hex("EF0001 010004 00 5CFFF300"), EVMC_CANCUN), + EOFValidationError::invalid_rjump_destination); + + // To after code end (offset = 2) + EXPECT_EQ(validate_eof(from_hex("EF0001 010004 00 5C000200"), EVMC_CANCUN), + EOFValidationError::invalid_rjump_destination); + + // To code end (offset = 1) + EXPECT_EQ(validate_eof(from_hex("EF0001 010004 00 5C000100"), EVMC_CANCUN), + EOFValidationError::invalid_rjump_destination); + + // To the same RJUMP immediate (offset = -1) + EXPECT_EQ(validate_eof(from_hex("EF0001 010004 00 5CFFFF00"), EVMC_CANCUN), + EOFValidationError::invalid_rjump_destination); + + // To PUSH immediate (offset = -4) + EXPECT_EQ(validate_eof(from_hex("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(from_hex("EF0001 010006 00 60005DFFF900"), EVMC_CANCUN), + EOFValidationError::invalid_rjump_destination); + + // To before code begin (offset = -15) + EXPECT_EQ(validate_eof(from_hex("EF0001 010006 00 60005DFFF100"), EVMC_CANCUN), + EOFValidationError::invalid_rjump_destination); + + // To after code end (offset = 2) + EXPECT_EQ(validate_eof(from_hex("EF0001 010006 00 60005D000200"), EVMC_CANCUN), + EOFValidationError::invalid_rjump_destination); + + // To code end (offset = 1) + EXPECT_EQ(validate_eof(from_hex("EF0001 010006 00 60005D000100"), EVMC_CANCUN), + EOFValidationError::invalid_rjump_destination); + + // To the same RJUMPI immediate (offset = -1) + EXPECT_EQ(validate_eof(from_hex("EF0001 010006 00 60005DFFFF00"), EVMC_CANCUN), + EOFValidationError::invalid_rjump_destination); + + // To PUSH immediate (offset = -4) + EXPECT_EQ(validate_eof(from_hex("EF0001 010006 00 60005DFFFC00"), EVMC_CANCUN), + EOFValidationError::invalid_rjump_destination); +}