2022年9月5日,Solidity团队通过 差分Fuzzing 发现了 Solidity’s Yul 优化器 的Bug。
该Bug影响范围在 0.8.13 ≤ version < 0.8.17, 严重性为 中难度-高危害。
有solidity代码如下:
contract C {
uint public x;
function f(bool a) public {
x = 1; // This write is removed due to the bug.
g(a);
x = 2;
}
function g(bool a) internal {
if (a) return;
assembly { return(0,0) }
}
}
在预期情况下,调用f(false)
将使x变量值为1。
但有Bug的实际结果为0.
可见,该Bug使EVM 回退了 x = 1;
的Storage写入操作。
return(0,0)
或者 stop()
x = 2
即 写入一个 g函数调用之前曾写入( x = 1;
)的Storage。当IR优化器识别到了类似上图的控制流。会认为 x = 1
是废话,于是将其”优化掉”。
此处的“优化掉”,指Yul优化器的Unused Store Eliminator
步骤。Link
该步骤一般记作 S
, 用作删除【冗余】的Storage写操作。
一个Storage写操作如果符合以下任意条件,则判定为【冗余】
{
x = 1; // 这句就是冗余,会被优化掉。
x = 2;
}