---
# System prepended metadata

title: 'Open Discussion: SafeMath by Default'

---

# Open Discussion: SafeMath by Default

*These are collaborative notes from the open discussion round about "SafeMath by Default" at the [Solidity Summit 2020](https://solidity-summit.ethereum.org/).*


Slides: https://chriseth.github.io/notes/talks/solidity_summit_2020/safeMath_by_default/

Issue: https://github.com/ethereum/solidity/issues/8467

## Have or not have at all?

Pros:
- Having it in the language means immediate updates. No need to wait for frameworks like `OpenZeppelin`.
- Lots of people use it anyway.

Cons:
- Introduces new semantics for the existing syntax.
- Having to use `SafeMath` makes people aware that overflows are possible.

mrchico: maybe use different type?
    (ekpyron: relates to the idea of general number range types https://github.com/ethereum/solidity/issues/2918)
    

Sean Young: Proposal - have `.add()` be unchecked and `+` be checked. `unchecked` regions are not very granular.

Miguel: Developers should be able to decide if they want to use built-in safe math or not.
chriseth: Doing it as a compiler flag could silently break the code depending on whether it's used or not. A pragma would be better.

## "invalid" or "revert"?

compiler-generated revert error message would not be useful to users, because it is just a generic "overflow" message

## Granularity of "unchecked" regions?

There seems to be interest in mixing checked and unchecked arithmetic within the same statement.

Random syntax suggestions for inline expressions:
 - Safe versions: + - * / ^ Unsafe versions: ⊕ ⊖ ⊗ ⊘ ? (but concerns are raised against non-ascii source constructs)
 - Safe versions: + - * / ^ Unsafe versions: (+) (-) (*) (/) (^)
 - +u -u *u /u ^u
 - unchecked{x + y} * z   (but then we also need "checked{}", right?)
 - unchecked(x + y) * z


## What about out-of-bounds values prior to arithmetics (e.g. through inline assembly)?

## Opt-in or opt-out

On gitter preference seems to be somewhat balanced between the two.