{"content":{"title":"Solidity0.8.22 循环不检查溢出","body":"# 更新速览\r\n- unchecked循环\r\n- Yul优化器调整，以重新生成零字面量\r\n- 导入 EVM 汇编 JSON 的支持(实验性)\r\n- 文件级别定义事件\r\n# unchecked循环\r\n\r\n在0.8.22版本的更新中，我注意到有一个备受争议的更新，即在循环场景下不再进行溢出检查。 \r\n接下来，我们将详细讨论一下这个循环不检查溢出的设计机制。\r\n## 为什么要这么设计\r\n1. 减少循环溢出检查所消耗的gas\r\n2. 大部分循环场景都在一定范围内进行条件判断，可以有效避免溢出的可能性\r\n3. 代码更易读\r\n## 不检查溢出的满足条件\r\n满足unchecked循环的条件如下：\r\n1. 比较运算符：循环条件是形如 `i < ...` 的比较， 不能是<=或者其他的比较运算符。\r\n2. 隐式转换：`i<...`比较运算中，右侧类型必须可以隐式的转换成循环计数器i的类型\r\n```\r\n\t// 不能转换，所以必须检查溢出\r\n\tfor (uint8 i = 0; i < uint16(1000); ++i) {\r\n    \r\n    }\r\n```\r\n3. 内置整型类型：`i<...`,i必须是内置的整型类型\r\n4. 递增：i++或++i\r\n5. 不能修改：`i<...`，i不能再循环条件或循环体中修改\r\n## 如何禁止这个优化\r\n在标准JSON输入中，将`settings.optimizer.details.simpleCounterForLoopUncheckedIncrement`设置为`false`，以关闭这个优化。\r\n\r\n\r\n# 扩展阅读 \r\n[Release Version 0.8.22 · ethereum/solidity · GitHub](https://github.com/ethereum/solidity/releases/tag/v0.8.22)"},"author":{"user":"https://learnblockchain.cn/people/13687","address":null},"history":null,"timestamp":1698724557,"version":1}