Memory Safety Check Skill
Validate Mojo ownership and borrowing rules.
When to Use
- •Reviewing code for memory safety
- •Debugging memory or segfault issues
- •Before merging code
- •Performance testing reveals corruption
Quick Reference
mojo
# Owned parameter - takes ownership
fn consume(var data: Tensor):
process(data) # data moved here
# Borrowed parameter - read-only reference
fn read_only(data: Tensor):
let value = data[0] # OK: read-only
# Mutable reference - in-place modification
fn modify(mut data: Tensor):
data[0] = 42 # Mutate in caller's variable
Workflow
- •Trace ownership - Which function owns each value
- •Check borrows - Are references short-lived
- •Verify moves - Use
^operator for ownership transfer - •Test lifetimes - Compile and run with memory checks
- •Debug issues - Identify use-after-move or dangling refs
Mojo-Specific Notes
- •Use
^operator ONLY when transferring ownership - •
mut selffor mutating methods (NOTout self) - •
out selfONLY for constructors (__init__) - •List/Dict/String are non-copyable - must use
^when returning
Error Handling
| Error | Cause | Solution |
|---|---|---|
Use after move | Variable used after ownership transfer | Create copy or don't move |
Dangling reference | Reference to local variable | Return owned value with ^ |
Mutable aliasing | Multiple mutable refs to same data | Ensure single mutable reference |
Type not copyable | Missing ^ on non-copyable return | Add transfer operator ^ |
References
- •
.claude/shared/mojo-anti-patterns.md- Ownership violations section - •
.claude/shared/mojo-guidelines.md- Parameter conventions table