清理变量¶
当一个值短于256位时,在某些情况下,剩余位必须被清理。 Solidity 编译器在设计时,会在操作数据之前清理这些剩余位,以避免剩余位中潜在垃圾数据在操作产生任何不利影响。
例如,在将一个值写入存储器之前,需要清除剩余的位,因为存储器的内容可以用于计算哈希值或作为消息调用的数据发送。 同样,在将一个值存储到存储器中之前,也需要清除剩余的位,因为否则可以观察到垃圾数据。
注意,通过内联汇编的访问数据没有此操作。 如果使用内联汇编来访问短于256位的Solidity变量,编译器不保证该值被正确清理。
此外,如果紧接着的操作不受影响,就不会清理位。 例如,由于任何非零值都会被 JUMPI
指令认为是 true
,所以在布尔值被用作条件判断之前,不需要清理它们。
JUMPI
。
除了上述设计原则外,Solidity 编译器也会在将输入数据(input data)加载到堆栈时,会对其进行清理。
不同的类型有不同的清理无效值的规则:
Type |
Valid Values |
Invalid Values Mean |
---|---|---|
enum of n members |
0 until n - 1 |
exception |
bool |
0 or 1 |
1 |
signed integers |
sign-extended word |
currently silently wraps; in the future exceptions will be thrown |
unsigned integers |
higher bits zeroed |
currently silently wraps; in the future exceptions will be thrown |