Merge pull request #5061 from ethereum/fixedSizeArrayLength

Disallow fixed-size arrays with zero length
This commit is contained in:
chriseth 2018-09-26 14:55:07 +02:00 committed by GitHub
commit 13cd7c3fed
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 38 additions and 2 deletions

View File

@ -84,6 +84,7 @@ Language Features:
* General: Allow ``mapping`` storage pointers as arguments and return values in all internal functions.
* General: Allow ``struct``s in interfaces.
* General: Provide access to the ABI decoder through ``abi.decode(bytes memory data, (...))``.
* General: Disallow zero length for fixed-size arrays.
* Parser: Accept the ``address payable`` type during parsing.
Compiler Features:
@ -101,6 +102,7 @@ Bugfixes:
* Tests: Fix chain parameters to make ipc tests work with newer versions of cpp-ethereum.
* Code Generator: Fix allocation of byte arrays (zeroed out too much memory).
* Code Generator: Properly handle negative number literals in ABIEncoderV2.
* Code Generator: Do not crash on using a length of zero for multidimensional fixed-size arrays.
* Commandline Interface: Correctly handle paths with backslashes on windows.
* Fix NatSpec json output for `@notice` and `@dev` tags on contract definitions.
* Optimizer: Correctly estimate gas costs of constants for special cases.

View File

@ -222,6 +222,8 @@ Variables
* Detecting cyclic dependencies in variables and structs is limited in
recursion to 256.
* Fixed-size arrays with a length of zero are now disallowed.
Syntax
------

View File

@ -246,6 +246,8 @@ void ReferencesResolver::endVisit(ArrayTypeName const& _typeName)
RationalNumberType const* lengthType = dynamic_cast<RationalNumberType const*>(lengthTypeGeneric.get());
if (!lengthType || !lengthType->mobileType())
fatalTypeError(length->location(), "Invalid array length, expected integer literal or constant expression.");
else if (lengthType->isZero())
fatalTypeError(length->location(), "Array with zero length specified.");
else if (lengthType->isFractional())
fatalTypeError(length->location(), "Array with fractional length specified.");
else if (lengthType->isNegative())

View File

@ -0,0 +1,15 @@
contract C {
function a() public pure returns(int[0][500] memory) {}
function b() public pure returns(uint[0][500] memory) {}
function c() public pure returns(byte[0][500] memory) {}
function d() public pure returns(bytes32[0][500] memory) {}
function e() public pure returns(bytes[0][500] memory) {}
function e() public pure returns(string[0][500] memory) {}
}
// ----
// TypeError: (52-53): Array with zero length specified.
// TypeError: (111-112): Array with zero length specified.
// TypeError: (170-171): Array with zero length specified.
// TypeError: (232-233): Array with zero length specified.
// TypeError: (292-293): Array with zero length specified.
// TypeError: (353-354): Array with zero length specified.

View File

@ -0,0 +1,15 @@
contract C {
int[0] a;
uint[0] b;
byte[0] c;
bytes32[0] d;
bytes[0] e;
string[0] f;
}
// ----
// TypeError: (19-20): Array with zero length specified.
// TypeError: (32-33): Array with zero length specified.
// TypeError: (45-46): Array with zero length specified.
// TypeError: (61-62): Array with zero length specified.
// TypeError: (75-76): Array with zero length specified.
// TypeError: (90-91): Array with zero length specified.

View File

@ -21,5 +21,5 @@ contract C {
uint[((2) + 1) + 1] a12;
uint[(2 + 1) + ((1))] a13;
uint[(((2) + 1)) + (((1)))] a14;
uint[((((2) + 1)) + (((1))))%1] a15;
uint[((((3) + 1)) + (((1))))%2] a15;
}

View File

@ -1,6 +1,6 @@
contract c {
uint[10] a;
uint[] a2;
struct x { uint[2**20] b; y[0] c; }
struct x { uint[2**20] b; y[1] c; }
struct y { uint d; mapping(uint=>x)[] e; }
}