diff options
author | chriseth <chris@ethereum.org> | 2018-10-11 02:56:25 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-10-11 02:56:25 +0800 |
commit | 2feaacba9d02a1cc789873c8d58188055574c1bb (patch) | |
tree | 5a759e167dea1af7da5a0dcc569adc9a9ff9ba70 /libsolidity | |
parent | f33fc995586373807dcabfc0f6f1b5b0a3fe66e9 (diff) | |
parent | 763ae300233adb6650b6bc6d34c765f853960cd1 (diff) | |
download | dexon-solidity-2feaacba9d02a1cc789873c8d58188055574c1bb.tar.gz dexon-solidity-2feaacba9d02a1cc789873c8d58188055574c1bb.tar.zst dexon-solidity-2feaacba9d02a1cc789873c8d58188055574c1bb.zip |
Merge pull request #5195 from ethereum/unsigned-array-index
Do not crash on non-unsigned array index
Diffstat (limited to 'libsolidity')
-rw-r--r-- | libsolidity/analysis/TypeChecker.cpp | 7 | ||||
-rw-r--r-- | libsolidity/analysis/TypeChecker.h | 2 |
2 files changed, 6 insertions, 3 deletions
diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp index 5ffdda57..069be156 100644 --- a/libsolidity/analysis/TypeChecker.cpp +++ b/libsolidity/analysis/TypeChecker.cpp @@ -2316,7 +2316,8 @@ bool TypeChecker::visit(IndexAccess const& _access) m_errorReporter.typeError(_access.location(), "Index expression cannot be omitted."); else { - expectType(*index, IntegerType(256)); + if (!expectType(*index, IntegerType(256))) + m_errorReporter.fatalTypeError(_access.location(), "Index expression cannot be represented as an unsigned integer."); if (auto integerType = dynamic_cast<RationalNumberType const*>(type(*index).get())) if (bytesType.numBytes() <= integerType->literalValue(nullptr)) m_errorReporter.typeError(_access.location(), "Out of bounds array access."); @@ -2487,7 +2488,7 @@ Declaration const& TypeChecker::dereference(UserDefinedTypeName const& _typeName return *_typeName.annotation().referencedDeclaration; } -void TypeChecker::expectType(Expression const& _expression, Type const& _expectedType) +bool TypeChecker::expectType(Expression const& _expression, Type const& _expectedType) { _expression.accept(*this); if (!type(_expression)->isImplicitlyConvertibleTo(_expectedType)) @@ -2516,7 +2517,9 @@ void TypeChecker::expectType(Expression const& _expression, Type const& _expecte _expectedType.toString() + "." ); + return false; } + return true; } void TypeChecker::requireLValue(Expression const& _expression) diff --git a/libsolidity/analysis/TypeChecker.h b/libsolidity/analysis/TypeChecker.h index 8d25a88e..6ea99ca2 100644 --- a/libsolidity/analysis/TypeChecker.h +++ b/libsolidity/analysis/TypeChecker.h @@ -143,7 +143,7 @@ private: /// Runs type checks on @a _expression to infer its type and then checks that it is implicitly /// convertible to @a _expectedType. - void expectType(Expression const& _expression, Type const& _expectedType); + bool expectType(Expression const& _expression, Type const& _expectedType); /// Runs type checks on @a _expression to infer its type and then checks that it is an LValue. void requireLValue(Expression const& _expression); |