Руководство пользователя CodeGraph¶
Комплексная документация по анализу кода с использованием графов свойств кода (Code Property Graphs)
Содержание¶
- Быстрый старт
- Сценарии для разработчиков
- Сценарии для специалистов по тестированию (QA)
- Сценарии для специалистов по информационной безопасности - Укрепление исходного кода по D3FEND
- Сценарии для технических писателей
- Справочник команд TUI
- Руководство по настройке
- Приложение: все 16 сценариев
- Отчёты по аудиту безопасности (CLI)
- Типовые рабочие процессы
- Темы оформления
- Сессии
- Советы и хитрости
- Устранение неполадок
Быстрый старт¶
Установка¶
# Клонируйте репозиторий и установите зависимости
cd codegraph
pip install -r requirements.txt
# Настройте учетные данные API (выберите один вариант)
export GIGACHAT_AUTH_KEY="ваш-ключ-здесь" # GigaChat (Сбер)
# ИЛИ
export OPENAI_API_KEY="ваш-ключ-здесь" # OpenAI
Запуск TUI¶
python -m src.tui.app
Ваш первый запрос¶
╭─────────────────────────────────────────────────────────╮
│ Интерактивная консоль CodeGraph │
│ Введите /help для получения списка команд, /exit для выхода │
╰─────────────────────────────────────────────────────────╯
> Где определена функция heap_insert?
╭─────────────── Ответ ────────────────╮
│ heap_insert определена в: │
│ src/backend/access/heap/heapam.c │
│ Строка: 2156 │
│ │
│ Сигнатура: │
│ void heap_insert(Relation relation, │
│ HeapTuple tup, │
│ CommandId cid, │
│ ...) │
╰───────────────────────────────────────╯
Основные команды¶
| Команда | Описание |
|---|---|
| /help | Показать все доступные команды |
| /scenarios | Вывести список из 16 сценариев анализа |
| /select 02 | Переключиться в режим аудита безопасности |
| /project | Переключение между проектами CPG |
| /review git | Просмотреть текущие изменения в коде |
| /stat | Показать статистику базы данных |
| /exit | Сохранить сессию и выйти |
Сценарии для разработчиков¶
День 1: Освоение кодовой базы¶
Сценарий: Новый разработчик присоединяется к команде и должен быстро понять структуру кодовой базы.
Шаг 1: Выберите сценарий освоения¶
/select 01
Шаг 2: Задайте обзорные вопросы¶
> Что такое подсистема исполнителя (executor)?
╭─────────────── Ответ ────────────────╮
│ Подсистема исполнителя отвечает за │
│ выполнение планов запросов, │
│ сгенерированных планировщиком. │
│ │
│ Основные компоненты: │
│ - ExecutorStart: Инициализация │
│ - ExecutorRun: Основной цикл │
│ - ExecutorEnd: Освобождение ресурсов│
│ │
│ Точка входа: src/backend/executor/ │
│ execMain.c │
╰──────────────────────────────────────╯
> Каковы основные точки входа в исполнитель?
> Покажите архитектуру выполнения запросов
Шаг 3: Погрузитесь в детали¶
> Что делает ExecProcNode?
> Кто вызывает ExecutorRun?
> Объясните связь между Plan и PlanState
Пример из реальной практики: Понимание управления памятью¶
> Как работает выделение памяти в PostgreSQL?
╭─────────────── Ответ ────────────────╮
│ PostgreSQL использует контексты │
│ памяти для иерархического управления│
│ памятью: │
│ │
│ Основные функции: │
│ palloc() - Выделить память │
│ pfree() - Освободить память │
│ MemoryContextCreate() - Новый контекст│
│ MemoryContextReset() - Массовое освобождение│
│ │
│ Основные контексты: │
│ TopMemoryContext - Корневой контекст│
│ CurrentMemoryContext - Текущий │
│ MessageContext - На сообщение │
╰──────────────────────────────────────╯
Поиск определений функций¶
Сценарий: Разработчику нужно найти реализации функций.
Быстрый поиск определения¶
> Где определена функция palloc?
╭─────────────── Ответ ────────────────╮
│ palloc определена в: │
│ src/backend/utils/mmgr/mcxt.c:1089 │
│ │
│ Сигнатура: │
│ void *palloc(Size size) │
│ │
│ Связанные функции: │
│ palloc0(), palloc_extended(), │
│ repalloc(), pfree() │
╰──────────────────────────────────────╯
С графом вызовов¶
> Покажите всех вызывающих palloc
╭─────────────── Вызывающие ───────────╮
│ 1. heap_form_tuple() │
│ 2. ExecStoreTuple() │
│ 3. construct_array() │
│ 4. pnstrdup() │
│ 5. SPI_connect() │
│ ... (показано первые 5 из 2 847) │
╰──────────────────────────────────────╯
> Какие функции вызывает LWLockAcquire?
Отслеживание потока данных¶
> Как проходят данные от pg_parse_query до исполнителя?
╭─────────────── Поток данных ─────────╮
│ pg_parse_query() │
│ ↓ │
│ pg_analyze_and_rewrite() │
│ ↓ │
│ pg_plan_queries() │
│ ↓ │
│ PortalRun() │
│ ↓ │
│ ExecutorRun() │
│ ↓ │
│ ExecProcNode() │
╰──────────────────────────────────────╯
Добавление новых функций¶
Сценарий: Разработчику нужно добавить новый алгоритм соединения (join).
Шаг 1: Выберите сценарий разработки функций¶
/select 04
Шаг 2: Найдите точки интеграции¶
> Где мне добавить новый алгоритм соединения?
╭─────────────── Ответ ────────────────╮
│ Чтобы добавить новый алгоритм: │
│ │
│ 1. Определите тип узла: │
│ src/include/nodes/plannodes.h │
│ │
│ 2. Добавьте поддержку в планировщик:│
│ src/backend/optimizer/path/ │
│ joinpath.c - add_xxx_path() │
│ │
│ 3. Добавьте поддержку в исполнитель:│
│ src/backend/executor/ │
│ nodeXxxjoin.c - ExecXxxJoin() │
│ │
│ 4. Зарегистрируйте в execProcnode.c │
╰──────────────────────────────────────╯
> Какие хуки существуют в исполнителе для пользовательских узлов плана?
> Покажите, как hashjoin интегрируется с планировщиком
Шаг 3: Оцените влияние изменений¶
> Что сломается, если я изменю add_path?
╭──────────── Анализ влияния ──────────╮
│ Изменение add_path() повлияет на: │
│ │
│ Прямые вызывающие (47): │
│ - add_partial_path() │
│ - add_partial_path_precheck() │
│ - create_seqscan_path() │
│ - create_index_path() │
│ ... │
│ │
│ Риск: ВЫСОКИЙ — ядро выбора путей │
│ Рекомендация: Добавьте новую функцию │
│ вместо изменения существующей │
╰──────────────────────────────────────╯
> Покажите зависимости create_hashjoin_path
Помощь при отладке¶
Сценарий: Разработчик отлаживает сбой или неожиданное поведение.
Шаг 1: Выберите сценарий отладки¶
/select 15
Шаг 2: Найдите точки отладки¶
> Где в исполнителе используются макросы утверждений (assert)?
╭─────────────── Ответ ────────────────╮
│ Макросы утверждений в исполнителе: │
│ │
│ Assert() - src/include/c.h:846 │
│ AssertArg() - Проверка аргументов │
│ AssertState() - Проверка состояния │
│ │
│ Использование в исполнителе: │
│ execMain.c: 89 утверждений │
│ execProcnode.c: 34 утверждения │
│ execScan.c: 23 утверждения │
╰──────────────────────────────────────╯
> Найдите вызовы elog в heap_insert
> Какие функции пишут в WAL?
Шаг 3: Отследите выполнение¶
> Отследите выполнение от INSERT до heap_insert
╭──────────── Трассировка выполнения ──╮
│ ProcessQuery() │
│ ↓ │
│ PortalRunMulti() │
│ ↓ │
│ ExecutorRun() │
│ ↓ │
│ ExecModifyTable() │
│ ↓ │
│ ExecInsert() │
│ ↓ │
│ table_tuple_insert() │
│ ↓ │
│ heap_insert() │
╰──────────────────────────────────────╯
> Где поставить точки останова для фиксации транзакции?
Рефакторинг кода¶
Сценарий: Разработчик устраняет технический долг во время спринта рефакторинга.
Шаг 1: Выберите сценарий рефакторинга¶
/select 05
Шаг 2: Найдите неиспользуемый код¶
> Найдите неиспользуемые статические функции в исполнителе
╭──────────── Неиспользуемый код ──────╮
│ Потенциально неиспользуемые функции: │
│ │
│ 1. execUtils.c: │
│ - old_get_typlenbyval() :234 │
│ │
│ 2. execTuples.c: │
│ - legacy_slot_init() :456 │
│ │
│ Всего: 12 кандидатов │
│ Подтверждено неиспользуемых: 8 │
╰──────────────────────────────────────╯
> Покажите устаревшие функции, которые всё ещё используются
> Найдите дублирующиеся шаблоны обработки ошибок
Шаг 3: Планирование рефакторинга¶
> От чего зависит ExecProcNode?
╭──────────── Зависимости ─────────────╮
│ Прямые зависимости: 47 │
│ Транзитивные зависимости: 312 │
│ │
│ Ключевые вызывающие: │
│ - ExecutorRun() │
│ - ExecSubPlan() │
│ - ExecMaterial() │
│ - ExecSort() │
│ │
│ Риск рефакторинга: КРИТИЧЕСКИЙ │
│ Рекомендация: Поэтапная миграция │
╰──────────────────────────────────────╯
> Влияние переименования heap_open в table_open
Сценарии для QA/тестировщиков¶
Анализ покрытия тестами¶
Сценарий: Инженеру по тестированию необходимо выявить непротестированные участки кода.
Шаг 1: Выбор сценария анализа покрытия тестами¶
/select 07
Шаг 2: Поиск пробелов в покрытии¶
> Какие функции не покрыты тестами?
╭─────────────── Пробелы в покрытии ─────────╮
│ Функции без прямых тестов: │
│ │
│ Критические (executor): │
│ - ExecParallelHashJoinNewBatch() │
│ - ExecReScanGather() │
│ │
│ Высокий приоритет (storage): │
│ - heap_lock_updated_tuple() │
│ - heap_abort_speculative() │
│ │
│ Всего непротестированных: 234 функции │
│ Оценка покрытия: 78% │
╰───────────────────────────────────────────╯
> Какие критические функции нужно протестировать в первую очередь?
> Найти непротестированные пути обработки ошибок
Шаг 3: Определение приоритетов тестирования¶
> Какие непротестированные функции имеют наибольшее влияние?
╭─────────────── Список приоритетов ─────────╮
│ Высокое влияние + нет тестов: │
│ │
│ 1. heap_lock_updated_tuple() │
│ Влияние: Целостность транзакций │
│ Количество вызовов: 23 │
│ │
│ 2. ExecParallelHashJoinNewBatch() │
│ Влияние: Корректность параллельных запросов │
│ Количество вызовов: 8 │
│ │
│ 3. AtEOXact_RelationCache() │
│ Влияние: Согласованность кэша │
│ Количество вызовов: 4 │
╰────────────────────────────────────────────╯
> Показать точки входа без тестов
Помощь при код-ревью¶
Сценарий: Ревьюеру необходимо проанализировать pull request на наличие проблем с качеством и безопасностью.
Вариант A: GitHub PR¶
/review github 123
Вариант B: GitLab MR¶
/review gitlab 456
Вариант C: Локальные изменения в Git¶
/review git
Вариант D: Файл патча¶
/review file path/to/changes.patch
Понимание результата¶
╭─────────────── Результаты ревью ────────────────────────────╮
│ │
│ Оценка: 72/100 Рекомендация: REQUEST_CHANGES │
│ │
│ ══════════════════════════════════════════════════════ │
│ │
│ Найденные проблемы: │
│ │
│ 🔴 КРИТИЧЕСКИЙ Риск SQL-инъекции │
│ Местоположение: src/api/user_query.c:45 │
│ Паттерн: Ввод пользователя вставляется в запрос напрямую │
│ Исправление: Использовать параметризованные запросы │
│ │
│ 🟡 СРЕДНИЙ Сложность по Маккейбу │
│ Местоположение: src/parser/gram.y:1234 │
│ Значение: 47 (порог: 10) │
│ Исправление: Вынести вспомогательные функции │
│ │
│ 🟢 НИЗКИЙ Отсутствует проверка на NULL │
│ Местоположение: src/utils/string.c:89 │
│ Исправление: Добавить проверку указателя на NULL │
│ │
╰─────────────────────────────────────────────────────────────╯
Ревью с встроенными комментариями¶
/review git --format md --inline
╭─────────────── Встроенные комментарии ───────────────────────────╮
│ │
│ src/api/user_query.c │
│ ───────────────────── │
│ │
│ Строка 45: │
│ sprintf(query, "SELECT * FROM users WHERE id=%s", id); │
│ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^│
│ 🔴 SQL-инъекция: Используйте snprintf с правильным экранированием │
│ │
│ Строка 67: │
│ char *result = malloc(len); │
│ ^^^^^^^^^^^^^^^^^^^^^^^^^^^ │
│ 🟡 Память: Проверьте возвращаемое значение malloc на NULL │
│ │
╰───────────────────────────────────────────────────────────────────╯
Генерация тестовых сценариев¶
Сценарий: QA-инженеру необходимо создать комплексные тесты для функции.
> Сгенерируй тестовые сценарии для heap_insert
╭─────────────── Тестовые сценарии ────────────────────────────────╮
│ │
│ Функция: heap_insert() │
│ Файл: src/backend/access/heap/heapam.c:2156 │
│ │
│ ═════════════════════════════════════════════════════════ │
│ │
│ 1. Обычная вставка │
│ Входные данные: Корректная таблица, корректный кортеж, │
│ корректный CommandId │
│ Ожидаемое: Возвращён OID, кортеж виден │
│ │
│ 2. NULL в указателе таблицы │
│ Входные данные: Указатель таблицы равен NULL │
│ Ожидаемое: Сбой утверждения или корректное сообщение об ошибке │
│ │
│ 3. Слишком большой кортеж │
│ Входные данные: Кортеж больше BLCKSZ │
│ Ожидаемое: Ошибка с понятным сообщением │
│ │
│ 4. Параллельная вставка │
│ Входные данные: Несколько потоков выполняют вставку │
│ Ожидаемое: Все вставки успешны, без повреждений данных │
│ │
│ 5. Откат транзакции │
│ Входные данные: Вставка, за которой следует ROLLBACK │
│ Ожидаемое: Кортеж не виден после отката │
│ │
│ 6. Требуется TOAST │
│ Входные данные: Кортеж с большим полем varlena │
│ Ожидаемое: TOAST-таблица заполнена корректно │
│ │
╰──────────────────────────────────────────────────────────────────╯
> Какие граничные случаи нужно протестировать в LWLockAcquire?
> Создай тестовые данные для сценариев фиксации транзакций
Сценарии специалиста по информационной безопасности¶
Сканирование уязвимостей¶
Сценарий: Инженер по безопасности проводит аудит в рамках спринта.
Шаг 1: Выбор сценария безопасности¶
/select 02
Шаг 2: Поиск уязвимостей¶
> Найти уязвимости типа SQL-инъекция
╭─────────────── Результаты проверки безопасности ─────────────────────────╮
│ │
│ 🔴 КРИТИЧЕСКИЙ: SQL-инъекция │
│ ────────────────────────────────────── │
│ │
│ Расположение: src/pl/plpgsql/src/pl_exec.c:4567 │
│ Паттерн: Динамический запрос с конкатенацией строк │
│ Код: │
│ snprintf(query, "SELECT * FROM %s", table_name); │
│ │
│ Риск: Управляемое пользователем имя таблицы может внедрить SQL │
│ Исправление: Использовать quote_identifier() для имён таблиц │
│ CWE: CWE-89 │
│ │
│ ──────────────────────────────────────────────────────────────────────── │
│ │
│ Расположение: src/backend/utils/adt/ruleutils.c:2341 │
│ Паттерн: Строка формата с внешним вводом │
│ Риск: Потенциальная инъекция строки формата │
│ Исправление: Проверить спецификаторы формата │
│ │
│ Всего найдено: 7 критических, 12 высоких, 34 средних │
│ │
╰───────────────────────────────────────────────────────────────────────────╯
> Найти риски переполнения буфера в строковых функциях
> Показать функции, использующие sprintf без проверки границ
Анализ потока заражённых данных (Taint Flow Analysis)¶
Сценарий: Инженер по безопасности отслеживает ненадёжные данные через систему.
Шаг 1: Определение точек входа¶
> Найти все внешние точки входа
╭─────────────── Точки входа ──────────────────────────────╮
│ │
│ Сетевые точки входа: │
│ - pq_getmsgstring() - Чтение строки от клиента │
│ - pq_getmsgint() - Чтение целого от клиента │
│ - ProcessClientRead() - Прямое чтение из сокета │
│ │
│ Точки входа SQL: │
│ - exec_simple_query() - Прямое выполнение SQL │
│ - exec_parse_message() - Подготовленный оператор │
│ - exec_bind_message() - Привязка параметров │
│ │
│ Файловые точки входа: │
│ - pg_read_file() - Чтение произвольного файла │
│ - pg_ls_dir() - Просмотр содержимого папки │
│ │
│ Всего: обнаружено 47 точек входа │
│ │
╰───────────────────────────────────────────────────────────╯
> Показать обработчики сетевого ввода
> Перечислить функции ввода пользователя
Шаг 2: Отслеживание потока данных¶
> Отследить поток данных от PQgetvalue до выполнения SQL
╭─────────────── Поток заражённых данных ────────────────────────╮
│ │
│ ИСТОЧНИК: PQgetvalue() [Ввод клиента] │
│ ↓ │
│ pq_getmsgstring() │
│ ↓ │
│ exec_simple_query() │
│ ↓ │
│ pg_parse_query() │
│ ↓ │
│ СТОК: SPI_execute() [Выполнение SQL] │
│ │
│ ════════════════════════════════════════════════════ │
│ │
│ Санация найдена: ДА │
│ Расположение: pg_parse_query() проверяет синтаксис │
│ НО: Не предотвращает семантическую инъекцию │
│ │
│ Уровень риска: ВЫСОКИЙ │
│ Рекомендация: Добавить проверку ввода на точке входа │
│ │
╰───────────────────────────────────────────────────────────────╯
> Достигает ли ввод пользователя strcpy без проверки?
> Показать путь от чтения из сокета до выделения памяти
Шаг 3: Поиск санации данных¶
> Где ввод санируется перед выполнением запроса?
╭─────────────── Точки санации данных ───────────────────────╮
│ │
│ Обнаруженные средства санации: │
│ │
│ 1. quote_identifier() │
│ Расположение: src/backend/utils/adt/ruleutils.c:10234 │
│ Назначение: Экранирование идентификаторов SQL │
│ Охват: Частичный — не всегда используется │
│ │
│ 2. quote_literal() │
│ Расположение: src/backend/utils/adt/quote.c:45 │
│ Назначение: Экранирование литералов SQL │
│ Охват: Хороший — широко используется │
│ │
│ 3. pg_parse_query() │
│ Расположение: src/backend/tcop/postgres.c:645 │
│ Назначение: Проверка синтаксиса │
│ Охват: Все запросы │
│ │
│ Отсутствует санация в: │
│ - Построение имён таблиц (12 мест) │
│ - Построение строк формата (5 мест) │
│ │
╰───────────────────────────────────────────────────────────╯
> Найти все функции проверки в аутентификации
Укрепление исходного кода по D3FEND¶
Сценарий: Инженер по безопасности проверяет практики оборонительного программирования с использованием фреймворка MITRE D3FEND.
Модуль D3FEND анализирует код на соответствие 11 методикам укрепления исходного кода, определённым MITRE:
| ID | Методика | Описание | CWE |
|---|---|---|---|
| D3-VI | Инициализация переменных | Неинициализированные переменные | CWE-457 |
| D3-CS | Очистка учётных данных | Жёстко заданные учётные данные | CWE-798 |
| D3-IRV | Проверка диапазона целых | Риски переполнения целых | CWE-190 |
| D3-PV | Проверка указателей | Разыменование указателя без проверки | CWE-476 |
| D3-RN | Обнуление ссылок | Риски использования после освобождения | CWE-416 |
| D3-TL | Надёжные библиотеки | Использование небезопасных функций | CWE-676 |
| D3-VTV | Проверка типа переменных | Проблемы с типами | CWE-704 |
| D3-MBSV | Проверка начала блока памяти | Выход за границы буфера | CWE-119 |
| D3-NPC | Проверка на null-указатель | Отсутствие проверок NULL | CWE-476 |
| D3-DLV | Проверка логики домена | Ошибки бизнес-логики | CWE-20 |
| D3-OLV | Проверка операционной логики | Управление состоянием | CWE-754 |
Пример 1: Полный аудит укрепления¶
/select 02
> Выполнить проверку соответствия D3FEND
╭─────────────── Отчёт о соответствии D3FEND ─────────────────────╮
│ │
│ Общий балл соответствия: 72,5% │
│ │
│ ═══════════════════════════════════════════════════════════ │
│ │
│ Найденные проблемы по методикам: │
│ │
│ D3-VI (Инициализация переменных): 23 проблемы │
│ ────────────────────────────────────────────────────── │
│ - palloc без palloc0: 15 мест │
│ - Неинициализированные поля структур: 8 мест │
│ │
│ D3-TL (Надёжные библиотеки): 12 проблем │
│ ───────────────────────────────────────────────────── │
│ 🔴 использование strcpy: src/backend/utils/adt/varlena.c:234│
│ 🔴 использование sprintf: src/backend/libpq/auth.c:567 │
│ 🟡 использование strtok: src/backend/parser/gram.c:1234 │
│ │
│ D3-NPC (Проверка на null-указатель): 8 проблем │
│ ────────────────────────────────────────────────────── │
│ - malloc без проверки на NULL: 5 мест │
│ - palloc без проверки: 3 места │
│ │
│ D3-RN (Обнуление ссылок): 6 проблем │
│ ────────────────────────────────────────────────────── │
│ - pfree без ptr = NULL: 6 мест │
│ │
│ Баллы по категориям: │
│ Инициализация: 65% │
│ Безопасность памяти: 78% │
│ Безопасность указателей: 82% │
│ Безопасность библиотек: 58% │
│ │
╰───────────────────────────────────────────────────────────────╯
Пример 2: Проверка конкретных методик D3FEND¶
> Проверить использование небезопасных функций (D3-TL Надёжные библиотеки)
╭─────────────── D3-TL: Надёжные библиотеки ───────────────────────╮
│ │
│ Найдено небезопасных функций: 47 │
│ │
│ 🔴 КРИТИЧЕСКИЙ - strcpy (риск переполнения буфера): │
│ ────────────────────────────────────────────────────── │
│ src/backend/utils/adt/varlena.c:234 │
│ src/backend/libpq/pqformat.c:567 │
│ src/pl/plpgsql/src/pl_exec.c:1234 │
│ │
│ 🔴 КРИТИЧЕСКИЙ - sprintf (риск строки формата): │
│ ────────────────────────────────────────────────────── │
│ src/backend/libpq/auth.c:567 │
│ src/backend/utils/error/elog.c:890 │
│ │
│ 🟡 ВЫСОКИЙ - gets (устарела, всегда небезопасна): │
│ ────────────────────────────────────────────────────── │
│ Не найдено ✓ │
│ │
│ 🟡 ВЫСОКИЙ - rand (слабый генератор случайных чисел): │
│ ────────────────────────────────────────────────────── │
│ src/backend/utils/misc/pg_random.c:45 │
│ │
│ Рекомендации по исправлению: │
│ ────────────────────────────── │
│ - strcpy → strncpy/strlcpy │
│ - sprintf → snprintf │
│ - gets → fgets │
│ - rand → pg_prng_* или arc4random │
│ │
╰───────────────────────────────────────────────────────────────╯
> Найти уязвимости из-за отсутствия проверки null-указателя (D3-NPC)
╭─────────────── D3-NPC: Проверка на null-указатель ────────────────╮
│ │
│ Отсутствие проверки NULL после выделения: 23 │
│ │
│ malloc без проверки: │
│ ───────────────────── │
│ src/backend/utils/mmgr/aset.c:345 │
│ char *buf = malloc(size); │
│ use(buf); // ← Нет проверки на NULL! │
│ │
│ palloc без проверки: │
│ ────────────────────────── │
│ src/backend/executor/execUtils.c:234 │
│ TupleTableSlot *slot = palloc(sizeof(...)); │
│ slot->tts_values = palloc(...); // ← Нет проверки │
│ │
│ Примечание PostgreSQL: palloc() вызывает ERROR при нехватке памяти,│
│ но явные проверки улучшают читаемость кода. │
│ │
│ Пример исправления: │
│ ───────────────────── │
│ char *buf = malloc(size); │
│ if (buf == NULL) { │
│ ereport(ERROR, (errcode(ERRCODE_OUT_OF_MEMORY))); │
│ } │
│ │
╰───────────────────────────────────────────────────────────────╯
Пример 3: Проверка безопасности памяти (D3-RN Обнуление ссылок)¶
> Проверить риски использования после освобождения
╭─────────────── D3-RN: Обнуление ссылок ────────────────╮
│ │
│ Освобождение без обнуления: 34 места │
│ │
│ pfree без присвоения NULL: │
│ ────────────────────────────── │
│ │
│ src/backend/utils/cache/relcache.c:567 │
│ ───────────────────────────────────── │
│ pfree(rel->rd_options); │
│ // rel->rd_options всё ещё указывает на освобождённую память! │
│ │
│ ✓ ИСПРАВЛЕНИЕ: │
│ pfree(rel->rd_options); │
│ rel->rd_options = NULL; │
│ │
│ src/backend/executor/nodeHash.c:234 │
│ ───────────────────────────────── │
│ pfree(hashtable->buckets); │
│ // Риск висячего указателя в путях обработки ошибок │
│ │
│ MemoryContextDelete без обнуления: │
│ ────────────────────────────────────────── │
│ │
│ src/backend/utils/mmgr/mcxt.c:890 │
│ MemoryContextDelete(ctx); │
│ // ctx может быть использован позже! │
│ │
│ Справка CWE: CWE-416 (Использование после освобождения) │
│ │
╰───────────────────────────────────────────────────────╯
Пример 4: Проверка инициализации переменных (D3-VI)¶
> Найти неинициализированные переменные
╭─────────────── D3-VI: Инициализация переменных ───────────────╮
│ │
│ Найдено неинициализированных переменных: 56 │
│ │
│ Локальные переменные без инициализации: │
│ ────────────────────────────────────────────────────── │
│ │
│ src/backend/executor/execMain.c:456 │
│ ───────────────────────────────────── │
│ EState *estate; // ← Неинициализирована │
│ QueryDesc *queryDesc; // ← Неинициализирована │
│ │
│ ✓ ИСПРАВЛЕНИЕ: │
│ EState *estate =
## Сценарии для технического писателя
### Генерация документации по API
**Сценарий:** Технический писатель документирует публичное API.
#### Шаг 1: Выбор сценария документации
/select 03
#### Шаг 2: Генерация документации по функциям
Создай документацию для heap_insert
╭─────────────── Документация API ─────────────────────────╮ │ │ │ ## heap_insert │ │ │ │ Вставляет кортеж в отношение кучи. │ │ │ │ ### Сигнатура │ │ │ │
c │
│ void heap_insert(Relation relation, │
│ HeapTuple tup, │
│ CommandId cid, │
│ int options, │
│ BulkInsertState bistate) │
│
│
│ │ │ ### Параметры │ │ │ │ | Параметр | Тип | Описание │ │ |-----------|---------------|----------------------------│ │ | relation | Relation | Целевое отношение кучи │ │ | tup | HeapTuple | Кортеж для вставки │ │ | cid | CommandId | Идентификатор команды для MVCC │ │ | options | int | Флаги опций вставки │ │ | bistate | BulkInsertState | Состояние массовой вставки │ │ │ │ ### Возвращаемое значение │ │ │ │ void (кортеж модифицируется на месте, при необходимости с присвоением OID) │ │ │ │ ### Пример │ │ │ │
c │
│ HeapTuple tuple = heap_form_tuple(desc, values, nulls); │
│ heap_insert(rel, tuple, GetCurrentCommandId(true), │
│ 0, NULL); │
│
│
│ │ │ ### Смотрите также │ │ │ │ - heap_update() - Обновление существующего кортежа │ │ - heap_delete() - Удаление кортежа │ │ - simple_heap_insert() - Упрощённая обёртка │ │ │ │ ### Исходный код │ │ │ │ src/backend/access/heap/heapam.c:2156 │ │ │ ╰───────────────────────────────────────────────────────────╯
Документируй функции интерфейса SPI
Создай справочник API для управления блокировками
---
### Понимание архитектуры модуля
**Сценарий:** Технический писатель документирует архитектуру системы.
Объясни архитектуру модуля исполнителя (executor)
╭─────────────── Архитектура ──────────────────────────────╮ │ │ │ Архитектура модуля исполнителя (executor) │ │ ══════════════════════════════════════════ │ │ │ │ Назначение: Выполнение планов запросов, созданных планировщиком │ │ │ │ Каталог: src/backend/executor/ │ │ │ │ Основные компоненты: │ │ ──────────────── │ │ │ │ 1. execMain.c - Основные точки входа исполнителя │ │ - ExecutorStart(): Инициализация состояния выполнения │ │ - ExecutorRun(): Основной цикл выполнения │ │ - ExecutorEnd(): Очистка и завершение работы │ │ │ │ 2. execProcnode.c - Диспетчер узлов │ │ - ExecProcNode(): Перенаправление на конкретные типы узлов │ │ - ExecInitNode(): Инициализация узлов плана │ │ - ExecEndNode(): Очистка узлов плана │ │ │ │ 3. Исполнители, специфичные для узлов: │ │ - nodeSeqscan.c - Последовательное сканирование │ │ - nodeIndexscan.c - Сканирование по индексу │ │ - nodeHashjoin.c - Хеш-соединение │ │ - nodeMergejoin.c - Слияние соединений │ │ - nodeAgg.c - Агрегация │ │ - nodeSort.c - Сортировка │ │ │ │ Поток данных: │ │ ────────── │ │ │ │ Дерево плана → Дерево состояния плана → Вывод кортежей │ │ │ │ Зависимости: │ │ ───────────── │ │ → access/ (уровень хранения) │ │ → utils/ (память, кэш) │ │ → nodes/ (определения узлов) │ │ │ ╰───────────────────────────────────────────────────────────╯
Каковы основные компоненты WAL?
Как работает MVCC в PostgreSQL?
---
### Создание справочника функций
**Сценарий:** Технический писатель составляет индекс функций.
Перечисли все публичные функции в модуле исполнителя
╭─────────────── Справочник функций ────────────────────────╮ │ │ │ Публичные функции исполнителя │ │ ════════════════════════════════ │ │ │ │ Точки входа: │ │ ───────────── │ │ ExecutorStart() Инициализация выполнения │ │ ExecutorRun() Выполнение плана │ │ ExecutorFinish() Обработка после выполнения │ │ ExecutorEnd() Очистка │ │ │ │ Операции с узлами: │ │ ──────────────── │ │ ExecProcNode() Выполнить один узел │ │ ExecInitNode() Инициализировать узел │ │ ExecEndNode() Очистить узел │ │ ExecReScan() Сброс для повторного сканирования │ │ │ │ Операции с кортежами: │ │ ───────────────── │ │ ExecStoreTuple() Сохранить кортеж в слоте │ │ ExecClearTuple() Очистить слот │ │ ExecCopySlot() Скопировать содержимое слота │ │ │ │ Всего: 156 публичных функций │ │ │ ╰───────────────────────────────────────────────────────────╯
Покажи все точки входа с их сигнатурами
#### Использование прямого SQL-запроса
/query SELECT name, signature, filename FROM nodes_method WHERE filename LIKE ‘%executor%’ ORDER BY name LIMIT 20
╭─────────────── Результаты запроса ────────────────────────╮ │ │ │ name | signature | filename │ │ ──────────────────┼────────────────────────┼────────── │ │ ExecAgg | ExecAgg(PlanState*) | nodeAgg.c │ │ ExecAppend | ExecAppend(…) | nodeAppend │ │ ExecBitmapAnd | ExecBitmapAnd(…) | nodeBitma │ │ … | … | … │ │ │ │ Возвращено 20 строк │ │ │ ╰───────────────────────────────────────────────────────────╯
## Справочник команд TUI
### Все команды
| Команда | Аргументы | Описание |
|--------|----------|--------|
| `/help` | `[команда]` | Показать справку по всем командам или по конкретной команде |
| `/scenarios` | `[группа]` | Список доступных сценариев, с опциональной фильтрацией |
| `/select` | `<номер>` | Выбрать сценарий по номеру (01–16) |
| `/history` | `[количество]` | Показать историю диалога |
| `/save` | `[имя_файла]` | Сохранить текущую сессию |
| `/load` | `<имя_файла>` | Загрузить сохранённую сессию |
| `/config` | `[раздел] [ключ] [значение]` | Просмотр или изменение конфигурации |
| `/stat` | | Показать статистику CPG и ChromaDB |
| `/query` | `<SQL>` | Выполнить SQL-запрос к базе данных CPG |
| `/review` | `[источник] [id] [--format] [--inline]` | Запустить анализ кода |
| `/demo` | `[--scenarios N,N] [--lang en\|ru]` | Запустить быстрое тестирование |
| `/clear` | | Очистить экран |
| `/exit` | | Выйти из приложения |
| `/project` | `[list\|switch\|add]` | Управление проектами CPG |
### Подробное описание команд
#### /project
Управление несколькими проектами CPG (переключение между разными кодовыми базами).
```bash
# Показать информацию о текущем проекте
/project
# Список всех доступных проектов
/project list
# Переключиться на другой проект
/project switch fsin_module
/project switch postgresql
# Добавить новый проект
/project add myproject path/to/project.duckdb python "Мой Python-проект"
Конфигурация проектов (projects.yaml):
projects:
postgresql:
db_path: "cpg.duckdb"
language: c
description: "Исходный код PostgreSQL 17"
fsin_module:
db_path: "workspace/fsin_module_v2.duckdb"
language: python
description: "Django-модуль FSIN"
active_project: postgresql
Автоматическое переключение доменов:
При смене проекта система автоматически активирует соответствующий доменный плагин:
| Язык | Доменный плагин | Паттерны безопасности |
|---|---|---|
| c, cpp | postgresql / generic_cpp | Безопасность памяти, переполнение буфера |
| python | python_django | SQL-инъекции, XSS, CSRF |
# Пример: переключение на проект Python/Django
/project switch fsin_module
# Вывод: Домен активирован: python_django
# Пример: возврат к проекту на C
/project switch postgresql
# Вывод: Домен активирован: postgresql
/scenarios¶
# Показать все сценарии
/scenarios
# Фильтрация по группе
/scenarios security # Сценарии, связанные с безопасностью
/scenarios dev # Сценарии разработки
/scenarios qa # Сценарии обеспечения качества
/select¶
# Выбор по номеру
/select 1 # Онбординг
/select 02 # Аудит безопасности
/select 15 # Отладка
/config¶
# Показать все разделы конфигурации
/config
# Показать конкретный раздел
/config llm
# Установить значение
/config llm temperature 0.7
/config llm provider gigachat
/query¶
# Простые запросы
/query SELECT COUNT(*) FROM nodes_method
/query SELECT name, filename FROM nodes_method WHERE name LIKE 'heap%'
# Описание таблиц
/query DESCRIBE nodes_method
/query SHOW TABLES
# Сложные запросы
/query SELECT caller.name, callee.name
FROM edges_call e
JOIN nodes_method caller ON e.src = caller.id
JOIN nodes_method callee ON e.dst = callee.id
WHERE callee.name = 'palloc'
LIMIT 10
/review¶
# Интерактивный режим (выбор источника)
/review
# GitHub PR
/review github 123
/review github 123 --format json
# GitLab MR
/review gitlab 456 --inline
# Локальные изменения в git
/review git
/review git --format yaml
# Файл патча
/review file changes.patch --format md --inline
Руководство по настройке¶
Настройка поставщика LLM¶
GigaChat (Sber)¶
# config.yaml
llm:
provider: "gigachat"
gigachat:
credentials: ${GIGACHAT_AUTH_KEY}
model: "GigaChat-2" # или GigaChat-2-Pro, GigaChat-2-Max
temperature: 0.7
# Переменная окружения
export GIGACHAT_AUTH_KEY="ваш-ключ-в-base64"
OpenAI¶
# config.yaml
llm:
provider: "openai"
openai:
api_key: ${OPENAI_API_KEY}
model: "gpt-4"
temperature: 0.7
# Переменная окружения
export OPENAI_API_KEY="sk-..."
Локальная модель (llama.cpp)¶
# config.yaml
llm:
provider: "local"
local:
model_path: ${LLMXCPG_MODEL_PATH}
n_gpu_layers: -1 # Все слои на GPU
n_ctx: 8192
Настройки поиска¶
retrieval:
embedding_model: "all-MiniLM-L6-v2"
top_k_qa: 3 # Количество извлекаемых примеров вопросов и ответов
max_results: 50 # Максимальное количество результатов поиска
Ограничения запросов¶
query:
default_limit: 100 # Значение LIMIT по умолчанию для SQL
max_limit: 1000 # Максимально допустимое значение LIMIT
Приложение: Все 16 сценариев¶
| № | Название | Для кого подходит | Пример запроса |
|---|---|---|---|
| 01 | Онбординг | Новые разработчики | “Где определена функция X?” |
| 02 | Аудит безопасности | Команда безопасности | “Найти уязвимости к SQL-инъекциям” |
| 03 | Документация | Технические писатели | “Создать документацию для функции X” |
| 04 | Разработка функций | Добавление новых возможностей | “Куда добавить новый хук?” |
| 05 | Рефакторинг | Очистка кода | “Найти неиспользуемый код в модуле X” |
| 06 | Производительность | Оптимизация | “Найти узкие места в производительности” |
| 07 | Покрытие тестами | Команда тестирования | “Какие функции не покрыты тестами?” |
| 08 | Соответствие требованиям | Аудиторы | “Проверить соответствие OWASP Top 10” |
| 09 | Код-ревью | Ревьюеры | “Проверить этот патч” |
| 10 | Межрепозиторные связи | Архитекторы | “Найти зависимости между репозиториями” |
| 11 | Архитектура | Архитекторы | “Найти нарушения уровневой архитектуры” |
| 12 | Технический долг | Менеджеры | “Оценить объём технического долга” |
| 13 | Массовый рефакторинг | Крупные изменения | “Переименовать все X в Y” |
| 14 | Реагирование на инциденты | Безопасность | “Отследить вектор атаки” |
| 15 | Отладка | Разработчики | “Найти точки для отладки” |
| 16 | Точки входа | Безопасность | “Перечислить все API-эндпоинты” |
Руководство по выбору сценариев¶
Для разработчиков: - Первый день: Сценарий 01 (Онбординг) - Разработка функций: Сценарий 04 (Разработка функций) - Исправление ошибок: Сценарий 15 (Отладка) - Очистка кода: Сценарий 05 (Рефакторинг)
Для QA / тестировщиков: - Пробелы в покрытии: Сценарий 07 (Покрытие тестами) - Код-ревью: Сценарий 09 (Код-ревью) - Метрики качества: Сценарий 12 (Технический долг)
Для специалистов по безопасности: - Поиск уязвимостей: Сценарий 02 (Аудит безопасности) - Соответствие стандартам: Сценарий 08 (Соответствие требованиям) - Инциденты: Сценарий 14 (Реагирование на инциденты) - Атакуемая поверхность: Сценарий 16 (Точки входа)
Для технических писателей: - Документация API: Сценарий 03 (Документация) - Архитектура: Сценарий 11 (Архитектура) - Зависимости: Сценарий 10 (Межрепозиторные связи)
Отчёты о проверке безопасности (CLI)¶
Обзор¶
CodeGraph предоставляет инструмент командной строки (CLI) для создания полных отчётов о проверке безопасности.
Отчёты могут быть сгенерированы в нескольких форматах (Markdown, JSON, SARIF) с поддержкой локализации (английский, русский).
Сценарий: Проверка безопасности проекта на Django¶
Ситуация: Инженеру по безопасности необходимо проверить проект на Django перед развертыванием в продакшене.
Шаг 1: Выполнение полного сканирования безопасности¶
python -m src.cli.security_audit full \
--path /path/to/django/project \
--output-dir ./security_reports \
--language ru
Шаг 2: Просмотр сгенерированного отчёта¶
Инструмент создаёт три файла:
security_report.md— читаемый отчёт в формате Markdownsecurity_report.json— машинно-читаемый JSON для CI/CDsecurity_report.sarif— формат GitHub Security Alerts
Пример вывода (Markdown)¶
# Отчёт по безопасности: My Django Project
**Путь к проекту:** `/path/to/django/project`
**Время аудита:** 2025-12-09 20:43:19
**Проанализировано файлов:** 88
Краткое резюме¶
| Серьёзность | Количество |
|---|---|
| 🔴 КРИТИЧЕСКИЙ | 2 |
| 🟠 ВЫСОКИЙ | 6 |
| 🟡 СРЕДНИЙ | 2 |
🔴 КРИТИЧЕСКИЙ уровень уязвимости (2)¶
1. SECRET_KEY с резервным значением (сканирование файлов)¶
Файл: backend/settings.py:25
CWE: CWE-798
Описание: SECRET_KEY имеет небезопасное резервное (fallback) значение
Уязвимый код:
SECRET_KEY = os.environ.get('SECRET_KEY', 'insecure-fallback')
Рекомендация:
Удалите резервное значение: SECRET_KEY = os.environ["SECRET_KEY"]
Сценарий: Быстрая проверка безопасности¶
Ситуация: Разработчик хочет выполнить быструю проверку на уязвимости перед коммитом.
python -m src.cli.security_audit quick --path .
╭─────────────────── Результаты быстрой проверки ───────────────────╮
│ │
│ Проверено файлов: 45 │
│ Время: 0.3с │
│ │
│ Обнаружено: │
│ 🔴 Критические: 0 │
│ 🟠 Высокие: 2 │
│ 🟡 Средние: 1 │
│ │
│ Запустите 'security-audit full', чтобы получить подробный отчёт │
│ │
╰─────────────────────────────────────────────────────────────────╯
Сценарий: Интеграция в CI/CD¶
Ситуация: Добавление проверок безопасности в пайплайн GitLab CI.
.gitlab-ci.yml¶
security-audit:
stage: test
script:
- pip install -r requirements.txt
- python -m src.cli.security_audit full \
--path . \
--output-dir ./security_reports \
--format json,sarif
- |
CRITICAL=$(jq '.summary.critical_issues' security_reports/security_report.json)
if [ "$CRITICAL" -gt 0 ]; then
echo "❌ Обнаружены критические уязвимости!"
exit 1
fi
artifacts:
paths:
- security_reports/
reports:
sast: security_reports/security_report.sarif
Программное использование¶
Ситуация: Генерация отчётов из кода на Python.
from src.security.file_scanner import FileSecurityScanner
from src.security.report_generator import ReportGenerator
# Инициализация сканера
scanner = FileSecurityScanner()
# Запуск сканирования
result = scanner.scan_project('/path/to/project')
# Генерация отчёта
generator = ReportGenerator()
report = generator.create_report(
project_name='My Project',
project_path=result.project_path,
scan_result=result
)
# Сохранение в нескольких форматах
output_files = generator.save_report(
output_dir='./reports',
formats=['markdown', 'json', 'sarif'],
language='ru' # Локализация на русский язык
)
print(f"Отчёт сохранён в: {output_files['markdown']}")
Обнаруживаемые шаблоны уязвимостей¶
Сканер безопасности выявляет шаблоны, специфичные для Django/Python:
| ID шаблона | Уровень серьёзности | Описание |
|---|---|---|
| FILE_SECRET_FALLBACK_001 | Критический | SECRET_KEY с небезопасным резервным значением |
| FILE_DJANGO_DEBUG_001 | Критический | DEBUG=True в продакшене |
| FILE_CORS_001 | Высокий | CORS_ALLOW_ALL_ORIGINS=True |
| FILE_HOSTS_001 | Высокий | ALLOWED_HOSTS=[‘*’] |
| FILE_DB_001 | Высокий | Стандартный пароль базы данных |
| FILE_JWT_001 | Высокий | Срок действия JWT-токена > 24 часов |
| FILE_PATH_001 | Высокий | Риск перехода по путям (path traversal) |
| FILE_DEBUG_PERM_001 | Высокий | Права доступа зависят от DEBUG |
| FILE_TOOLBAR_001 | Средний | Debug toolbar включён безусловно |
| FILE_PAGESIZE_001 | Средний | PAGE_SIZE > 1000 (риск DoS) |
Раздел соответствия D3FEND¶
Отчёты включают соответствие стандарту MITRE D3FEND по повышению защищённости исходного кода:
Соответствие D3FEND укреплению исходного кода¶
| Техника | Название | Статус | Применимость |
|---|---|---|---|
| D3-CS | Очистка учётных данных | ✅ | Применимо для Python |
| D3-DLV | Валидация доменной логики | ✅ | Применимо для Python |
| D3-OLV | Валидация операционной логики | ✅ | Применимо для Python |
| D3-VI | Инициализация переменных | N/A | Только C/C++ |
Общий показатель соответствия: 100% (3/3 применимых техник)
Типовые рабочие процессы¶
Ежедневная проверка безопасности¶
# Утренний анализ безопасности
/select 02
> Найти уязвимости в недавно изменённых файлах
/review git
/exit
Еженедельная проверка качества кода¶
# Еженедельный анализ качества
/select 05
> Найти неиспользуемый код, появившийся на этой неделе
/select 12
> Показать сводку по техническому долгу
/select 07
> Какие новые функции не покрыты тестами?
Аудит перед релизом¶
# Перед основным релизом
/select 08
> Сгенерировать отчёт о соответствии OWASP Top 10
/select 02
> Найти все критические уязвимости
/review git --format json > audit_report.json
Онбординг нового разработчика¶
# Настройка первого дня
/select 01
> Объясни общую архитектуру
> Какие основные подсистемы существуют?
> С какого места лучше начать изучение кода?
/save onboarding_session
Темы¶
Доступные темы¶
| Тема | Описание |
|---|---|
| default | Акценты бирюзового цвета, сбалансированный контраст |
| dark | Акценты пурпурного цвета, подходит для тёмного фона |
| light | Акценты синего цвета, подходит для светлого терминала |
Использование тем¶
# Через командную строку
python -m src.tui.app --theme dark
# В config.yaml
tui:
theme: dark
Элементы темы¶
Темы настраивают: - Цвета заголовка и подзаголовка - Цвета сообщений (пользователя, ассистента, системы, ошибки) - Цвета рамок - Индикаторы сценариев - Подсветку кода - Индикаторы выполнения
Сессии¶
Автоматическое управление сессиями¶
Сессии автоматически: - Создаются при запуске TUI - Сохраняются периодически во время использования - Сохраняются при выходе
Ручное управление сессиями¶
/save # Сохранить текущую сессию
/save analysis_v2 # Сохранить с указанием пользовательского имени
/load # Вывести список сессий
/load analysis_v2 # Загрузить конкретную сессию
Содержимое сессии¶
Сессии содержат: - Историю диалога - Текущий сценарий - Состояние конфигурации - Контекст проекта - Метаданные (временные метки, количество сообщений)
Расположение хранилища сессий¶
По умолчанию: ./sessions/
Пользовательский путь: python -m src.tui.app --session-dir /путь/к/сессиям
Советы и рекомендации¶
Горячие клавиши¶
| Клавиша | Действие |
|---|---|
| Ctrl+C | Отменить текущий ввод |
| Ctrl+D | Выйти (с подтверждением) |
| Стрелка вверх | Предыдущая команда (readline) |
| Стрелка вниз | Следующая команда (readline) |
Псевдонимы команд¶
| Псевдоним | Команда |
|---|---|
| /h | /help |
| /q | /exit |
| /quit | /exit |
| /stats | /stat |
| /sql | /query |
| /proj | /project |
| /grp | /group |
| /sess | /session |
| /whoami | /auth me |
Эффективные рабочие процессы¶
Быстрый аудит безопасности:
/select 2
Найти уязвимости к SQL-инъекциям
Найти риски командных инъекций
Найти уязвимости к XSS
Исследование кода:
/select 1
Что делает функция main?
Покажи граф вызовов для функции X
Процесс проверки кода:
/review git
# Просмотр результатов
/save security_review_dec9
Советы по запросам¶
- Будьте конкретны: “Найти SQL-инъекции в модуле аутентификации” лучше, чем “Найти SQL-инъекции”
- Используйте контекст сценария: Выберите подходящий сценарий перед выполнением запроса
- Сначала проверьте статистику: Используйте
/stat, чтобы понять размер базы данных - Используйте SQL для точности:
/query SELECT * FROM nodes_method WHERE name LIKE '%auth%'
Устранение неполадок¶
Распространённые проблемы¶
«Copilot недоступен»¶
Причина: ChromaDB не установлен или инициализация не удалась.
Решения:
pip install chromadb
# или
pip install -r requirements.txt
«База данных не найдена»¶
Причина: Отсутствует база данных CPG.
Решения: 1. Импортируйте проект:
bash
python -m src.cli.import_commands full --path ./mycode
- Проверьте конфигурацию проекта:
bash
/project list
«Ошибка поставщика LLM»¶
Причина: Отсутствуют учётные данные API.
Решения: 1. Проверьте переменные окружения:
bash
echo $GIGACHAT_CREDENTIALS
echo $OPENAI_API_KEY
- Проверьте config.yaml:
bash
/config llm
Медленные ответы¶
Причина: Большая база данных или задержка в сети.
Решения:
1. Проверьте статистику базы данных: /stat
2. Используйте более конкретные запросы
3. Рассмотрите возможность использования локального поставщика LLM
4. Уменьшите размер контекста в config.yaml:
yaml
llm:
local:
n_ctx: 4096 # Уменьшить с 8192
Проблемы с кодировкой символов (Windows)¶
Причина: Несоответствие кодировки терминала.
Решения:
# Установите UTF-8 в PowerShell
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
# Или используйте Windows Terminal (рекомендуется)
Режим отладки¶
Включите логирование отладки для диагностики:
python -m src.tui.app --debug
Это позволяет увидеть: - Вызовы API LLM - Запросы к базе данных - Операции поиска - Трассировки ошибок
Файлы журналов (логов)¶
Журналы записываются в файл logs/tui.log (если настроено).
Получение помощи¶
- Введите
/helpдля справки по командам - Введите
/help <команда>для справки по конкретной команде - Проверьте логи в каталоге
logs/ - Сообщите о проблемах: https://github.com/anthropics/claude-code/issues
Смотрите также¶
- Руководство CLI — Интерфейс командной строки
- Сценарии — Использование сценариев в программном коде
- REST API — Справочник по HTTP API
- Безопасность — Функции безопасности
Создано для CodeGraph v1.0