Промт для ревью кода: находим баги и уязвимости за 30 секунд

ИИ-ревью полезно ровно в одном сценарии: как первый проход перед человеческим. Он ловит то, на чём взгляд замыливается — необработанный край диапазона, забытую проверку, состояние гонки в очевидном месте. И совершенно не заменяет ревьюера, потому что не знает, зачем этот код написан.
Главная проблема запроса «проверь код на ошибки» в том, что модель не может сказать «здесь всё в порядке». Она обучена быть полезной, поэтому найдёт что-нибудь: предложит переименовать переменную, добавить типы, разбить функцию. Вы получите список стилистических замечаний и пропустите настоящую ошибку в третьей строке.
Промт, который ищет конкретное
Ты — ревьюер. Проверь код ниже. Ищи ТОЛЬКО перечисленные классы проблем. ЧТО ИСКАТЬ: 1. Обращение к данным, которых может не быть: null, пустая коллекция, отсутствующий ключ, необязательное поле. 2. Границы: пустой вход, один элемент, максимальный размер, отрицательное число, ноль. 3. Ресурсы: незакрытые файлы, соединения, транзакции; утечки при исключении. 4. Конкурентность: общее изменяемое состояние, проверка-и-действие без атомарности. 5. Данные извне: отсутствие валидации, конкатенация в запрос, путь из пользовательского ввода. 6. Обработка ошибок: проглоченные исключения, потеря контекста, откат наполовину. ЧЕГО НЕ ДЕЛАТЬ: - Не предлагать переименования, форматирование и стилистику. - Не переписывать работающий код ради красоты. - Не выдумывать поведение вызываемых функций. Если оно неизвестно — так и пиши. ФОРМАТ ОТВЕТА: Для каждой находки: строка, класс проблемы, конкретный сценарий, при котором она проявится, и минимальная правка. Отдельным блоком: «Не могу проверить без контекста» — что именно нужно увидеть. Если по какому-то классу проблем не нашлось — напиши, что не нашлось. КОД: [вставить]
Последние два требования делают половину работы. Список «не могу проверить» показывает, где ревью неполно, а разрешение сказать «не нашлось» снимает давление, из-за которого модель выдумывает проблемы.
Что дать вместе с кодом
| Контекст | Что без него теряется |
|---|---|
| Сигнатуры вызываемых функций | Модель придумает их поведение |
| Откуда приходят данные | Не отличит доверенный вход от пользовательского |
| Версия языка и библиотек | Предложит несуществующий или устаревший API |
| Что уже проверено выше по стеку | Потребует дублирующих проверок |
| Ожидаемая нагрузка | Не отличит важное от теоретического |
Про уязвимости отдельно
Заголовок статьи обещает поиск уязвимостей за тридцать секунд, и здесь нужна честность: за тридцать секунд находится только очевидное. Инъекции через конкатенацию строк, путь из пользовательского ввода, отключённая проверка сертификата, секрет в коде — это ИИ видит хорошо. Логические дыры в правах доступа, ошибки в бизнес-логике, проблемы, возникающие только в связке нескольких сервисов, он не увидит: у него нет всей системы перед глазами.
Проверь код на уязвимости, ограничившись тем, что видно в этом фрагменте. Для каждой находки укажи: как её проэксплуатировать в этом коде, что должно быть верно снаружи, чтобы эксплуатация сработала, и минимальная правка. Не приводи общих рекомендаций по безопасности. Только то, что следует из этих строк. В конце: какие классы уязвимостей по этому фрагменту проверить невозможно.
Как проверять результат ревью
- Требуйте сценарий. На каждую находку — конкретные входные данные, при которых сломается. Нет сценария — скорее всего, ложное срабатывание.
- Пишите тест. Настоящий баг воспроизводится тестом. Если тест написать не получается, находка сомнительна.
- Не принимайте правки пачкой. Каждая — отдельный коммит с объяснением, иначе через месяц никто не поймёт, зачем это.
- Сверяйте API. Названия методов и параметров модель путает уверенно.
Где это встроить
Разумное место — перед тем, как отправлять пул-реквест человеку. Прогоняете свой диф, чините очевидное, и коллега тратит внимание на архитектуру и смысл, а не на забытую проверку на пустой список. Автоматизировать ИИ-ревью в CI и требовать его прохождения не стоит: ложных срабатываний хватит, чтобы команда научилась его игнорировать за неделю.