| name | checked-arithmetic |
| description | Use when writing Rust arithmetic on amounts or other quantities derived from external/user input — guard against silent overflow. |
Checked Arithmetic on User-Supplied Values
Rule
Any arithmetic where one or more operands originates from external input (transaction body, advice provider, user RPC, deserialized payload) must use checked or overflowing arithmetic and surface the overflow:
- Prefer
checked_add / checked_sub / checked_mul and return an error on None.
- Use
overflowing_add / widening_mul when you need the wrapping value and the overflow flag; then assert!(!overflow) (or branch) before using the result.
- Do not use the default
+, -, * operators on untrusted values in release builds — debug-only overflow checks are not enough.
Why
The default +, -, * operators wrap silently in release builds, so an overflow on a balance or amount yields a wrong value with no error. Checked and overflowing operations surface the overflow so it can be rejected.
Examples
let total = balance.checked_add(amount).ok_or(Error::Overflow)?;
let (product, overflow) = a.widening_mul(b);
if overflow { return Err(Error::Overflow); }
let total = balance + amount;