diff --git a/remix-analyzer/src/solidity-analyzer/modules/etherTransferInLoop.js b/remix-analyzer/src/solidity-analyzer/modules/etherTransferInLoop.js index 75330db333..dd8527f04d 100644 --- a/remix-analyzer/src/solidity-analyzer/modules/etherTransferInLoop.js +++ b/remix-analyzer/src/solidity-analyzer/modules/etherTransferInLoop.js @@ -8,8 +8,12 @@ function etherTransferInLoop () { } etherTransferInLoop.prototype.visit = function (node) { - if (common.isLoop(node) && common.isTransfer(node)) { - this.relevantNodes.push(node) + if (common.isLoop(node)) { + var loopBlockStartIndex = common.getLoopBlockStartIndex() + var transferNodes = node.children[loopBlockStartIndex].children.filter(node => (common.isExpressionStatement(node) && common.isTransfer(node))) + if (transferNodes.length > 0) { + this.relevantNodes.push(...transferNodes) + } } } diff --git a/remix-analyzer/src/solidity-analyzer/modules/staticAnalysisCommon.js b/remix-analyzer/src/solidity-analyzer/modules/staticAnalysisCommon.js index 55bb227888..70333abd82 100644 --- a/remix-analyzer/src/solidity-analyzer/modules/staticAnalysisCommon.js +++ b/remix-analyzer/src/solidity-analyzer/modules/staticAnalysisCommon.js @@ -410,6 +410,16 @@ function getUnAssignedTopLevelBinOps (subScope) { return subScope.children.filter(isBinaryOpInExpression) } +function getLoopBlockStartIndex (node) { + if (isLoop(node)) { + if (nodeType(node, exactMatch(nodeTypes.FORSTATEMENT))) { + return 3 // For 'for' loop + } else { + return 1 // For 'while' and 'do-while' loop + } + } +} + // #################### Trivial Node Identification function isFunctionDefinition (node) { @@ -1084,6 +1094,7 @@ module.exports = { getFunctionOrModifierDefinitionParameterPart: getFunctionOrModifierDefinitionParameterPart, getFunctionOrModifierDefinitionReturnParameterPart: getFunctionOrModifierDefinitionReturnParameterPart, getUnAssignedTopLevelBinOps: getUnAssignedTopLevelBinOps, + getLoopBlockStartIndex: getLoopBlockStartIndex, // #################### Complex Node Identification isDeleteOfDynamicArray: isDeleteOfDynamicArray,