PVS-Studio, Вайб-кодинг
PVS-Studio, Вайб-кодинг

Есть две школы мысли.

Первая — это директора, HR-ы и "эффективные менеджеры", которые уже планируют сокращения IT-отделов. Они искренне верят, что ChatGPT скоро будет писать весь код, а программисты станут не нужны. Максимум оставят пару "промт-инженеров" и всё. Зачем платить разработчику, если можно просто попросить ИИ "сделать мне интернет-магазин"?

Вторая школа мысли сложна для понимания, потому что senior-программисты ржут так сильно, что не могут нормально объяснить.

(c) Мем с просторов интернета

Так или иначе, вайб-кодинг становится, — а где-то уже стал, — частью процесса разработки программного кода. Команда PVS-Studio видит в этом новые задачи для статических анализаторов по поиску ошибок в коде, возникающих при использовании ИИ-ассистентов и т.п. Первый шаг — собрать примеры реальных дефектов для изучения.

Отношение к вайб-кодингу и его вариациям неоднозначное. Я разделяю мнение, что использование сгенерированного кода, особенно без полного его понимания программистом, плохо скажется на надёжности и безопасности приложений. Так что работы у статических анализаторов только прибавляется :)

AI-сгенерированный код, возможно, будет содержать новые непривычные виды ошибок. Соответственно, чтобы их изучить и научиться выявлять, необходимо сначала собрать их коллекцию.

Есть ли в AI-сгенерированном коде ошибки?

Если попросить AI сгенерировать функцию сортировки, он сделает это без ошибки. Однако разработка проекта не сводится к написанию разрозненных функций, решающих конкретную простую задачу. Плотность ошибок возрастает с ростом проекта из-за сложности взаимодействия различных сущностей.

Мой коллега, экспериментировавший с AI, недавно прислал вот такое описание бага:

"Произошёл забавный случай, как нейронка придумала мне ошибку. Я попросил нейронку для моего класса Warning реализовать методы сравнения".

public class Warning
{
  public string ErrorCode { get; set; }
  public string Message { get; set; }
  public uint Level { get; set; }
  public List<Position> Trace { get; set; }
}

public class Position
{
  public int Line { get; set; }
  public string FilePath { get; set; }
}

Фрагмент реализации от нейронки:

public bool Equals(Warning other)
{
  if (other is null) return false;
  if (ReferenceEquals(this, other)) return true;

  return ErrorCode == other.ErrorCode &&
         Message == other.Message &&
         Level == other.Level &&
         (Trace == other.Trace || 
          (Trace != null && other.Trace != null &&
           Trace.SequenceEqual(other.Trace)));
}

public override int GetHashCode()
{
  unchecked
  {
    int hash = 17;
    hash = hash * 23 + (ErrorCode?.GetHashCode() ?? 0);
    hash = hash * 23 + (Message?.GetHashCode() ?? 0);
    hash = hash * 23 + Level.GetHashCode();
    hash = hash * 23 + (Trace?.GetHashCode() ?? 0); 
    return hash;
  }
}

Факап в методе GetHashCode в строке:

hash = hash * 23 + (Trace?.GetHashCode() ?? 0);

Trace — список (ссылочный тип), поэтому хэш-код считается от ссылки на память, а она у всех объектов разная. Следовательно объекты никогда не будут равны, даже если у них одинаковые значения. В итоге ни один из стандартных алгоритмов (сортировки, фильтры, дубликаты и т.п.) не работал правильно.

В этой ошибке не просматривается что-то особенное, так бы мог написать и человек. Впрочем, это и не вызывает удивление. Возможно, будут замечены какие-то новые типы ошибок, но и классические должны встречаться.

Сейчас в PVS-Studio диагностики для такого случая нет — открыли TODO на создание. Это, конечно, даже ещё не начало пути, поэтому и просим присылать свои подобные случаи.

Зачем статические анализаторы? Пусть ошибки ищет другой AI

Я не думаю, что классические статические анализаторы будут полностью замены инструментами на основе AI. Наоборот, потребность в них может только возрасти, как к детерминированному подходу к контролю создаваемого ПО.

Идея отдать код, сгенерированный одной AI-системой, на проверку другой AI-системе выглядит привлекательной. Но есть два больших но.

Первое. Одно дело генерировать фрагменты кода. Совсем другое — отдавать код своего проекта куда-то во вне для его проверки. Очень многие производители крайне трепетно относятся к тому, чтобы их код не утёк. Отсюда возникают политики безопасности, разработка в закрытом контуре и т.д. Можно пойти по пути использования локально развёрнутых AI-систем, но это существенно увеличит стоимость разработки.

Второе. Не всех устраивает круговая безответственность.

Разработчик не виноват, что одна AI-система сгенерировала код с уязвимостью, а другая её не нашла. Вайб-кодинг допускает, что программист может не до конца понимать принципы работы созданного кода, тем более в разрезе его безопасности.

Создатели AI-систем не возьмут ответственность, что создают код без уязвимостей или умеют их выявлять. Мало ли как программист сформулировал задачу. Да и вообще, такая технология...

Никто не виноват, а уязвимости — вот они. Исправят, но что дальше? Какие действия предпринять, чтобы сделать разработку безопасной?

Общий ответ — строить процессы безопасной разработки, например по ГОСТ Р 56939-2024. Одной из важных составляющих РБПО как раз является статический анализ кода, причём классический или даже ГОСТ-овский — ГОСТ Р 71207-2024 :)

Классические анализаторы тоже не гарантируют, что будут найдены все потенциальные уязвимости. Зато они работают детерминировано!

Если ошибка не найдена, или наоборот анализатор выдал ложное срабатывание, он делает это по понятной для человека логике. Диагностики описаны в документации. В крайнем случае можно попросить разработчиков анализатора рассказать, как именно устроен детектор. И если нужно — предложить доработки для него.

В случае AI всё приблизительно и без ответственности. Ещё один вопрос: на каких данных системы обучаются? Не скармливает ли кто-то туда тайно специально уязвимый код как образцовый?

Используются ли внутри PVS-Studio какие-то AI-алгоритмы для поиска ошибок?

Сейчас нет, хотя мы обдумываем эксперименты в этой области. Однако это будет просто ещё одна технология для обнаружения багов. Она будет носить эмпирический характер, о чём явно будет написано в документации к соответствующим детекторам.

Кстати, эмпирические детекторы и сейчас уже есть в PVS-Studio, хотя они построены не на AI, а просто на статистике.

Однако, ещё раз: переписывать что-то на AI мы не планируем. Наоборот, мы видим в классических алгоритмах ценность для мира вайб-кодинга :) Просто появятся ещё дополнительные механизмы поиска дефектов.

Ещё есть смысл поэкспериментировать с фильтрацией ложных срабатываний. Часто человеку сразу понятно, что вот тут ложное срабатывание, хотя запрограммировать отсев таких случаев крайне сложно. Думаю, тут как раз хорошо подойдут AI-алгоритмы.

Присылайте примеры ошибок, возникших в результате использования вайб-кодинга

Приглашаем в комментариях делиться примерами багов, которые возникли в процессе вайб-кодинга, применения AI-ассистентов и т.д. Или присылайте их через форму обратной связи.

В том числе интересны баги, возникшие в процессе последующей ручной модификации такого кода. Случаи, когда код работал, но его легко сломать изменениями, тоже интересны. Статические анализаторы подсвечивают не только ошибки, но и код с запахом.

Всем заранее спасибо.

P.S. Предвидя комментарий

Я не первый раз коллекционирую ошибки, и бывает кто-то приходит с комментарием типа: "Фу, за мой счёт развивают коммерческий проект".

Ok, если дорожите этими багами, оставляйте их у себя :) Считаю, что делиться взаимовыгодно, так как программисты со временем получат дополнительный механизм для проверки качества создаваемого кода.

Это похоже на обоюдную пользу от проверки нашей командой открытых проектов. Нам — материал для публикаций. Разработчикам проектов — возможность исправить пачку багов и начать использовать бесплатные лицензии PVS-Studio.

Впрочем, это не всё. Мне подсказали идею, и я ей воспользуюсь. Тем, кто пришлёт пример вайб-кодинг бага, который мне понравится, я в подарок буду отправлять бумажную книгу про неопределённое поведение.

P.P.S. Натуральная заметка без добавления AI :)

Данный текст полностью написан человеком, Андреем Карповым, без привлечения ИИ. Спасибо за внимание и заглядывайте в мой TG канал "Бестиарий программирования".

Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Andrey Karpov. PVS-Studio team invites you to share examples of errors related to vibe coding.

Комментарии (0)


  1. Siemargl
    25.09.2025 13:47

    Вы собираетесь бороться с ИИ, без ИИ?

    У вас плохие шансы