# Key semantics of std.debug.assert

**URL:** <https://ziggit.dev/t/key-semantics-of-std-debug-assert/11123>\
**Category:** Explain\
**Created:** [July 21, 2025, 8:25pm UTC](https://ziggit.dev/t/key-semantics-of-std-debug-assert/11123 "2025-07-21T20:25:44Z")\
**Posts on this page:** 1\
**Showing post:** 9

<div class="post-metadata">

**Author:** ![andrewrk](https://ziggit.dev/user_avatar/ziggit.dev/andrewrk/32/7011_2.png) [@andrewrk](https://ziggit.dev/u/andrewrk)\
**Post date:** [July 21, 2025, 10:10pm UTC](https://ziggit.dev/t/key-semantics-of-std-debug-assert/11123/9 "2025-07-21T22:10:01Z")

</div>

This is completely unrelated to LLVM. Side effects are 100% well-defined in the Zig language.

Examples of _Not_ side effects:

- calling a function
- loading from memory
- storing to memory
- inline assembly
- atomics
- `unreachable` in unsafe optimization modes
- everything not in the following list

Complete, exhaustive list of all side effects:

- loading through a `volatile` pointer
- storing through a `volatile` pointer
- inline assembly with `volatile` keyword
- atomics with `volatile` pointers
- calling an extern function
- `@panic`, `@trap`, `@breakpoint`
- `unreachable` in safe optimization modes (equivalent to `@panic`)

---

_[View the full topic](https://ziggit.dev/t/key-semantics-of-std-debug-assert/11123)._
