From a579961ac229de25230a58cc50df80b68a33fd7e Mon Sep 17 00:00:00 2001 From: cgewecke Date: Tue, 5 Jan 2021 16:21:30 -0800 Subject: [PATCH] Allow duplicate modifiers on same function --- lib/injector.js | 5 ++++- .../modifiers/duplicate-mods-same-fn.sol | 15 +++++++++++++++ test/units/modifiers.js | 17 +++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 test/sources/solidity/contracts/modifiers/duplicate-mods-same-fn.sol diff --git a/lib/injector.js b/lib/injector.js index a2215a06..5346c00b 100644 --- a/lib/injector.js +++ b/lib/injector.js @@ -3,6 +3,7 @@ const web3Utils = require("web3-utils"); class Injector { constructor(){ this.hashCounter = 0; + this.modifierCounter = 0; this.modifiers = {}; } @@ -353,11 +354,13 @@ class Injector { } injectModifier(contract, fileName, injectionPoint, injection, instrumentation){ + this.modifierCounter++; + const type = 'modifier'; const contractId = `${fileName}:${injection.contractName}`; const modifierId = `${fileName}:${injection.contractName}:` + `${injection.modifierName}:${injection.fnId}:` + - `${injection.condition}`; + `${injection.condition}:${this.modifierCounter}`; const { start, diff --git a/test/sources/solidity/contracts/modifiers/duplicate-mods-same-fn.sol b/test/sources/solidity/contracts/modifiers/duplicate-mods-same-fn.sol new file mode 100644 index 00000000..e1773943 --- /dev/null +++ b/test/sources/solidity/contracts/modifiers/duplicate-mods-same-fn.sol @@ -0,0 +1,15 @@ +pragma solidity ^0.7.0; + +contract Test { + modifier m(string memory val) { + _; + } + + function a() + m('ETH') + m('BTC') + public + { + uint x = 5; + } +} diff --git a/test/units/modifiers.js b/test/units/modifiers.js index d41aa0b7..4ff0420c 100644 --- a/test/units/modifiers.js +++ b/test/units/modifiers.js @@ -216,6 +216,23 @@ describe('modifiers', () => { }); }); + it('should cover when same modifier is invoked twice on same fn', async function() { + const mapping = await setupAndRun('modifiers/duplicate-mods-same-fn'); + + assert.deepEqual(mapping[util.filePath].l, { + "5":2,"13":1 + }); + assert.deepEqual(mapping[util.filePath].b, { + "1":[1,0],"2":[1,0] + }); + assert.deepEqual(mapping[util.filePath].s, { + 1: 1 + }); + assert.deepEqual(mapping[util.filePath].f, { + 1: 2, 2: 1 + }); + }); + it('should *not* treat constructor inheritance invocations as branches', async function() { const mapping = await setupAndRun('modifiers/constructor'); assert.deepEqual(mapping[util.filePath].b, {});