treeedb erleichtert das Schreiben einer Programmanalyse auf Quellenebene in Soufflé Datalog. Erstens generiert treeedb Soufflé -Typen und -Belationen, die das AST eines Programms darstellen. Anschließend speichert treeedb den Quellcode und emittiert Fakten, die diese Beziehungen bevölkern.
treeedb unterstützt derzeit die Analyse dieser Sprachen:
Die Parsers und ASTs von treeedb basieren auf Baumstatter-Grammatiken, und es ist sehr einfach, Unterstützung für jede Sprache mit einer Baumstatter-Grammatik zu unterstützen.
Der Name treeedb ist ein Portmanteau von "Tree-Sitter" mit "EDB", bei dem EDB für "Erweiterungsdatenbank" steht und sich auf die Fakten in einem Datalog-Programm bezieht.
Für jede Programmiersprache, die Sie analysieren möchten, benötigen Sie zwei Artefakte:
Zum Beispiel werden für Java diese als treeedb-java.dl bzw. treeedb-java bezeichnet.
Um einen Code tatsächlich zu analysieren, müssen Sie auch Soufflé installieren.
Navigieren Sie zur neuesten Veröffentlichung der Releases -Seite und laden Sie die Artefakte im Zusammenhang mit der Sprache herunter, die Sie analysieren möchten. Die vorgefertigten ausführbaren Funktionen sind statisch verknüpft, sind jedoch derzeit nur für Linux verfügbar.
Sie können eine veröffentlichte Version von crate.io erstellen. Sie benötigen den Rost Compiler und das Cargo Build -Werkzeug. Rustup macht es sehr einfach, diese zu erhalten. Um die Tools für die Sprache <LANG> zu installieren, laufen Sie aus:
cargo install treeedb-<LANG> treeedbgen-souffle-<LANG>
Dadurch werden Binärdateien in ~/.cargo/bin installiert. Führen Sie zum Generieren der Datalog-Datei die treeedbgen-souffle-<LANG> Binary aus.
Leider sind die Java-bezogenen Binärdateien noch nicht auf crate.io verfügbar.
Um aus der Quelle zu bauen, benötigen Sie den Rost -Compiler und das Cargo Build -Werkzeug. Rustup macht es sehr einfach, diese zu erhalten.
Dann holen Sie sich die Quelle:
git clone https://github.com/langston-barrett/treeedb
cd treeedbEndlich alles bauen:
cargo build --release Sie finden die treeedb-<LANG> Binärdateien in target/release . Führen Sie zum Generieren der Datalog-Datei den entsprechenden treeedbgen-souffle-<LANG> -Kinär aus.
Befolgen Sie die Installationsanweisungen für Java, um dieses Beispiel zu befolgen. Erstellen Sie dann eine Java -Datei mit dem Namen Main.java :
class Main {
public static void main ( String [] args ) {
int x = 2 + 2 ;
}
} (Die in diesem Abschnitt angegebenen Dateien sind auch in examples/java/ .)
Erstellen Sie eine Datalog-Datei namens const-binop.dl , die treeedb-java.dl enthält und eine Regel hat, um konstante binäre Ausdrücke zu finden:
#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)
Generieren Sie die Eingabedateien ( node.csv und field.csv ):
treeedb-java Main.javaSchließlich führen Sie die Analyse mit Soufflé aus:
souffle const-binop.dlSie werden so etwas sehen:
---------------
const_binop
===============
94001952741472
===============
---------------
show_const_binop
===============
2 + 2
===============
Um zu sehen, welche Art und Beziehungsnamen verfügbar sind, schauen Sie sich treeedb-<LANGUAGE>.dl an. Wenn nicht ersichtlich ist, welcher Teil der Sprache ein bestimmter Typ oder eine bestimmte Beziehung entspricht, schauen Sie sich die Baum-Sitter-Grammatik an (z. B. Grammatik.js im Baumstitter-Java-Repo für Java).
Bevor Sie eine Programmanalyse in Datalog schreiben, müssen Sie (1) herausfinden, wie das Programm als Beziehungen dargestellt wird, und (2) wie Programme in diese Darstellung eingenommen werden können. Stand der Technik DATALOG-Projekte machen all dies "von Hand":
analysis-input.dl (1). Das Schreiben dieser Darstellungen und Einnahmewerkzeuge erfordert wertvolle Zeit und lenkt von der Arbeit der Schreibanalysen ab. treeedb zielt darauf ab, es zu automatisieren und in die gleiche Nische zu passen wie diese Werkzeuge.
treeedb : Generieren Sie Datalog-Fakten aus Baumstatter analysieren Bäumetreeedb-c : Datalog-Fakten aus C-Quellcode generierentreeedb-csharp : Generieren Sie Datalog-Fakten aus C# Quellcodetreeedbgen : Node-Type.json aus einer Baum-Sitter-Grammatik analysierentreeedbgen-souffle : Soufflé-Typen und -beziehungen aus Baum-Sitter-Grammatiken erzeugentreeedbgen-souffle-c : Soufflé-Typen und -beziehungen aus der C-Baum-Sitter-Grammatik erzeugentreeedbgen-souffle-csharp : Soufflé-Typen und -beziehungen aus der C# Tree-Sitter-Grammatik generierentreeedbgen-souffle-java : Soufflé-Typen und -beziehungen aus der Java-Baum-Sitter-Grammatik erzeugentreeedbgen-souffle-javascript : Generieren Sie Soufflé-Typen und -beziehungen aus der JavaScript-Baum-Sitter-Grammatiktreeedbgen-souffle-rust : Erzeugen Sie Soufflé-Typen und -beziehungen aus der Rostbaum-Sitter-Grammatiktreeedbgen-souffle-souffle : Soufflé-Typen und -beziehungen aus der Soufflé-Baum-Sitter-Grammatik erzeugentreeedbgen-souffle-swift : Soufflé-Typen und -beziehungen aus der Swift-Baum-Sitter-Grammatik erzeugentreeedb-java : Generieren Sie Datalog-Fakten aus dem Java-Quellcodetreeedb-javascript : Generieren Sie Datalog-Fakten aus JavaScript-Quellcodetreeedb-rust : Generieren Sie Datalog-Fakten aus dem Rust-Quellcodetreeedb-souffle : Generieren Sie Datalog-Fakten aus Soufflé Quellcodetreeedb-swift : Generieren Sie Datalog-Fakten aus dem Swift-Quellcode Vielen Dank für Ihr Interesse an treeedb ! Wir begrüßen und schätzen alle möglichen Beiträge. Bitte zögern Sie nicht, eine Pull -Anfrage einzureichen und zu geben oder zu öffnen.
Wie in der Installation erläutert, gibt es zwei Tools, die an der Analyse jeder Programmiersprache unterstützt werden: eine zum Generieren von Soufflé-Typen und -beziehungen (z. B. treeedbgen-souffle-c ) und eine andere, um die zu analysierte Sprache zu analysieren und Fakten zu emittieren (z. B. treeedb-c ).
Eine neue Sprache hinzufügen:
treeedb-<LANG> und treeedbgen-souffle-<LANG> mit der gleichen Struktur wie eine vorhandene (es ist möglicherweise am einfachsten, vorhandene rekursiv zu kopieren).Cargo.toml hinzu..github/workflows/release.yml hinzu, indem Sie vorhandene Zeilen für andere Sprachen kopieren und ändern.Ein komplettes Beispiel finden Sie in PR #9.
Das Skript ./scripts/add-language.sh automatisiert einige dieser Schritte-es ist jedoch nicht unbedingt eine Turn-Key-Lösung. Verwendungsbeispiel:
bash scripts/add-language.sh python Python