From bc875f6b9c140d351ec8ae96d2c8e29979017d57 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Tue, 5 Dec 2017 10:44:28 +0000 Subject: Warn for assembly labels too --- test/libsolidity/InlineAssembly.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'test/libsolidity/InlineAssembly.cpp') diff --git a/test/libsolidity/InlineAssembly.cpp b/test/libsolidity/InlineAssembly.cpp index e9fb8431..506721c1 100644 --- a/test/libsolidity/InlineAssembly.cpp +++ b/test/libsolidity/InlineAssembly.cpp @@ -714,6 +714,7 @@ BOOST_AUTO_TEST_CASE(jump_warning) CHECK_PARSE_WARNING("{ 1 2 jumpi }", Warning, "Jump instructions"); CHECK_PARSE_WARNING("{ a: jump(a) }", Warning, "Jump instructions"); CHECK_PARSE_WARNING("{ a: jumpi(a, 2) }", Warning, "Jump instructions"); + CHECK_PARSE_WARNING("{ a: }", Warning, "Jump instructions"); } BOOST_AUTO_TEST_SUITE_END() -- cgit v1.2.3 From d57afb20fa32be3d5575b8c5dcd98f39ce4e90d0 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Tue, 5 Dec 2017 20:27:50 +0000 Subject: Fix warning test for jumps in assembly --- test/libsolidity/InlineAssembly.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'test/libsolidity/InlineAssembly.cpp') diff --git a/test/libsolidity/InlineAssembly.cpp b/test/libsolidity/InlineAssembly.cpp index 506721c1..82bafd49 100644 --- a/test/libsolidity/InlineAssembly.cpp +++ b/test/libsolidity/InlineAssembly.cpp @@ -712,8 +712,8 @@ BOOST_AUTO_TEST_CASE(jump_warning) { CHECK_PARSE_WARNING("{ 1 jump }", Warning, "Jump instructions"); CHECK_PARSE_WARNING("{ 1 2 jumpi }", Warning, "Jump instructions"); - CHECK_PARSE_WARNING("{ a: jump(a) }", Warning, "Jump instructions"); - CHECK_PARSE_WARNING("{ a: jumpi(a, 2) }", Warning, "Jump instructions"); + CHECK_PARSE_WARNING("{ jump(44) }", Warning, "Jump instructions"); + CHECK_PARSE_WARNING("{ jumpi(44, 2) }", Warning, "Jump instructions"); CHECK_PARSE_WARNING("{ a: }", Warning, "Jump instructions"); } -- cgit v1.2.3 From ca0d244bf7252e76b640f88fbefd6b497a4e9d09 Mon Sep 17 00:00:00 2001 From: chriseth Date: Wed, 13 Dec 2017 12:28:02 +0100 Subject: Adjust tests. --- test/libsolidity/InlineAssembly.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'test/libsolidity/InlineAssembly.cpp') diff --git a/test/libsolidity/InlineAssembly.cpp b/test/libsolidity/InlineAssembly.cpp index 82bafd49..94e02b8f 100644 --- a/test/libsolidity/InlineAssembly.cpp +++ b/test/libsolidity/InlineAssembly.cpp @@ -266,7 +266,7 @@ BOOST_AUTO_TEST_CASE(if_statement_scope) BOOST_AUTO_TEST_CASE(if_statement_invalid) { - CHECK_PARSE_ERROR("{ if calldatasize {}", ParserError, "Instructions are not supported as conditions for if"); + CHECK_PARSE_ERROR("{ if mload {} }", ParserError, "Expected token \"(\""); BOOST_CHECK("{ if calldatasize() {}"); CHECK_PARSE_ERROR("{ if mstore(1, 1) {} }", ParserError, "Instruction \"mstore\" not allowed in this context"); CHECK_PARSE_ERROR("{ if 32 let x := 3 }", ParserError, "Expected token LBrace"); @@ -296,7 +296,7 @@ BOOST_AUTO_TEST_CASE(switch_duplicate_case) BOOST_AUTO_TEST_CASE(switch_invalid_expression) { CHECK_PARSE_ERROR("{ switch {} default {} }", ParserError, "Literal, identifier or instruction expected."); - CHECK_PARSE_ERROR("{ switch calldatasize default {} }", ParserError, "Instructions are not supported as expressions for switch"); + CHECK_PARSE_ERROR("{ switch mload default {} }", ParserError, "Expected token \"(\""); CHECK_PARSE_ERROR("{ switch mstore(1, 1) default {} }", ParserError, "Instruction \"mstore\" not allowed in this context"); } @@ -332,7 +332,7 @@ BOOST_AUTO_TEST_CASE(for_invalid_expression) CHECK_PARSE_ERROR("{ for 1 1 {} {} }", ParserError, "Expected token LBrace got 'Number'"); CHECK_PARSE_ERROR("{ for {} 1 1 {} }", ParserError, "Expected token LBrace got 'Number'"); CHECK_PARSE_ERROR("{ for {} 1 {} 1 }", ParserError, "Expected token LBrace got 'Number'"); - CHECK_PARSE_ERROR("{ for {} calldatasize {} {} }", ParserError, "Instructions are not supported as conditions for the for statement."); + CHECK_PARSE_ERROR("{ for {} mload {} {} }", ParserError, "Expected token \"(\""); CHECK_PARSE_ERROR("{ for {} mstore(1, 1) {} {} }", ParserError, "Instruction \"mstore\" not allowed in this context"); } @@ -540,7 +540,7 @@ BOOST_AUTO_TEST_CASE(function_calls) function g(a, b, c) { } - g(1, mul(2, address), f(mul(2, caller))) + g(1, mul(2, address()), f(mul(2, caller()))) y() })"; boost::replace_all(source, "\t", " "); -- cgit v1.2.3 From 767052f2f78a2fd7cd37991945b0a3f559851822 Mon Sep 17 00:00:00 2001 From: chriseth Date: Sat, 6 Jan 2018 01:24:45 +0100 Subject: Tests for strict mode. --- test/libsolidity/InlineAssembly.cpp | 78 ++++++++++++++++++++++++++++++++----- 1 file changed, 69 insertions(+), 9 deletions(-) (limited to 'test/libsolidity/InlineAssembly.cpp') diff --git a/test/libsolidity/InlineAssembly.cpp b/test/libsolidity/InlineAssembly.cpp index 94e02b8f..9e87849b 100644 --- a/test/libsolidity/InlineAssembly.cpp +++ b/test/libsolidity/InlineAssembly.cpp @@ -51,10 +51,11 @@ boost::optional parseAndReturnFirstError( string const& _source, bool _assemble = false, bool _allowWarnings = true, + AssemblyStack::Language _language = AssemblyStack::Language::Assembly, AssemblyStack::Machine _machine = AssemblyStack::Machine::EVM ) { - AssemblyStack stack; + AssemblyStack stack(_language); bool success = false; try { @@ -87,22 +88,29 @@ bool successParse( string const& _source, bool _assemble = false, bool _allowWarnings = true, + AssemblyStack::Language _language = AssemblyStack::Language::Assembly, AssemblyStack::Machine _machine = AssemblyStack::Machine::EVM ) { - return !parseAndReturnFirstError(_source, _assemble, _allowWarnings, _machine); + return !parseAndReturnFirstError(_source, _assemble, _allowWarnings, _language, _machine); } -bool successAssemble(string const& _source, bool _allowWarnings = true) +bool successAssemble(string const& _source, bool _allowWarnings = true, AssemblyStack::Language _language = AssemblyStack::Language::Assembly) { - return successParse(_source, true, _allowWarnings, AssemblyStack::Machine::EVM) && - successParse(_source, true, _allowWarnings, AssemblyStack::Machine::EVM15); + return + successParse(_source, true, _allowWarnings, _language, AssemblyStack::Machine::EVM) && + successParse(_source, true, _allowWarnings, _language, AssemblyStack::Machine::EVM15); } -Error expectError(std::string const& _source, bool _assemble, bool _allowWarnings = false) +Error expectError( + std::string const& _source, + bool _assemble, + bool _allowWarnings = false, + AssemblyStack::Language _language = AssemblyStack::Language::Assembly +) { - auto error = parseAndReturnFirstError(_source, _assemble, _allowWarnings); + auto error = parseAndReturnFirstError(_source, _assemble, _allowWarnings, _language); BOOST_REQUIRE(error); return *error; } @@ -120,14 +128,17 @@ void parsePrintCompare(string const& _source, bool _canWarn = false) } -#define CHECK_ERROR(text, assemble, typ, substring, warnings) \ +#define CHECK_ERROR_LANG(text, assemble, typ, substring, warnings, language) \ do \ { \ - Error err = expectError((text), (assemble), warnings); \ + Error err = expectError((text), (assemble), warnings, (language)); \ BOOST_CHECK(err.type() == (Error::Type::typ)); \ BOOST_CHECK(searchErrorMessage(err, (substring))); \ } while(0) +#define CHECK_ERROR(text, assemble, typ, substring, warnings) \ +CHECK_ERROR_LANG(text, assemble, typ, substring, warnings, AssemblyStack::Language::Assembly) + #define CHECK_PARSE_ERROR(text, type, substring) \ CHECK_ERROR(text, false, type, substring, false) @@ -137,6 +148,14 @@ CHECK_ERROR(text, false, type, substring, false) #define CHECK_ASSEMBLE_ERROR(text, type, substring) \ CHECK_ERROR(text, true, type, substring, false) +#define CHECK_STRICT_ERROR(text, type, substring) \ +CHECK_ERROR_LANG(text, false, type, substring, false, AssemblyStack::Language::StrictAssembly) + +#define CHECK_STRICT_WARNING(text, type, substring) \ +CHECK_ERROR(text, false, type, substring, false, AssemblyStack::Language::StrictAssembly) + +#define SUCCESS_STRICT(text) \ +do { successParse((text), false, false, AssemblyStack::Language::StrictAssembly); } while (false) BOOST_AUTO_TEST_SUITE(SolidityInlineAssembly) @@ -455,6 +474,47 @@ BOOST_AUTO_TEST_CASE(multiple_assignment) BOOST_AUTO_TEST_SUITE_END() +BOOST_AUTO_TEST_SUITE(LooseStrictMode) + +BOOST_AUTO_TEST_CASE(no_opcodes_in_strict) +{ + BOOST_CHECK(successParse("{ pop(callvalue) }")); + BOOST_CHECK(successParse("{ callvalue pop }")); + CHECK_STRICT_ERROR("{ pop(callvalue) }", ParserError, "Expected token \"(\" (\"callvalue\" expects 0 arguments)"); + CHECK_STRICT_ERROR("{ callvalue pop }", ParserError, "Call or assignment expected"); + SUCCESS_STRICT("{ pop(callvalue()) }"); + BOOST_CHECK(successParse("{ switch callvalue case 0 {} }")); + CHECK_STRICT_ERROR("{ switch callvalue case 0 {} }", ParserError, "Expected token \"(\" (\"callvalue\" expects 0 arguments)"); +} + +BOOST_AUTO_TEST_CASE(no_labels_in_strict) +{ + BOOST_CHECK(successParse("{ a: }")); + CHECK_STRICT_ERROR("{ a: }", ParserError, "Labels are not supported"); +} + +BOOST_AUTO_TEST_CASE(no_stack_assign_in_strict) +{ + BOOST_CHECK(successParse("{ let x 4 =: x }")); + CHECK_STRICT_ERROR("{ let x 4 =: x }", ParserError, "Call or assignment expected."); +} + +BOOST_AUTO_TEST_CASE(no_dup_swap_in_strict) +{ + BOOST_CHECK(successParse("{ swap1 }")); + CHECK_STRICT_ERROR("{ swap1 }", ParserError, "Call or assignment expected."); + BOOST_CHECK(successParse("{ dup1 pop }")); + CHECK_STRICT_ERROR("{ dup1 pop }", ParserError, "Call or assignment expected."); + BOOST_CHECK(successParse("{ swap2 }")); + CHECK_STRICT_ERROR("{ swap2 }", ParserError, "Call or assignment expected."); + BOOST_CHECK(successParse("{ dup2 pop }")); + CHECK_STRICT_ERROR("{ dup2 pop }", ParserError, "Call or assignment expected."); + CHECK_PARSE_ERROR("{ switch dup1 case 0 {} }", ParserError, "Expected token \"(\" (\"dup1\" expects 1 arguments)"); + CHECK_STRICT_ERROR("{ switch dup1 case 0 {} }", ParserError, "Expected token \"(\" (\"dup1\" expects 1 arguments)"); +} + +BOOST_AUTO_TEST_SUITE_END() + BOOST_AUTO_TEST_SUITE(Printing) BOOST_AUTO_TEST_CASE(print_smoke) -- cgit v1.2.3 From 42f88757708c42f447572c9b96da06c06329e9bc Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Mon, 8 Jan 2018 00:39:22 +0000 Subject: Show restricted instruction warning before argument mismatch issue --- test/libsolidity/InlineAssembly.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'test/libsolidity/InlineAssembly.cpp') diff --git a/test/libsolidity/InlineAssembly.cpp b/test/libsolidity/InlineAssembly.cpp index 9e87849b..216e1422 100644 --- a/test/libsolidity/InlineAssembly.cpp +++ b/test/libsolidity/InlineAssembly.cpp @@ -480,11 +480,11 @@ BOOST_AUTO_TEST_CASE(no_opcodes_in_strict) { BOOST_CHECK(successParse("{ pop(callvalue) }")); BOOST_CHECK(successParse("{ callvalue pop }")); - CHECK_STRICT_ERROR("{ pop(callvalue) }", ParserError, "Expected token \"(\" (\"callvalue\" expects 0 arguments)"); + CHECK_STRICT_ERROR("{ pop(callvalue) }", ParserError, "Instruction \"callvalue\" not allowed in this context"); CHECK_STRICT_ERROR("{ callvalue pop }", ParserError, "Call or assignment expected"); SUCCESS_STRICT("{ pop(callvalue()) }"); BOOST_CHECK(successParse("{ switch callvalue case 0 {} }")); - CHECK_STRICT_ERROR("{ switch callvalue case 0 {} }", ParserError, "Expected token \"(\" (\"callvalue\" expects 0 arguments)"); + CHECK_STRICT_ERROR("{ switch callvalue case 0 {} }", ParserError, "Instruction \"callvalue\" not allowed in this context"); } BOOST_AUTO_TEST_CASE(no_labels_in_strict) @@ -509,8 +509,8 @@ BOOST_AUTO_TEST_CASE(no_dup_swap_in_strict) CHECK_STRICT_ERROR("{ swap2 }", ParserError, "Call or assignment expected."); BOOST_CHECK(successParse("{ dup2 pop }")); CHECK_STRICT_ERROR("{ dup2 pop }", ParserError, "Call or assignment expected."); - CHECK_PARSE_ERROR("{ switch dup1 case 0 {} }", ParserError, "Expected token \"(\" (\"dup1\" expects 1 arguments)"); - CHECK_STRICT_ERROR("{ switch dup1 case 0 {} }", ParserError, "Expected token \"(\" (\"dup1\" expects 1 arguments)"); + CHECK_PARSE_ERROR("{ switch dup1 case 0 {} }", ParserError, "Instruction \"dup1\" not allowed in this context"); + CHECK_STRICT_ERROR("{ switch dup1 case 0 {} }", ParserError, "Instruction \"dup1\" not allowed in this context"); } BOOST_AUTO_TEST_SUITE_END() -- cgit v1.2.3 From 8b20a7cd53b04a4b3b3e26df4ddd9ad81d28bb1b Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Tue, 9 Jan 2018 17:30:14 +0000 Subject: Disallow non-functional instructions in parseExpression early --- test/libsolidity/InlineAssembly.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'test/libsolidity/InlineAssembly.cpp') diff --git a/test/libsolidity/InlineAssembly.cpp b/test/libsolidity/InlineAssembly.cpp index 216e1422..b09eb261 100644 --- a/test/libsolidity/InlineAssembly.cpp +++ b/test/libsolidity/InlineAssembly.cpp @@ -480,11 +480,11 @@ BOOST_AUTO_TEST_CASE(no_opcodes_in_strict) { BOOST_CHECK(successParse("{ pop(callvalue) }")); BOOST_CHECK(successParse("{ callvalue pop }")); - CHECK_STRICT_ERROR("{ pop(callvalue) }", ParserError, "Instruction \"callvalue\" not allowed in this context"); + CHECK_STRICT_ERROR("{ pop(callvalue) }", ParserError, "Non-functional instructions are not allowed in this context."); CHECK_STRICT_ERROR("{ callvalue pop }", ParserError, "Call or assignment expected"); SUCCESS_STRICT("{ pop(callvalue()) }"); BOOST_CHECK(successParse("{ switch callvalue case 0 {} }")); - CHECK_STRICT_ERROR("{ switch callvalue case 0 {} }", ParserError, "Instruction \"callvalue\" not allowed in this context"); + CHECK_STRICT_ERROR("{ switch callvalue case 0 {} }", ParserError, "Non-functional instructions are not allowed in this context."); } BOOST_AUTO_TEST_CASE(no_labels_in_strict) -- cgit v1.2.3