清除变量
当值小于256位时,在某些情况下,必须清除剩余的位。Solidity编译器的设计目的是在任何可能受到剩余位中潜在垃圾的不利影响的操作之前清除这些剩余位。例如,在将值写入内存之前,需要清除剩余的位,因为内存内容可用于计算哈希或作为消息调用的数据发送。类似地,在将一个值存储在存储器中之前,需要清除剩余的位,因为否则可以观察到乱码的值。
请注意,通过内联程序集进行访问不被视为此类操作:如果使用内联程序集访问长度小于256位的实心变量,编译器不保证该值被正确清除。
此外,如果紧随其后的操作不受影响,我们不会清除这些位。例如,由于考虑任何非零值 true
通过 JUMPI
指令,则在将布尔值用作 JUMPI
。
除了上面的设计原则之外,solidity编译器在将输入数据加载到堆栈时会清除输入数据。
不同类型具有不同的清除无效值的规则:
类型 |
有效值 |
无效值的平均值 |
---|---|---|
n个成员的枚举 |
0到n-1 |
例外 |
布尔 |
0或1 |
1 |
有符号整数 |
符号扩展字 |
当前自动包装;将来将引发异常 |
无符号整数 |
高位归零 |
当前自动包装;将来将引发异常 |