Автор использовал 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как промежуточный вариант.