Я дал LLM писать unsafe Rust полгода. Miri плакал
vibecodingai 1 час назад Я дал LLM писать unsafe Rust полгода. Miri плакал Средний 12 мин 3.1K Rust * Системное программирование * Программирование * Искусственный интеллект Мнение Этот код прошёл мои code review, ревью...
Anthropic — What company has the best second artificial intelligence model at the end of June?
В сфере искусственного интеллекта произошло заметное событие. vibecodingai 1 час назад Я дал LLM писать unsafe Rust полгода. Miri плакал Средний 12 мин 3. 1K Rust * Системное программирование * Программирование * Искусственный интеллект Мнение Этот код прошёл мои code review, ревью второго коллеги, тесты, CI с clippy и десять дней работал в проде:let mut out = Vec::with_capacity(estimated_size); let written = ; ; Один сегфолт на каждые 800 тысяч запросов внутри C-библиотеки.
Расследование заняло три дня. Этот код написал не джуниор. Этот код написал Claude Sonnet, я одобрил на ревью, второй ревьюер одобрил тоже.
Технические детали
Корень я разберу в конце статьи, когда станет понятно, почему именно так пишет почти каждая модель и почему почти каждый ревьюер это пропускает. Дальше по делу: что именно ломается, как это выглядит под miri, и как я в итоге начал ловить такие штуки до прода, а не после. Сетап и цифрыПолгода я давал LLM писать unsafe-блоки в боевых проектах.
Получилось примерно 180 unsafe-блоков в шести репозиториях: FFI-обёртки вокруг C-библиотек (zstd, libsodium, кастомный аудио-кодек), две lock-free структуры, два примитивных аллокатора, парсер бинарного формата с указательной арифметикой, немного no_std для встроенной железки. Каждый сгенерированный блок я прогонял через miri, cargo-careful, ThreadSanitizer там, где это имело смысл, Loom для конкурентных структур и просто пристально читал глазами. Распределение по моделям получилось примерно такое.
МодельКорректно с первого разаПадает под miriПадает под Loom/TSanClaude Sonnet38%44%18%GPT-4 class33%49%18%Gemini Pro29%51%20%Qwen/DeepSeek (локально)22%58%20%Среднее34%47%19%Для сравнения, в безопасном Rust из первой части доля «сразу правильного» кода была около 70%. Падение в два раза не объясняется ни шумом, ни выбором модели. Объяснение, на котором я остановился, такое.
Отраслевые последствия
В обучающей выборке тонна старого C и тонна safe Rust из туториалов. Unsafe Rust туда попадает в основном из двух мест: учебных примеров уровня «вот как работает mem::transmute» и нетривиальных кусков std/tokio/crossbeam, где инварианты соблюдены, но почти никогда не разобраны словами рядом с кодом. Комментарии вида // SAFETY: в открытом коде встречаются настолько редко, что модель буквально не знает об их существовании как жанра.
Поэтому она пишет unsafe в стиле учебника, где инварианты подразумеваются, и они же первыми ломаются на реальном коде. Дальше разбор того, что ломается стабильно. Категории, минимальные примеры, фиксы, иногда вывод miri или TSan.
Только то, что я лично собирал в логах. Aliasing rules и Stacked BorrowsСамая частая ошибка в сгенерированном unsafe не имеет ничего общего с указателями напрямую. Она про то, что в Rust одновременно нельзя иметь &mut T и любой другой доступ к той же памяти, даже через сырой указатель, если этот указатель был выведен из ссылки.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





