mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #5195 from ethereum/unsigned-array-index
Do not crash on non-unsigned array index
This commit is contained in:
commit
2feaacba9d
@ -126,6 +126,7 @@ Bugfixes:
|
||||
* 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 Checker: Fix internal error for array type conversions.
|
||||
* Type Checker: Fix internal error when array index is not an unsigned.
|
||||
* Type System: Allow arbitrary exponents for literals with a mantissa of zero.
|
||||
* Parser: Fix incorrect source location for nameless parameters.
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
||||
|
@ -0,0 +1,11 @@
|
||||
contract C {
|
||||
function f() public {
|
||||
bytes[32] memory a;
|
||||
a[8**90][8**90][8**90*0.1];
|
||||
}
|
||||
}
|
||||
// ----
|
||||
// TypeError: (67-72): Type int_const 1897...(74 digits omitted)...1424 is not implicitly convertible to expected type uint256.
|
||||
// TypeError: (74-79): Type int_const 1897...(74 digits omitted)...1424 is not implicitly convertible to expected type uint256.
|
||||
// TypeError: (81-90): Type rational_const 9485...(73 digits omitted)...5712 / 5 is not implicitly convertible to expected type uint256.
|
||||
// TypeError: (65-91): Index expression cannot be represented as an unsigned integer.
|
@ -0,0 +1,11 @@
|
||||
contract C {
|
||||
function f() public {
|
||||
bytes[32] memory a;
|
||||
a[8**90][8**90][1 - 8**90];
|
||||
}
|
||||
}
|
||||
// ----
|
||||
// TypeError: (67-72): Type int_const 1897...(74 digits omitted)...1424 is not implicitly convertible to expected type uint256.
|
||||
// TypeError: (74-79): Type int_const 1897...(74 digits omitted)...1424 is not implicitly convertible to expected type uint256.
|
||||
// TypeError: (81-90): Type int_const -189...(75 digits omitted)...1423 is not implicitly convertible to expected type uint256.
|
||||
// TypeError: (65-91): Index expression cannot be represented as an unsigned integer.
|
@ -0,0 +1,9 @@
|
||||
contract C {
|
||||
function f() public {
|
||||
bytes32 b;
|
||||
b[-1];
|
||||
}
|
||||
}
|
||||
// ----
|
||||
// TypeError: (58-60): Type int_const -1 is not implicitly convertible to expected type uint256.
|
||||
// TypeError: (56-61): Index expression cannot be represented as an unsigned integer.
|
@ -0,0 +1,9 @@
|
||||
contract C {
|
||||
function f() public {
|
||||
bytes32 b;
|
||||
b[888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888];
|
||||
}
|
||||
}
|
||||
// ----
|
||||
// TypeError: (58-169): Type int_const 8888...(103 digits omitted)...8888 is not implicitly convertible to expected type uint256.
|
||||
// TypeError: (56-170): Index expression cannot be represented as an unsigned integer.
|
Loading…
Reference in New Issue
Block a user