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)
33
аналитических пассов
11
языков программирования
2-3 мс
время запроса
~30 мин
индексация 1M строк

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 аналитических пассов, результат за минуты.

Изучить технологию Запросить демо
Читать Whitepaper