From 71669f3b63a563208a7a5450113c9356406ca98e Mon Sep 17 00:00:00 2001 From: aniket-engg Date: Mon, 14 Oct 2019 17:43:54 +0530 Subject: [PATCH] loop over dynamic array length will show warning --- .../modules/forLoopIteratesOverDynamicArray.js | 5 ++--- .../solidity-analyzer/modules/staticAnalysisCommon.js | 10 ++++++++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/remix-analyzer/src/solidity-analyzer/modules/forLoopIteratesOverDynamicArray.js b/remix-analyzer/src/solidity-analyzer/modules/forLoopIteratesOverDynamicArray.js index 3de397a85e..fdf00db5a5 100644 --- a/remix-analyzer/src/solidity-analyzer/modules/forLoopIteratesOverDynamicArray.js +++ b/remix-analyzer/src/solidity-analyzer/modules/forLoopIteratesOverDynamicArray.js @@ -8,9 +8,8 @@ function forLoopIteratesOverDynamicArray () { } forLoopIteratesOverDynamicArray.prototype.visit = function (node) { - if (common.isForLoop(node) && - node.children[1].children[1].attributes.member_name === 'length' && - node.children[1].children[1].children[0].attributes.type.indexOf('[]') !== -1) { + if (common.isForLoop(node) && (common.isDynamicArrayLengthAccess(node.children[1].children[1]) || + (node.children[1].children[1].children && common.isDynamicArrayLengthAccess(node.children[1].children[1].children[0])))) { this.relevantNodes.push(node) } } diff --git a/remix-analyzer/src/solidity-analyzer/modules/staticAnalysisCommon.js b/remix-analyzer/src/solidity-analyzer/modules/staticAnalysisCommon.js index a5deed52a4..77dc8dfbc4 100644 --- a/remix-analyzer/src/solidity-analyzer/modules/staticAnalysisCommon.js +++ b/remix-analyzer/src/solidity-analyzer/modules/staticAnalysisCommon.js @@ -517,6 +517,15 @@ function isDynamicArrayAccess (node) { return node && nodeType(node, exactMatch(nodeTypes.IDENTIFIER)) && (node.attributes.type.endsWith('[] storage ref') || node.attributes.type === 'bytes storage ref' || node.attributes.type === 'string storage ref') } +/** + * True if node accesses 'length' member of array + * @node {ASTNode} node to check for + * @return {bool} + */ +function isDynamicArrayLengthAccess (node) { + return node && nodeType(node, exactMatch(nodeTypes.MEMBERACCESS)) && (node.attributes.member_name === 'length') && node.children[0].attributes.type.indexOf('[]') !== -1 +} + /** * True if node is a delete instruction for an element from a dynamic array * @node {ASTNode} node to check for @@ -1111,6 +1120,7 @@ module.exports = { isAbiNamespaceCall: isAbiNamespaceCall, isSpecialVariableAccess: isSpecialVariableAccess, isDynamicArrayAccess: isDynamicArrayAccess, + isDynamicArrayLengthAccess: isDynamicArrayLengthAccess, isIndexAccess: isIndexAccess, isMappingIndexAccess: isMappingIndexAccess, isSubScopeWithTopLevelUnAssignedBinOp: isSubScopeWithTopLevelUnAssignedBinOp,