aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorchriseth <chris@ethereum.org>2018-02-22 21:42:52 +0800
committerGitHub <noreply@github.com>2018-02-22 21:42:52 +0800
commitca35963f84c73e6faec990ffe9d3f7a8d8a387c5 (patch)
tree56c85844ee5455cf35f33e6fcf35aea956836f9a
parentbb2a48e05cac2ce16f3b879025a0d9ca57c70e8a (diff)
parent42856e0f53c1cb9be61e9f24b9f09a7b0179cd55 (diff)
downloaddexon-solidity-ca35963f84c73e6faec990ffe9d3f7a8d8a387c5.tar.gz
dexon-solidity-ca35963f84c73e6faec990ffe9d3f7a8d8a387c5.tar.zst
dexon-solidity-ca35963f84c73e6faec990ffe9d3f7a8d8a387c5.zip
Merge pull request #3570 from ethereum/assembly-oversized-literals
Raise error on oversized number literals in assembly
-rw-r--r--Changelog.md1
-rw-r--r--libsolidity/inlineasm/AsmAnalysis.cpp13
-rw-r--r--test/libjulia/Parser.cpp1
-rw-r--r--test/libsolidity/InlineAssembly.cpp1
4 files changed, 16 insertions, 0 deletions
diff --git a/Changelog.md b/Changelog.md
index f25b138b..ad92c94a 100644
--- a/Changelog.md
+++ b/Changelog.md
@@ -6,6 +6,7 @@ Features:
* Type Checker: Disallow uninitialized storage pointers as experimental 0.5.0 feature.
Bugfixes:
+ * Assembly: Raise error on oversized number literals in assembly.
* JSON-AST: Add "documentation" property to function, event and modifier definition.
* Resolver: Properly determine shadowing for imports with aliases.
* Standalone Assembly: Do not ignore input after closing brace of top level block.
diff --git a/libsolidity/inlineasm/AsmAnalysis.cpp b/libsolidity/inlineasm/AsmAnalysis.cpp
index 2d6e58de..a05ac57d 100644
--- a/libsolidity/inlineasm/AsmAnalysis.cpp
+++ b/libsolidity/inlineasm/AsmAnalysis.cpp
@@ -82,6 +82,19 @@ bool AsmAnalyzer::operator()(assembly::Literal const& _literal)
);
return false;
}
+ else if (_literal.kind == assembly::LiteralKind::Number && bigint(_literal.value) > u256(-1))
+ {
+ m_errorReporter.typeError(
+ _literal.location,
+ "Number literal too large (> 256 bits)"
+ );
+ return false;
+ }
+ else if (_literal.kind == assembly::LiteralKind::Boolean)
+ {
+ solAssert(m_flavour == AsmFlavour::IULIA, "");
+ solAssert(_literal.value == "true" || _literal.value == "false", "");
+ }
m_info.stackHeightInfo[&_literal] = m_stackHeight;
return true;
}
diff --git a/test/libjulia/Parser.cpp b/test/libjulia/Parser.cpp
index 0a2dd815..ff9474c1 100644
--- a/test/libjulia/Parser.cpp
+++ b/test/libjulia/Parser.cpp
@@ -228,6 +228,7 @@ BOOST_AUTO_TEST_CASE(number_literals)
CHECK_ERROR("{ let x:u256 := .1:u256 }", ParserError, "Invalid number literal.");
CHECK_ERROR("{ let x:u256 := 1e5:u256 }", ParserError, "Invalid number literal.");
CHECK_ERROR("{ let x:u256 := 67.235:u256 }", ParserError, "Invalid number literal.");
+ CHECK_ERROR("{ let x:u256 := 0x1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff:u256 }", TypeError, "Number literal too large (> 256 bits)");
}
BOOST_AUTO_TEST_CASE(builtin_types)
diff --git a/test/libsolidity/InlineAssembly.cpp b/test/libsolidity/InlineAssembly.cpp
index 70620f78..45fb54f8 100644
--- a/test/libsolidity/InlineAssembly.cpp
+++ b/test/libsolidity/InlineAssembly.cpp
@@ -390,6 +390,7 @@ BOOST_AUTO_TEST_CASE(number_literals)
CHECK_PARSE_ERROR("{ let x := .1 }", ParserError, "Invalid number literal.");
CHECK_PARSE_ERROR("{ let x := 1e5 }", ParserError, "Invalid number literal.");
CHECK_PARSE_ERROR("{ let x := 67.235 }", ParserError, "Invalid number literal.");
+ CHECK_STRICT_ERROR("{ let x := 0x1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff }", TypeError, "Number literal too large (> 256 bits)");
}
BOOST_AUTO_TEST_CASE(function_definitions)