← Все статьи
2026-05-16 04:02 · 🌐 СНГ (tech/AI)

LLM пишет Rust полгода: 7 слепых пятен, которые не видит компилятор

Шесть месяцев, четыре модели, 80 тысяч строк Rust и ~40% AI-кода в коммитах. Разработчик собрал коллекцию ошибок, которые проходят cargo build, cargo test и clippy — и при этом являются UB или логически битым кодом.

LLM пишет Rust полгода: 7 слепых пятен, которые не видит компилятор

Автор использовал Claude, GPT и Cursor не как ассистента для бойлерплейта, а как полноценного второго разработчика на боевом монолите: tokio, sqlx, unsafe в hot path. За полгода и 50 типовых задач в бенчмарке накопилась коллекция из семи категорий ошибок — устойчивых, воспроизводимых у всех топовых моделей. Ни одна из них не упирается в качество данных. Это структурные слепые пятна трансформерной архитектуры применительно к системе типов Rust.

Контекст

Rust отличается от Python, Go и Java принципиально: значительная часть корректности живёт не внутри функции, а снаружи — в коде вызывающей стороны, в трейтах из другого крейта, в drop-порядке, в lifetime-связях между параметрами и возвращаемым значением. Трансформер генерирует токены последовательно и видит только то, что попало в контекст. Borrow checker рассуждает о графе заимствований во времени. Эти две модели мира пересекаются только частично.

С Python модель угадывает почти всегда. С Go — тоже. С TypeScript компилятор ловит ошибки сигнатурой. В Rust часть контрактов не выражена в типах вообще: cancel safety у async-функции, поведение Drop у конкретной библиотеки, требования к выравниванию для unsafe. Именно здесь происходят самые дорогие ошибки — те, что проходят все стандартные проверки и добираются до прода.

Все семь категорий воспроизводятся у Claude, GPT и Cursor весной 2026 года. Рейтинг «какая модель лучше» автор намеренно не составлял: к моменту прочтения он устареет. Важнее — паттерны ошибок, которые не исчезнут со следующим апдейтом весов.

Аналитика

Самая тревожная цифра: около 55% unsafe-кода от моделей оказался UB по результатам cargo miri. Весь этот код прошёл обычные тесты и code review — UB просто не проявлялся на типовых входных данных. Из 23 случаев ошибки с std::sync::Mutex в async-коде clippy поймал только 7. Из 12 задач с async cancellation ни одна модель ни разу не упомянула cancel safety сама, не получив прямого вопроса.

Паттерн один: модели оптимизируют локально. Rust требует глобального рассуждения. Lifetime laundering — первая категория — воспроизвелась в 34 из 50 задач с возвратом ссылки: сигнатура выглядит элегантно, компилируется изолированно, но схлопывается при первом реальном использовании. std::sync::Mutex вместо tokio::sync::Mutex генерируется в половине async-случаев, даже если в Cargo.toml уже подключён tokio — потому что в обучающем корпусе std-вариант встречается на порядок чаще. Это чистая статистика токенов, а не непонимание семантики.

Главный вывод выходит за пределы Rust: языки с богатой системой типов становятся безопаснее в эпоху LLM, чем Python — не потому что проще, а потому что компилятор закрывает то, что у других языков закрывает code reviewer, которого нет. Если этот сдвиг закрепится, rustc в CI окажется не выбором, а гигиеническим минимумом для любой команды, серьёзно использующей генерацию кода.

Кейсы применения в бизнесе

B2B SaaS стартап с Rust-бэкендом. Если LLM пишет 30–50% кода — введите ревью-чеклист: любой код от модели с unsafe, unwrap, Arc, Mutex, blanket impl или ручной реализацией Send/Sync требует пристального разбора. Включите clippy::pedantic и clippy::nursery. Добавьте miri в ночной CI для файлов с unsafe — медленно (порядка 10x к обычным тестам), но один пойманный UB в проде окупает.

Корпорация с legacy-кодом. Если рассматриваете Rust для новых высоконагруженных сервисов — учтите: LLM-ассистированный Rust требует разработчиков, которые понимают borrow checker. Модель усиливает того, кто понимает, и опасна для того, кто нет. Вкладывайте в обучение параллельно с внедрением AI-инструментов, иначе получите иллюзию скорости с накопленным техдолгом в форме скрытых UB.

Небольшая IT-компания в КР или СНГ. Если пишете на Rust с LLM-помощью — версионируйте промпты. Шаблон с явными версиями крейтов в начале каждого промпта статистически снижает количество Mutex-ошибок с ~46% до ~19%. Это не требует никаких инфраструктурных изменений, только дисциплины.

Кейсы в личной жизни

Разработчик, изучающий Rust. Не учите язык через LLM-код — учите язык, потом подключайте модель для рутины. Модели ошибаются именно там, где для обучения важнее всего разобраться самому: lifetime-контракты, async cancellation, unsafe-инварианты. Книга сначала, модель после.

Разработчик с опытом Rust. Введите четыре промпт-привычки: указывать версии крейтов явно, требовать // cancel-safe / // NOT cancel-safe с обоснованием для каждой async-функции, требовать блок // SAFETY: перед каждым unsafe, просить модель показать пример вызывающего кода для нетривиальных lifetime-сигнатур. По данным автора, каждая из этих привычек статистически снижает количество ошибок в соответствующей категории.

Технический контент-мейкер. Формат «честный audit инструмента с реальными цифрами и кодом» получает несравнимо больше внимания, чем обзорные посты. Если пишете про AI + разработку — попробуйте провести собственный бенчмарк на знакомом стеке и опубликовать конкретные числа. Это редкость и поэтому ценится.

Как применить сегодня

  • В начале каждого Rust-промпта явно указывайте версии: axum 0.7, tokio 1.35, sqlx 0.7 — снижает ошибки с Mutex почти вдвое.
  • Требуйте комментарий // cancel-safe или // NOT cancel-safe для каждой async-функции с обоснованием — заставляет модель пройтись по каждой точке await.
  • Для любого unsafe требуйте блок // SAFETY: с перечислением инвариантов — даёт материал для ревью и снижает процент UB.
  • Для нетривиальных lifetime-сигнатур просите показать пример вызывающего кода — это вынуждает модель выйти из локальной оптимизации.
  • Включите cargo miri в ночной CI для всех файлов с unsafe — единственный инструмент, который ловит UB до прода. Если есть FFI, cargo-careful как промежуточный вариант.
← Все статьи