Miri & Valgrind
Links:
- Miri: https://github.com/rust-lang/miri
- Valgrind: https://nnethercote.github.io/2022/01/05/rust-and-valgrind.html
Miri - это интерпретатор, который запускает код внутри особой безопасной песочницы. Miri даже не компилирует твою программу в реальный код. Он берёт твой Rust код и интерпретирует, проверяя:
- Правила заимствования (одна ссылка на запись или много на чтение)
- Выход за границы массива
- Использование после перемещения
Miri понимает Rust: он знает, что такое
&mutи почему два&mutна один объект — это плохо. Valgrind этого не поймёт. Miri замедляет работу кода в 100-1000х раз.
Valgrind запускает уже готовую скомпилированную программу и следит за ней со стороны:
- Куда она обращается к памяти
- Не забыла ли освободить то, что взяла
- Не читает ли то, что уже удалила Valgrind не знает правил Rust: он видит просто машинный код. Поэтому он может найти многие ошибки, но не понимает высокоуровневые концепции вроде заимствования или времени жизни. При этом Valgrind поддерживает проекты с миксом из Rust и C++ и т.д. языками. Valgrind замедляет работу кода в 20-50х раз.
Установка и запуск
Miri работает только в Nightly-версии Rust:
Проверка
Возьмём код с проблемами:
При запуске cargo test ошибок не будет -> тесты напишут Ок!.
В случае проверки с Miri, инструмент отловит проблемы Bug 1 и Bug 3. Утечки памяти не специализация Miri, может пропустить.
Bug 2 с утечкой памяти отловит Valgrind.
Когда что использовать?
Miri — когда ты пишешь:
unsafeкод- Свои коллекции (Vec, HashMap)
- FFI обёртки (здесь без unsafe не обойтись)
- Хочешь поймать тонкие нарушения правил Rust
Valgrind — когда нужно:
- Найти утечки памяти (Rust их почти не допускает, но C да)
- Проверить программу на другом языке (C, C++, Fortran)
- Отловить ошибки в уже готовом бинарнике, когда нет исходников