diff options
author | bakaoh <tatattai@gmail.com> | 2018-08-30 11:08:49 +0800 |
---|---|---|
committer | bakaoh <tatattai@gmail.com> | 2018-09-05 11:54:38 +0800 |
commit | a7ffff6a2916a5e501d9a338a82811d53846b777 (patch) | |
tree | 33b5919cde05faa85bd2a4cfa1723d3585f0a2ef | |
parent | 410d288dfc2e08c42df58c7e01ad5c332ce92727 (diff) | |
download | dexon-solidity-a7ffff6a2916a5e501d9a338a82811d53846b777.tar dexon-solidity-a7ffff6a2916a5e501d9a338a82811d53846b777.tar.gz dexon-solidity-a7ffff6a2916a5e501d9a338a82811d53846b777.tar.bz2 dexon-solidity-a7ffff6a2916a5e501d9a338a82811d53846b777.tar.lz dexon-solidity-a7ffff6a2916a5e501d9a338a82811d53846b777.tar.xz dexon-solidity-a7ffff6a2916a5e501d9a338a82811d53846b777.tar.zst dexon-solidity-a7ffff6a2916a5e501d9a338a82811d53846b777.zip |
Fix #4716: Crash when array index value is too large
-rw-r--r-- | Changelog.md | 1 | ||||
-rw-r--r-- | libsolidity/analysis/TypeChecker.cpp | 9 | ||||
-rw-r--r-- | test/libsolidity/syntaxTests/types/array_index_too_large.sol | 8 |
3 files changed, 14 insertions, 4 deletions
diff --git a/Changelog.md b/Changelog.md index 1e16df59..dab1250e 100644 --- a/Changelog.md +++ b/Changelog.md @@ -111,6 +111,7 @@ Bugfixes: * Type Checker: Report error when using structs in events without experimental ABIEncoderV2. This used to crash or log the wrong values. * Type Checker: Report error when using indexed structs in events with experimental ABIEncoderV2. This used to log wrong values. * Type Checker: Dynamic types as key for public mappings return error instead of assertion fail. + * Type Checker: Fix internal error when array index value is too large. * Type System: Allow arbitrary exponents for literals with a mantissa of zero. ### 0.4.24 (2018-05-16) diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp index fca64f6a..3b1bfe5c 100644 --- a/libsolidity/analysis/TypeChecker.cpp +++ b/libsolidity/analysis/TypeChecker.cpp @@ -2211,12 +2211,13 @@ bool TypeChecker::visit(IndexAccess const& _access) else { expectType(*index, IntegerType(256)); - if (auto numberType = dynamic_cast<RationalNumberType const*>(type(*index).get())) - { - if (!numberType->isFractional()) // error is reported above + if (!m_errorReporter.hasErrors()) + if (auto numberType = dynamic_cast<RationalNumberType const*>(type(*index).get())) + { + solAssert(!numberType->isFractional(), ""); if (!actualType.isDynamicallySized() && actualType.length() <= numberType->literalValue(nullptr)) m_errorReporter.typeError(_access.location(), "Out of bounds array access."); - } + } } resultType = actualType.baseType(); isLValue = actualType.location() != DataLocation::CallData; diff --git a/test/libsolidity/syntaxTests/types/array_index_too_large.sol b/test/libsolidity/syntaxTests/types/array_index_too_large.sol new file mode 100644 index 00000000..06b5071f --- /dev/null +++ b/test/libsolidity/syntaxTests/types/array_index_too_large.sol @@ -0,0 +1,8 @@ +contract C { + function f() public returns (string memory) { + // this used to cause an internal error + return (["zeppelin"][123456789012345678901234567890123456789012345678901234567890123456789012345678]); + } +} +// ---- +// TypeError: (140-218): Type int_const 1234...(70 digits omitted)...5678 is not implicitly convertible to expected type uint256.
\ No newline at end of file |