К основному содержанию
скилл CX Codex

rust-sanitizers-miri — скилл для Claude Code

Настраивает проверку unsafe-кода в Rust через Miri и санитайзеры LLVM. Помогает найти неопределённое поведение и гонки данных до релиза.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add mohitmishra786/low-level-dev-skills --skill rust-sanitizers-miri -a claude-code
Открыть на GitHub

Что делает rust-sanitizers-miri

Скилл даёт ассистенту инструкции по запуску AddressSanitizer, ThreadSanitizer, MemorySanitizer и UBSan для Rust-проектов. Он содержит готовые команды сборки через RUSTFLAGS с флагом -Zbuild-std для пересборки стандартной библиотеки, а также шаблоны расшифровки отчётов об ошибках памяти вроде heap-buffer-overflow.

Вторая часть инструкций посвящена интерпретатору Miri. Скилл объясняет, как запустить cargo +nightly miri test, настроить переменные MIRIFLAGS для проверки строгого происхождения указателей через -Zmiri-strict-provenance и отключить изоляцию для работы с системным временем или файлами.

Санитайзеры и Miri требуют установленный тулчейн nightly вместе с компонентом rust-src, поэтому на стабильном Rust напрямую они работать не будут.

Какие задачи решает

  • найти утечки памяти и выходы за границы буфера через AddressSanitizer
  • обнаружить гонки данных в многопоточном коде с помощью ThreadSanitizer
  • проверить корректность работы с сырыми указателями и правила заимствования в Miri
  • расшифровать стек вызовов из отчёта ASan при сбое в unsafe-блоке

Примеры запросов агенту

  • Запусти тесты моего крейта под Miri с отключённой изоляцией
  • Помоги собрать тесты с AddressSanitizer и найди причину heap-buffer-overflow в логе
  • Как добавить проверку ThreadSanitizer для многопоточного модуля в GitHub Actions?

Как установить rust-sanitizers-miri

1Через Skills CLI (Vercel)

npx skills add mohitmishra786/low-level-dev-skills --skill rust-sanitizers-miri -a claude-code

2Вручную: положить файлы

~/.claude/skills/rust-sanitizers-miri/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/rust-sanitizers-miri/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о rust-sanitizers-miri

Как установить rust-sanitizers-miri в Claude Code?

Выполните в терминале команду npx skills add mohitmishra786/low-level-dev-skills --skill rust-sanitizers-miri -a claude-code.

Что делает скилл rust-sanitizers-miri?

Он обучает ассистента запускать санитайзеры LLVM и интерпретатор Miri для поиска ошибок памяти и гонок данных в коде на Rust.

Можно ли запускать эти проверки на stable Rust?

Для полноценной работы санитайзеров и Miri требуется nightly-компилятор с флагом -Zbuild-std. На стабильном канале исходники предлагают использовать утилиту cargo-sanitize или запускать тесты в Docker-контейнере.

Исходный текст

SKILL.md · MIT
---
name: rust-sanitizers-miri
description: Rust sanitizers and Miri skill for memory safety validation. Use when running AddressSanitizer or ThreadSanitizer on Rust code, interpreting sanitizer reports, using Miri to detect undefined behaviour in unsafe Rust, or validating unsafe code correctness. Activates on queries about Rust ASan, Rust TSan, Miri, RUSTFLAGS sanitize, cargo miri, unsafe Rust UB, or interpreting Rust sanitizer output.
---

# Rust Sanitizers and Miri

## Purpose

Guide agents through runtime safety validation for Rust: ASan/TSan/MSan/UBSan via RUSTFLAGS, Miri for compile-time UB detection in unsafe code, and interpreting sanitizer reports.

## Triggers

- "How do I run AddressSanitizer on Rust code?"
- "How do I use Miri to check my unsafe Rust?"
- "How do I run ThreadSanitizer on a Rust program?"
- "My unsafe Rust might have UB — how do I detect it?"
- "How do I interpret a Rust ASan report?"
- "Can I run Rust sanitizers on stable?"

## Workflow

### 1. Sanitizers in Rust (nightly required)

Rust sanitizers require nightly and a compatible platform:

```bash
# Install nightly
rustup toolchain install nightly
rustup component add rust-src --toolchain nightly

# AddressSanitizer (Linux, macOS)
RUSTFLAGS="-Z sanitizer=address" \
    cargo +nightly test -Zbuild-std \
    --target x86_64-unknown-linux-gnu

# ThreadSanitizer (Linux)
RUSTFLAGS="-Z sanitizer=thread" \
    cargo +nightly test -Zbuild-std \
    --target x86_64-unknown-linux-gnu

# MemorySanitizer (Linux, requires all-instrumented build)
RUSTFLAGS="-Z sanitizer=memory -Zsanitizer-memory-track-origins" \
    cargo +nightly test -Zbuild-std \
    --target x86_64-unknown-linux-gnu

# UndefinedBehaviorSanitizer
RUSTFLAGS="-Z sanitizer=undefined" \
    cargo +nightly test -Zbuild-std \
    --target x86_64-unknown-linux-gnu
```

`-Zbuild-std` rebuilds the standard library with the sanitizer, which is necessary for accurate results.

### 2. Stable sanitizer workaround

For stable Rust, use the `cross` tool with a Docker image that has sanitizers pre-configured, or run `cargo test` inside a Docker container with a nightly image.

Alternatively, for simpler UB checking without nightly:
```bash
# cargo-sanitize (wrapper)
cargo install cargo-sanitize
cargo sanitize address
```

### 3. Interpreting ASan output in Rust

```
==12345==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x602000000050
READ of size 4 at 0x602000000050 thread T0
    #0 0x401234 in myapp::module::function /src/main.rs:15
    #1 0x401567 in myapp::main /src/main.rs:42

0x602000000050 is located 0 bytes after a 40-byte region allocated at:
    #0 0x... in alloc::alloc::alloc ...
    #1 0x... in myapp::create_buffer /src/main.rs:10
```

Rust-specific patterns:
| ASan error | Likely Rust cause |
|------------|------------------|
| `heap-buffer-overflow` | `unsafe` slice access past bounds |
| `use-after-free` | `unsafe` pointer use after Vec realloc |
| `stack-use-after-return` | Returning reference to local |
| `heap-use-after-free` | Use after `drop()` or `Box::from_raw` |

### 4. Miri — interpreter for undefined behaviour

Miri interprets Rust MIR and detects UB that sanitizers might miss:

```bash
# Install Miri (requires nightly)
rustup +nightly component add miri

# Run tests under Miri
cargo +nightly miri test

# Run specific test
cargo +nightly miri test test_name

# Run a binary under Miri
cargo +nightly miri run

# Run with Stacked Borrows model (strict aliasing)
MIRIFLAGS="-Zmiri-strict-provenance" cargo +nightly miri test

# Disable isolation (allow file I/O, randomness)
MIRIFLAGS="-Zmiri-disable-isolation" cargo +nightly miri test
```

### 5. What Miri detects

```rust
// 1. Dangling pointer use
unsafe {
    let x = Box::new(42);
    let ptr = Box::into_raw(x);
    let _ = Box::from_raw(ptr);  // drop
    let _val = *ptr;  // Miri: use of dangling pointer
}

// 2. Invalid enum discriminant
let x: u8 = 3;
let e = unsafe { std::mem::transmute::<u8, MyEnum>(x) };
// Miri: enum value has invalid tag

// 3. Uninitialized memory read
let uninit: MaybeUninit<u32> = MaybeUninit::uninit();
let val = unsafe { uninit.assume_init() };  // Miri: reading uninitialized bytes

// 4. Stacked borrows violation
let mut x = 5u32;
let ptr = &mut x as *mut u32;
let _ref = &x;  // shared reference
unsafe { *ptr = 10; }  // Miri: mutable access while shared borrow exists

// 5. Data races (with threads)
// Miri simulates sequential execution and detects races via Stacked Borrows
```

### 6. ThreadSanitizer for Rust

```bash
RUSTFLAGS="-Z sanitizer=thread" \
    RUST_TEST_THREADS=8 \
    cargo +nightly test -Zbuild-std \
    --target x86_64-unknown-linux-gnu 2>&1 | head -50
```

TSan output:
```
WARNING: ThreadSanitizer: data race (pid=12345)
  Write of size 4 at 0x7f... by thread T2 (mutexes: write M1):
    #0 myapp::counter::increment src/counter.rs:10
  Previous read of size 4 at 0x7f... by thread T1:
    #0 myapp::counter::get src/counter.rs:5
```

### 7. Miri configuration via MIRIFLAGS

| Flag | Effect |
|------|--------|
| `-Zmiri-disable-isolation` | Allow I/O, clock, randomness |
| `-Zmiri-strict-provenance` | Strict pointer provenance (stricter than LLVM) |
| `-Zmiri-symbolic-alignment-check` | Stricter alignment checking |
| `-Zmiri-check-number-validity` | Check float/int validity |
| `-Zmiri-num-cpus=N` | Simulate N CPUs (for concurrency) |
| `-Zmiri-seed=N` | Seed for random scheduling |
| `-Zmiri-ignore-leaks` | Suppress memory leak errors |
| `-Zmiri-tag-raw-pointers` | Track raw pointer provenance |

### 8. CI integration

```yaml
# GitHub Actions
- name: Miri
  run: |
    rustup toolchain install nightly
    rustup +nightly component add miri
    cargo +nightly miri test
  env:
    MIRIFLAGS: "-Zmiri-disable-isolation"

- name: ASan (nightly)
  run: |
    rustup component add rust-src --toolchain nightly
    RUSTFLAGS="-Z sanitizer=address" \
    cargo +nightly test -Zbuild-std \
    --target x86_64-unknown-linux-gnu
```

## Related skills

- Use `skills/rust/rust-debugging` for GDB/LLDB debugging of Rust panics
- Use `skills/runtimes/sanitizers` for C/C++ sanitizer usage and comparison
- Use `skills/rust/rust-unsafe` for unsafe Rust patterns and review checklist
- Use `skills/runtimes/fuzzing` to generate inputs that trigger sanitizer errors

© mohitmishra786 · MIT · mohitmishra786/low-level-dev-skills

Похожие скиллы

Все скиллы по теме «Языки программирования» →
migrate-to-shoehorn Matt Pocock Переводит type assertions с as в тестах на функции из @total-typescript/shoehorn. Нужен для частичных объектов и намеренно неверных данных в проверках. 475 388установок write-swift emilkowalski Скилл помогает писать, проверять и переносить код на Swift с учётом модели языка. Подойдёт, когда нужно разобраться с конкурентностью, ошибкой или циклом удержания объектов. CX Codex +1 119 300установок megacave JuliusBrussee Переводит ответы ассистента на классический китайский язык (вэньянь) для экономии места на экране. Активируется командами /megacave или /caveman wenyan. CX Codex +1 25 400установок find-docs upstash Тянет актуальную документацию, справочники API и примеры кода для любой библиотеки через Context7 CLI. Пригодится, когда агент отвечает по устаревшим данным обучения. CX Codex +1 9 400установок typescript-advanced-types Seth Hobson Помогает агенту писать сложную типизацию TypeScript: generics, conditional types и преобразования типов. Нужен для библиотек, API-клиентов и строгих конфигураций. CX Codex 92 169установок smart-explore thedotmack Структурно ищет функции и классы через tree-sitter. Пригодится, когда нужно разобраться в кодовой базе без чтения всех файлов. CX Codex +1 7 300установок

Из того же набора79

openocd-jtag Скилл учит агента настраивать OpenOCD, прошивать микроконтроллеры через JTAG или SWD и подключать GDB для низкоуровневой отладки. CX Codex +1 536установок cpp-coroutines Скилл обучает ИИ-агента писать и отлаживать корутины C++20. Помогает реализовать promise_type, сократить размер фрейма в куче и разобрать зависшие вызовы через GDB. CX Codex +1 531установок debug-optimized-builds Помогает разобраться, почему GDB показывает «value optimized out» и как вообще отлаживать код, собранный с оптимизацией. CX Codex +1 533установок cpp-templates Помогает читать запутанные ошибки шаблонов C++ и переводить старый код с SFINAE на концепты C++20. CX Codex +1 528установок concurrency-debugging Скилл ведёт агента по отчётам ThreadSanitizer, графам блокировок Helgrind и зависшим потокам в GDB. Пригодится, когда программа падает или виснет на многопоточке. CX Codex +1 524установок linker-scripts Помогает писать и править скрипты компоновщика GNU ld для bare-metal: регионы памяти, VMA и LMA, инициализация .bss и .data. CX Codex +1 523установок wasm-emscripten Скилл ведёт агента через сборку C и C++ в WebAssembly: подбор флагов emcc, экспорт функций, модель памяти, Asyncify и отладка .wasm. CX Codex +1 513установок zig-debugging Скилл для ИИ-агента: разбирает паники Zig, error return traces и сессии GDB/LLDB. Пригодится, когда программа падает, а стек нечитаемый. CX Codex +1 511установок

Спонсоры проекта

Компании, которые помогают держать аналитику открытой