diff options
author | chriseth <chris@ethereum.org> | 2017-06-14 00:38:55 +0800 |
---|---|---|
committer | chriseth <chris@ethereum.org> | 2017-06-14 20:51:47 +0800 |
commit | 1b1f35762e7d761a6a97f825699972472ba44888 (patch) | |
tree | acedd6c37c3d39d30a20641e1279c3a408a0e8f1 | |
parent | 0b99c81f8536aa7888f26ac349ab233825350efc (diff) | |
download | dexon-solidity-1b1f35762e7d761a6a97f825699972472ba44888.tar.gz dexon-solidity-1b1f35762e7d761a6a97f825699972472ba44888.tar.zst dexon-solidity-1b1f35762e7d761a6a97f825699972472ba44888.zip |
Enforce function arguments when parsing functional instructions.
-rw-r--r-- | Changelog.md | 1 | ||||
-rw-r--r-- | libsolidity/inlineasm/AsmParser.cpp | 13 | ||||
-rw-r--r-- | test/libsolidity/InlineAssembly.cpp | 12 |
3 files changed, 25 insertions, 1 deletions
diff --git a/Changelog.md b/Changelog.md index 8f1fe045..46a989ef 100644 --- a/Changelog.md +++ b/Changelog.md @@ -10,6 +10,7 @@ Features: Bugfixes: * Unused variable warnings no longer issued for variables used inside inline assembly. + * Inline Assembly: Enforce function arguments when parsing functional instructions. ### 0.4.11 (2017-05-03) diff --git a/libsolidity/inlineasm/AsmParser.cpp b/libsolidity/inlineasm/AsmParser.cpp index 68a9cb03..f9b073ba 100644 --- a/libsolidity/inlineasm/AsmParser.cpp +++ b/libsolidity/inlineasm/AsmParser.cpp @@ -174,6 +174,19 @@ assembly::Case Parser::parseCase() assembly::Statement Parser::parseExpression() { Statement operation = parseElementaryOperation(true); + if (operation.type() == typeid(Instruction)) + { + Instruction const& instr = boost::get<Instruction>(operation); + int args = instructionInfo(instr.instruction).args; + if (args > 0 && currentToken() != Token::LParen) + fatalParserError(string( + "Expected token \"(\" (\"" + + instructionNames().at(instr.instruction) + + "\" expects " + + boost::lexical_cast<string>(args) + + " arguments)" + )); + } if (currentToken() == Token::LParen) return parseCall(std::move(operation)); else diff --git a/test/libsolidity/InlineAssembly.cpp b/test/libsolidity/InlineAssembly.cpp index 435c3dad..7876b7ee 100644 --- a/test/libsolidity/InlineAssembly.cpp +++ b/test/libsolidity/InlineAssembly.cpp @@ -213,6 +213,16 @@ BOOST_AUTO_TEST_CASE(functional) BOOST_CHECK(successParse("{ let x := 2 add(7, mul(6, x)) mul(7, 8) add =: x }")); } +BOOST_AUTO_TEST_CASE(functional_partial) +{ + CHECK_PARSE_ERROR("{ let x := byte }", ParserError, "Expected token \"(\""); +} + +BOOST_AUTO_TEST_CASE(functional_partial_success) +{ + BOOST_CHECK(successParse("{ let x := byte(1, 2) }")); +} + BOOST_AUTO_TEST_CASE(functional_assignment) { BOOST_CHECK(successParse("{ let x := 2 x := 7 }")); @@ -258,7 +268,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("{ 1 2 switch mul default {} }", ParserError, "Instructions are not supported as expressions for switch."); + CHECK_PARSE_ERROR("{ switch calldatasize default {} }", ParserError, "Instructions are not supported as expressions for switch."); } BOOST_AUTO_TEST_CASE(switch_default_before_case) |