Code Property Graph: следующее поколение анализа кода
AST + CFG + PDG + DDG в едином queryable графе. 33 аналитических пассов. 11 языков. 2-3 мс на запрос.
Что такое Code Property Graph
Единая структура данных для глубокого анализа кода
AST — синтаксис
Abstract Syntax Tree отражает структуру кода: функции, вызовы, переменные, операторы. Это то, что видят SonarQube и Semgrep.
CFG — поток управления
Control Flow Graph показывает порядок выполнения инструкций: ветвления, циклы, условия. Без CFG невозможен анализ достижимости.
PDG — зависимости
Program Dependence Graph связывает данные с управлением: какая переменная от чего зависит, какие инструкции влияют друг на друга.
DDG — потоки данных
Data Dependency Graph прослеживает, как значения переменных распространяются между инструкциями и функциями — основа для taint analysis.
CPG объединяет все четыре графа в единую структуру. Это позволяет задавать вопросы, которые невозможны на уровне отдельных представлений: «Существует ли путь от пользовательского ввода до SQL-запроса без валидации?»
Почему CPG находит то, что AST пропускает
Pattern matching видит синтаксис. CPG видит семантику.
AST-based инструменты
- Сопоставляют шаблоны с деревом синтаксиса
- Не видят межпроцедурные зависимости
- Не отслеживают потоки данных между файлами
- Не знают, прошли ли данные валидацию
- Результат: 80-91% ложных срабатываний
CPG-based анализ (CodeGraph)
- Строит полный граф зависимостей по данным
- Межпроцедурный taint analysis: source → sink
- Видит пути данных через 5-10 функций в разных файлах
- Учитывает валидацию, санитизацию, type conversion
- Результат: 12% ложных срабатываний
Пример: SQL-инъекция через 3 функции
Функция get_input() в файле A читает пользовательский ввод. Функция process() в файле B передаёт его дальше. Функция query() в файле C вставляет в SQL-запрос.
AST-based SAST: Не видит связи между тремя файлами. Уязвимость пропущена.
CPG (CodeGraph): Строит taint-путь: get_input() → process() → query() → PQexec(). Уязвимость найдена за 2,3 мс.
Архитектура CodeGraph
Нативный Go-бинарник. Без JVM. 33 аналитических пассов.
Source Files → Frontend (per-file) → DiffGraph → Pass Pipeline (DAG) → DuckDB
│ │
Orchestrator CPGGraph (in-memory)
(parallel workers per file) (zero SQL during passes)
Фазы пассов:
1. Base: MetaData, File, Namespace
2. Types: TypeNode, TypeDecl, Inheritance
3. Control Flow: CFG, Dominator, PostDominator, CDG
4. Import Resolution + Call Graph
5. Data Flow: ReachingDef, Interprocedural ReachingDef
6. Type Propagation + Return Type Propagation
7. PDG + DDG
8. Enrichment: Metrics, Comments, Containment
9. Pattern Matching (70+ YAML rules)
CodeGraph vs Joern
Production-ready CPG без JVM
| Критерий | Joern | CodeGraph |
|---|---|---|
| Рантайм | JVM (Scala) | Нативный Go (без JVM) |
| Хранилище | OverflowDB (in-memory) | DuckDB (персистентный) |
| Языки | 6 (C, C++, Java, JS, Python, PHP) | 11 (+ Go, TS, Kotlin, C#, 1С) |
| Инкрементальные обновления | Нет (полный перепарсинг) | Да (git diff-based, секунды) |
| Структурный поиск | Через Scala DSL | YAML-правила (70+ готовых) |
| CI/CD интеграция | Ручная настройка | Готовые GitHub Actions / GitLab CI |
| Enterprise (DLP, SIEM, RBAC) | Нет | Встроено |
| Производительность | Базовая | 3-5x быстрее (нет JVM overhead) |
Вопросы и ответы
Code Property Graph (CPG) — единая структура данных, объединяющая AST (синтаксис), CFG (поток управления), PDG (зависимости по управлению) и DDG (зависимости по данным) в один граф. Это позволяет анализировать код на глубинном уровне: отслеживать потоки данных между функциями, находить уязвимости через taint analysis, выявлять архитектурные зависимости.
AST отражает только синтаксическую структуру кода — «что написано». CPG добавляет два критичных измерения: поток управления (CFG) — «как выполняется», и зависимости по данным (PDG/DDG) — «откуда что зависит». Без этих измерений невозможен межпроцедурный анализ: инструмент не может отследить, что пользовательский ввод из файла A проходит через функцию в файле B и попадает в SQL-запрос в файле C.
Joern — академический CPG-инструмент на JVM (Scala). CodeGraph — production-ready решение на Go: нативный бинарник без JVM, DuckDB вместо in-memory OverflowDB, 11 языков (vs 6), инкрементальные обновления за секунды, 70+ YAML-правил для структурного поиска, встроенные enterprise-функции (DLP, SIEM, RBAC). Производительность в 3-5x выше за счёт отсутствия JVM overhead.
11 языков на промышленном уровне: C, C++, Go, Python, JavaScript, TypeScript, Java, Kotlin, C#, PHP, 1С:Предприятие. Каждый фронтенд генерирует полный CPG с поддержкой межпроцедурного анализа.
Готовы изучить CPG?
Посмотрите, как Code Property Graph работает на вашей кодовой базе. 11 языков, 33 аналитических пассов, результат за минуты.