crates/lint/docs/costly-loop.md
Severity: Gas
ID: costly-loop
Flags storage variable writes inside loops. Each SSTORE costs at least 2,900 gas (warm) or 20,000 gas (cold), so writing to storage on every loop iteration can be extremely expensive. Accumulating the result in a local memory variable and writing to storage once after the loop is the standard optimization.
Reports assignments, compound assignments, increments/decrements, and delete expressions that
directly write to a storage variable inside any for, while, or do-while loop body, including
writes through storage array indices and mapping keys.
SSTORE is one of the most expensive EVM opcodes. Writing to storage in a loop multiplies that cost by the number of iterations and can easily cause transactions to run out of gas or become economically impractical.
contract C {
uint256 public counter;
function bad(uint256 n) external {
for (uint256 i = 0; i < n; i++) {
counter++; // costly-loop: SSTORE on every iteration
}
}
}
contract C {
uint256 public counter;
function good(uint256 n) external {
uint256 local = counter;
for (uint256 i = 0; i < n; i++) {
local++;
}
counter = local; // single SSTORE after the loop
}
}
This is a Gas-severity lint and is not applied to test or script files.