mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			112 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
.. index: variable cleanup
 | 
						|
 | 
						|
*********************
 | 
						|
Cleaning Up Variables
 | 
						|
*********************
 | 
						|
 | 
						|
Ultimately, all values in the EVM are stored in 256 bit words.
 | 
						|
Thus, in some cases, when the type of a value has less than 256 bits,
 | 
						|
it is necessary to clean the remaining bits.
 | 
						|
The Solidity compiler is designed to do such cleaning before any operations
 | 
						|
that might be adversely affected by the potential garbage in the remaining bits.
 | 
						|
For example, before writing a value to  memory, the remaining bits need
 | 
						|
to be cleared because the memory contents can be used for computing
 | 
						|
hashes or sent as the data of a message call.  Similarly, before
 | 
						|
storing a value in the storage, the remaining bits need to be cleaned
 | 
						|
because otherwise the garbled value can be observed.
 | 
						|
 | 
						|
Note that access via inline assembly is not considered such an operation:
 | 
						|
If you use inline assembly to access Solidity variables
 | 
						|
shorter than 256 bits, the compiler does not guarantee that
 | 
						|
the value is properly cleaned up.
 | 
						|
 | 
						|
Moreover, we do not clean the bits if the immediately
 | 
						|
following operation is not affected.  For instance, since any non-zero
 | 
						|
value is considered ``true`` by ``JUMPI`` instruction, we do not clean
 | 
						|
the boolean values before they are used as the condition for
 | 
						|
``JUMPI``.
 | 
						|
 | 
						|
In addition to the design principle above, the Solidity compiler
 | 
						|
cleans input data when it is loaded onto the stack.
 | 
						|
 | 
						|
The following table describes the cleaning rules applied to different types,
 | 
						|
where ``higher bits`` refers to the remaining bits in case the type has less than 256 bits.
 | 
						|
 | 
						|
+---------------+---------------+-------------------------+
 | 
						|
|Type           |Valid Values   |Cleanup of Invalid Values|
 | 
						|
+===============+===============+=========================+
 | 
						|
|enum of n      |0 until n - 1  |throws exception         |
 | 
						|
|members        |               |                         |
 | 
						|
+---------------+---------------+-------------------------+
 | 
						|
|bool           |0 or 1         |results in 1             |
 | 
						|
+---------------+---------------+-------------------------+
 | 
						|
|signed integers|higher bits    |currently silently       |
 | 
						|
|               |set to the     |signextends to a valid   |
 | 
						|
|               |sign bit       |value, i.e. all higher   |
 | 
						|
|               |               |bits are set to the sign |
 | 
						|
|               |               |bit; may throw an        |
 | 
						|
|               |               |exception in the future  |
 | 
						|
+---------------+---------------+-------------------------+
 | 
						|
|unsigned       |higher bits    |currently silently masks |
 | 
						|
|integers       |zeroed         |to a valid value, i.e.   |
 | 
						|
|               |               |all higher bits are set  |
 | 
						|
|               |               |to zero; may throw an    |
 | 
						|
|               |               |exception in the future  |
 | 
						|
+---------------+---------------+-------------------------+
 | 
						|
 | 
						|
Note that valid and invalid values are dependent on their type size.
 | 
						|
Consider ``uint8``, the unsigned 8-bit type, which has the following valid values:
 | 
						|
 | 
						|
.. code-block:: none
 | 
						|
 | 
						|
    0000...0000 0000 0000
 | 
						|
    0000...0000 0000 0001
 | 
						|
    0000...0000 0000 0010
 | 
						|
    ....
 | 
						|
    0000...0000 1111 1111
 | 
						|
 | 
						|
Any invalid value will have the higher bits set to zero:
 | 
						|
 | 
						|
.. code-block:: none
 | 
						|
 | 
						|
    0101...1101 0010 1010   invalid value
 | 
						|
    0000...0000 0010 1010   cleaned value
 | 
						|
 | 
						|
For ``int8``, the signed 8-bit type, the valid values are:
 | 
						|
 | 
						|
Negative
 | 
						|
 | 
						|
.. code-block:: none
 | 
						|
 | 
						|
    1111...1111 1111 1111
 | 
						|
    1111...1111 1111 1110
 | 
						|
    ....
 | 
						|
    1111...1111 1000 0000
 | 
						|
 | 
						|
Positive
 | 
						|
 | 
						|
.. code-block:: none
 | 
						|
 | 
						|
    0000...0000 0000 0000
 | 
						|
    0000...0000 0000 0001
 | 
						|
    0000...0000 0000 0010
 | 
						|
    ....
 | 
						|
    0000...0000 1111 1111
 | 
						|
 | 
						|
The compiler will ``signextend`` the sign bit, which is 1 for negative and 0 for
 | 
						|
positive values, overwriting the higher bits:
 | 
						|
 | 
						|
Negative
 | 
						|
 | 
						|
.. code-block:: none
 | 
						|
 | 
						|
    0010...1010 1111 1111   invalid value
 | 
						|
    1111...1111 1111 1111   cleaned value
 | 
						|
 | 
						|
Positive
 | 
						|
 | 
						|
.. code-block:: none
 | 
						|
 | 
						|
    1101...0101 0000 0100   invalid value
 | 
						|
    0000...0000 0000 0100   cleaned value
 |