treeedb облегчает написание анализа программы на уровне источника в Soufflé Datalog. Во -первых, treeedb генерирует типы и отношения суфле, которые представляют AST программы. Затем treeedb анализирует исходный код и издает факты, которые заполняют эти отношения.
treeedb в настоящее время поддерживает анализ этих языков:
Парсеры и AST treeedb основаны на грамматике деревьев, и очень легко добавить поддержку любому языку с грамматикой дерева.
Название treeedb -это портманто «деревянного» с «EDB», где EDB означает «база данных расширения» и относится к набору фактов в программе Datalog.
Вам понадобится два артефакта для каждого языка программирования, который вы хотите проанализировать:
Например, для Java они называются treeedb-java.dl и treeedb-java , соответственно.
Чтобы фактически проанализировать код, вам также нужно установить Soufflé.
Перейдите к самому последнему выпуску на странице релизов и загрузите артефакты, связанные с языком, который вы хотите проанализировать. Предварительно построенные исполнители статически связаны, но в настоящее время доступны только для Linux.
Вы можете создать выпущенную версию с crates.io. Вам понадобится компилятор ржавчины и инструмент для сборки груза. Rustup позволяет очень легко получить их. Затем, чтобы установить инструменты для языка <LANG> , запустить:
cargo install treeedb-<LANG> treeedbgen-souffle-<LANG>
Это установит двоичные файлы в ~/.cargo/bin . Чтобы сгенерировать файл datalog, запустите treeedbgen-souffle-<LANG> .
К сожалению, двукратные двоичные файлы, связанные с Java, еще не доступны на Crates.io.
Чтобы построить из источника, вам понадобится компилятор ржавчины и инструмент для сборки груза. Rustup позволяет очень легко получить их.
Затем получите источник:
git clone https://github.com/langston-barrett/treeedb
cd treeedbНаконец, постройте все:
cargo build --release Вы можете найти двоичные файлы treeedb-<LANG> в target/release . Чтобы сгенерировать файл datalog, запустите соответствующую treeedbgen-souffle-<LANG> Binary.
Чтобы следовать этим примеру, следуйте инструкциям по установке для Java. Затем создайте файл Java с именем Main.java :
class Main {
public static void main ( String [] args ) {
int x = 2 + 2 ;
}
} (Файлы, показанные в этом разделе, также доступны в examples/java/ .)
Создайте файл datalog с именем const-binop.dl , который включает в себя treeedb-java.dl и имеет правило, чтобы найти постоянные бинарные выражения:
#include "treeedb-java.dl"
.decl const_binop(expr: JavaBinaryExpression)
const_binop(expr) :-
java_binary_expression(expr),
java_binary_expression_left_f(expr, l),
java_binary_expression_right_f(expr, r),
java_decimal_integer_literal(l),
java_decimal_integer_literal(r).
.decl show_const_binop(text: JavaNodeText)
show_const_binop(text) :-
const_binop(expr),
java_node_text(expr, text).
.output const_binop(IO=stdout)
.output show_const_binop(IO=stdout)
Сгенерируйте входные файлы ( node.csv и field.csv ):
treeedb-java Main.javaНаконец, запустите анализ с Soufflé:
souffle const-binop.dlВы увидите что -то вроде этого:
---------------
const_binop
===============
94001952741472
===============
---------------
show_const_binop
===============
2 + 2
===============
Чтобы увидеть, какие имена типа и отношения доступны, посмотрите на treeedb-<LANGUAGE>.dl . Если не очевидно, какая часть языка соответствует данному типу или соотношению, взгляните на грамматику деревьев (например, грамматика.
Прежде чем написать анализ программы в Datalog, вам нужно выяснить (1) как представить программу как отношения, и (2) как проглатывать программы в это представление. Современные проекты Datalog делают все это «вручную»:
analysis-input.dl (1). Написание этих представлений и инструментов приема проглатывания занимает ценное время и отвлекает от работы по написанию анализа. treeedb стремится автоматизировать его, вписываясь в ту же нишу, что и эти инструменты.
treeedb : генерируйте факты Datalog от деревьев деревьевtreeedb-c : генерируйте факты Datalog из исходного кода Ctreeedb-csharp : генерировать факты Datalog из исходного кода C#treeedbgen :treeedbgen-souffle : генерируйте суфле типы и отношения от грамматики деревьевtreeedbgen-souffle-c : генерируйте типы суфле и отношения из грамматики C Tree-Stitertreeedbgen-souffle-csharp : генерируйте типы суфле и отношения из грамматики C# Tree-Sittertreeedbgen-souffle-java : генерируйте типы суфле и отношения из грамматики Java Tree-Stitertreeedbgen-souffle-javascript : генерируйте типы суфле и отношения из грамматики дерева JavaScripttreeedbgen-souffle-rust : генерируйте типы суфле и отношения из грамматики деревья-деревьяtreeedbgen-souffle-souffle : генерируйте типы суфле и отношения из грамматики суфлеtreeedbgen-souffle-swift : генерируйте типы суфле и отношения из гимнатики Swift Tree-Stitertreeedb-java : генерировать факты Datalog из исходного кода Javatreeedb-javascript : генерируйте факты Datalog из исходного кода JavaScripttreeedb-rust : генерировать факты Datalog из исходного кода Rusttreeedb-souffle : генерируйте факты Datalog из исходного кода Soufflétreeedb-swift : генерируйте факты Datalog из исходного кода Swift Спасибо за интерес к treeedb ! Мы приветствуем и ценим все виды вкладов. Пожалуйста, не стесняйтесь подать и выпускать или открывать запрос на вытяжение.
Как объяснено в установке, есть два инструмента, связанные с поддержкой анализа каждого языка программирования: один для создания типов и отношений суфле (например, treeedbgen-souffle-c ), а другой, чтобы анализировать анализируемый язык и испускание фактов (например, treeedb-c ).
Чтобы добавить новый язык:
treeedb-<LANG> и treeedbgen-souffle-<LANG> с той же структурой, что и существующая (может быть легче всего просто повторить копировать существующие).Cargo.toml ..github/workflows/release.yml , копируя и изменяя существующие строки для других языков.Смотрите PR #9 для полного примера.
Сценарий ./scripts/add-language.sh автоматизирует несколько из этих шагов, но это не обязательно решение для ключей. Пример использования:
bash scripts/add-language.sh python Python