TypeChecker: reject zero-length static array element types#16718
Open
genisis0x wants to merge 1 commit into
Open
TypeChecker: reject zero-length static array element types#16718genisis0x wants to merge 1 commit into
genisis0x wants to merge 1 commit into
Conversation
DeclarationTypeChecker::endVisit(ArrayTypeName) rejects `uint256[0]` (and similar) with TypeError 1406 "Array with zero length specified.", but that visitor only runs for ArrayTypeName declarations. Static array types written as expressions — e.g. inside `abi.decode((uint256[0][]))` — are constructed in TypeChecker::visit(IndexAccess) through the TypeType branch, which never validated the literal length. The zero-length type then propagated to codegen and triggered an ICE in ABIFunctions::abiDecodingFunctionArrayAvailableLength (and other callers that assume `calldataStride() > 0`). Apply the same rejection here as a fatal type error so the existing 1406 diagnostic is the only message users see and codegen is never reached with a zero-length element type. Fixes argotorg#16627
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
`DeclarationTypeChecker::endVisit(ArrayTypeName)` rejects `uint256[0]` (and similar) with TypeError 1406 "Array with zero length specified.", but that visitor only runs for ArrayTypeName declarations. Static array types written as expressions — e.g. inside `abi.decode((uint256[0][]))` — are constructed in `TypeChecker::visit(IndexAccess)` through the TypeType branch, which never validated the literal length. The zero-length type then propagated to codegen and triggered an ICE in `ABIFunctions::abiDecodingFunctionArrayAvailableLength` (and other callers that assume `calldataStride() > 0`).
Apply the same rejection here as a fatal type error so the existing 1406 diagnostic is the only message users see and codegen is never reached with a zero-length element type.
Fixes #16627
Test plan