Stricter bounds for memory arrays.

This commit is contained in:
Daniel Kirchner 2020-04-16 17:51:18 +02:00
parent f6d1cee06b
commit 150497c12a
3 changed files with 31 additions and 2 deletions

View File

@ -1663,7 +1663,22 @@ BoolResult ArrayType::validForLocation(DataLocation _loc) const
{
case DataLocation::Memory:
{
bigint size = bigint(length()) * m_baseType->memoryHeadSize();
bigint size = bigint(length());
auto type = m_baseType;
while (auto arrayType = dynamic_cast<ArrayType const*>(type))
{
if (arrayType->isDynamicallySized())
break;
else
{
size *= arrayType->length();
type = arrayType->baseType();
}
}
if (type->isDynamicallySized())
size *= type->memoryHeadSize();
else
size *= type->memoryDataSize();
if (size >= numeric_limits<unsigned>::max())
return BoolResult::err("Type too large for memory.");
break;

View File

@ -0,0 +1,14 @@
contract C {
function f() public pure
{
bytes32[1263941234127518272][500] memory x;
uint[2**30][] memory y;
uint[2**30][2**30][] memory z;
uint[2**16][2**16][] memory w;
}
}
// ----
// TypeError: (48-90): Type too large for memory.
// TypeError: (96-118): Type too large for memory.
// TypeError: (124-153): Type too large for memory.
// TypeError: (159-188): Type too large for memory.

View File

@ -8,4 +8,4 @@ contract C {
// TypeError: (26-66): Type too large for memory.
// TypeError: (96-116): Type too large for memory.
// TypeError: (146-173): Type too large for memory.
// TypeError: (203-230): Type too large for calldata.
// TypeError: (203-230): Type too large for memory.