LLM генерируют уязвимый C/C++-код. Таков сенсационный вывод свежего исследования, которое ставит крест на иллюзиях разработчиков насчёт ИИ-ассистентов. Мы все повелись на хайп: впихнул промпт — выдал чистый, рабочий сниппет, готовый к продакшену. GPT-4o, Claude, даже open source-тяжи вроде Llama — они везде: в code review, прототипах, борьбе с бойлерплейтом. Но этот анализ, размахивая солвером Z3 SMT как скальпелем, вскрывает гниль под блеском.
Ожидания? Заоблачные. LLM рвали бенчмарки, плевались элегантным Python, отлаживались на лету. А C/C++ — этот низкоуровневый зверь, где один соскользнувший указатель может спалить сервер, — все думали, модели уже подросли. Ошибочка. 55,8% уязвимостей в 3500 образцах. GPT-4o впереди планеты всей — 62,4%. И вишенка: промышленные инструменты пропускают 97,8%.
Вот цитата, которая бьёт как stack smash:
Большие языковые модели (LLM) систематически генерируют C/C++-код, который хотя и синтаксически корректен, но по сути небезопасен. Строгий анализ с помощью формальной верификации на солвере Z3 SMT выявляет критический сбой: 55,8% сгенерированного LLM кода на C/C++ содержит подтверждённые уязвимости безопасности.
Жёстко.
Почему LLM не могут с безопасностью C/C++?
Дело не в лени моделей. Заглянем в архитектуру — проблема в обучающих данных, отравленных с порога. Миллиарды строк с GitHub, Stack Overflow, чёрт знает откуда. Реальный код? Полон переполнений буфера, неинициализированных переменных, гонок условий. LLM учат паттерны, а не инварианты. Они копируют синтаксис, поток, но пропускают суть: этот off-by-one в strcpy — не стиль, а лазейка для атакующих.
Самопроверка? 78,7% успеха в поиске багов. Впечатляет, да? Нет. Поиск — это поверхностно: «эй, этот цикл может переползти». Исправление? Забудьте. Генерация остаётся дырявой, потому что цель — беглость, а не доказательства безопасности. Как учить шефа на рецептах фастфуда, а потом требовать мишленовскую защиту.
А статические анализаторы? CodeQL, Semgrep, Cppcheck — они ловят известные шаблоны зла. LLM изобретают новые вкусы ада, тонкие нарушения инвариантов, которые Z3 вылавливает, моделируя все пути символически. Полгода ковырялись в 3500 артефактах от промптов вроде «реализуй безопасное копирование строки» или «парси не доверенный ввод». Бум — 1055 эксплойтов на лицо.
Как солвер Z3 сорвал все маски?
Формальная верификация — это не grep папаши. Z3 переводит C/C++ в логические ограничения, спрашивает: «Может ли индекс уйти в минус? Переполнение здесь?» Солвер перебирает пути, выдаёт свидетелей — точные входы, рушащие вечеринку. Переполнение буфера? Вот байтовая последовательность, перехватывающая управление.
Традиционные инструменты? Эвристики, правила. Пропускают системные осечки, вроде забытой проверки на null в архитектурно правильном, но смертельном коде. LLM идеальны в синтаксисе, проваливают семантику.
Моё мнение — угол, которого нет в бумаге: это эхо войн компиляторов C 1980-х. Тогда bounds checking не вшит; Morris Worm проскакал по переполнениям буфера в ARPANET. LLM? Современные заводчики червей, натасканные на вчерашние эксплойты, слепые к завтрашним защитам. История не повторяется, но рифмуется — в кремнии.
Это конец LLM-кодогенерации в реальных проектах?
Коротко: пока нет, но близко. Пайплайны с Copilot-подобными инструментами? Играете в рулетку на финтехе, IoT-контроллерах. Пол от 48% уязвимостей по моделям — без выбросов.
Нужен сдвиг. Дообучать на верифицированных датасетах (выводы Frama-C, не сырые репозитории). Внедрять оракулов вроде Z3 в циклы файнтюнинга. Воркфлоу? Генерация → Верификация → Итерация. Хватит «доверять ИИ».
Смелый прогноз: без этого LLM останутся игрушками для прототипов. Продакшен C/C++? Только люди + инструменты, или провал. Корпоративный PR зовёт это «возникающей способностью». Чушь — это мина с часовым механизмом, требующая предохранителей.
Промпт-инжиниринг не спасёт. «Пиши безопасный код» даёт те же дыры; моде