每个名称只报告第一个重复定义组: `reported.count(i)` 位于循环条件中,而不是循环体中
作者: Lokkw0510创建于 2026年8月26日更新于 2026年9月10日
标签bug :bug:low impact
□ 说明
当一个名称有不止一组重复定义时,只报告第一组. 其余的复制品被默默地从诊断中抛出.
libsolity/analysis/Contracting LevelChecker.cpp:239',载于Find Dreplex Definitions`:
翻译: 用于(大小 t i = 0; i < 超载量. smalls () * ! reported.count (i; ++i)
" 已报告 " 的指数为先前错误所覆盖的指数(总数为 " :260 " )。 测试
因为它坐落于 ** loop 条件**, 所以达到一个已经报告的指数 终止整个
而不是跳过这个指数 继续。
簿记本身表明这不是有意的:如果目标"第一站后停止"
报告,“bool”就够了。 维持指数的`std: set<size t}只有在以下情况下才有意义:
这些指数在以`i ' 为圆形时即刻被跳过,即这看起来像一个“i”指数。
" 继续 " 写成循环出口。
** 预计:** 每组重复一个错误。
** 实际:** 每个名字一个错误。
这是一个诊断性的完成问题 而不是一个健全的问题, 我建议分解它
就是这样。 指数0永远不能在 " 报告 " 中,因此,第一组总是报告和合同
包含复制件总是无法编译的 。 代价是
开发者修复一个复制,再编译,并发现下一个复制。
□ 环境
- 编译版本:0.8.36+承诺 8a079791(与当前`开发 ' 的同名字节;行)
日期为`d054a3b85',2018-11-29,移动时已用这种方式写出)
- 编译管道(遗留、IR、SSA CFG):所有——处于分析阶段,在编码之前
- 目标EVM版本(按编译器设置):默认(`osaka');不依赖EVM版本
- 框架/IDE(如创始人、Hardhat、Remix):`Solc'直接命令行
- EVM执行环境/后端/块链客户端:n/a——只编译时间
- 操作系统:macOS 26.5.2
□ 步骤重现
`poc.sol'——一个名称,两个独立的重复组:
团结
//SPDX-License-识别器:GPL-3.0
立体固态为0.8.0;
合同C {
函数 f( int) 公共 {}
函数 f( int) 公共 {}
函数 f( 字符串内存) 公共 QQ
函数 f( 字符串内存) 公共 QQ
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?索尔克 poc.sol** 预期:** 有两个错误——f(int)'有两次定义,而f(string)'有两次单独定义。
来源位置 。
** 实际:** 一个错误。
错误: 两次定义相同名称和参数类型的函数 。** 控制**——两个不同名称下相同的重复结构报告,因为每份 名称获得自己的 " 超载 " 矢量:
团结 合同C { 函数 f( int) 公共 {} 函数 f( int) 公共 {} 函数 g( 字符串内存) 函数 g( 字符串内存) {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
错误: 两次定义相同名称和参数类型的函数 。 错误: 两次定义相同名称和参数类型的函数 。
范围 :
QQ 源 出错 QQ 期望 QQ
. . . . . . .内容来源: argotorg/solidity