Integer overflow and underflow happen when numbers go beyond their allowed limits. This can cause wrong results or bugs in programs.
Integer overflow and underflow in Blockchain / Solidity
// Example in Solidity uint8 smallNumber = 255; smallNumber += 1; // causes overflow int8 negativeNumber = -128; negativeNumber -= 1; // causes underflow
Unsigned integers (like uint8) can only hold positive numbers and zero.
Signed integers (like int8) can hold positive and negative numbers.
uint8 x = 255; x += 1; // x becomes 0 due to overflow
int8 y = -128; y -= 1; // y becomes 127 due to underflow
uint256 balance = 1000; balance += 500; // safe addition if within limits
This Solidity contract shows integer overflow on a uint8 variable. The addOne function adds 1 to 255, causing overflow to 0 inside an unchecked block.
pragma solidity ^0.8.0; contract OverflowExample { uint8 public smallNumber = 255; function addOne() public { unchecked { smallNumber += 1; // overflow happens here } } function getNumber() public view returns (uint8) { return smallNumber; } }
Modern Solidity versions (0.8.0+) check for overflow by default and throw errors.
Using unchecked disables these checks and allows overflow/underflow.
Always be careful with unchecked math to avoid security risks.
Integer overflow happens when a number goes above its max limit and wraps around.
Integer underflow happens when a number goes below its min limit and wraps around.
In blockchain, these can cause bugs or security problems if not handled properly.
Practice
unsigned integer variable exceeds its maximum value?Solution
Step 1: Understand unsigned integer limits
Unsigned integers start at 0 and go up to a max value (like 2^256-1 in Solidity).Step 2: What happens when max is exceeded?
When the value goes above max, it wraps around to 0, causing integer overflow.Final Answer:
It wraps around to zero (integer overflow). -> Option AQuick Check:
Unsigned integer overflow = wrap to zero [OK]
- Thinking overflow throws an error automatically
- Assuming value becomes negative
- Believing value stays at max
balance?Solution
Step 1: Identify safe subtraction
To avoid underflow, subtract only if balance is greater than zero.Step 2: Check each option
if (balance > 0) { balance -= 1; } checks balance > 0 before subtracting, preventing underflow. The other options either subtract without checking first (allowing underflow) or add instead of subtracting.Final Answer:
if (balance > 0) { balance -= 1; } -> Option CQuick Check:
Check before subtracting prevents underflow [OK]
- Not checking before subtracting
- Using require after subtraction (too late)
- Adding instead of subtracting
uint8 x = 255; x += 1;
What is the value of
x after execution?Solution
Step 1: Understand uint8 max value
uint8 can hold values from 0 to 255. 255 is the max.Step 2: Add 1 to max value
Adding 1 causes overflow, wrapping value back to 0.Final Answer:
0 -> Option AQuick Check:
uint8 overflow wraps to 0 [OK]
- Expecting 256 (out of range)
- Expecting value to stay at 255
- Confusing with signed integers
count. What is the bug?function decrement(uint count) public pure returns (uint) {
count -= 1;
return count;
}Solution
Step 1: Analyze subtraction without check
The function subtracts 1 from count without checking if count is zero.Step 2: Understand underflow risk
If count is 0, subtracting 1 causes underflow, wrapping to max uint value.Final Answer:
Underflow if count is 0, wrapping to max uint. -> Option BQuick Check:
Subtracting 1 from 0 causes underflow [OK]
- Assuming no bug without checks
- Thinking Solidity throws error automatically
- Confusing underflow with negative return
uint256. You want to safely add tokens without overflow. Which approach is best?Solution
Step 1: Understand overflow risk in addition
Adding tokens can overflow uint256 max value, causing wraparound bugs.Step 2: Use SafeMath library
SafeMath's add function checks for overflow and reverts if it happens, preventing bugs.Step 3: Evaluate other options
Unchecked addition risks overflow. Subtracting first or converting to int256 does not prevent overflow safely.Final Answer:
Use SafeMath library's add function to check overflow. -> Option DQuick Check:
SafeMath add prevents overflow [OK]
- Using unchecked addition risking overflow
- Trying to subtract before adding
- Converting to signed int without checks
Ready to prove it?
Pass the test and this pattern moves unknown
