treeedb facilite le début de l'écriture d'une analyse de programme au niveau de la source dans Soufflé Datalog. Tout d'abord, treeedb génère des types de soufflé et des relations qui représentent l'AST d'un programme. Ensuite, treeedb analyse le code source et émet des faits qui peuplent ces relations.
treeedb soutient actuellement l'analyse de ces langues:
Les analyseurs et les AST de treeedb sont basés sur des grammaires d'arbre-itters, et il est très facile d'ajouter un support pour n'importe quelle langue avec une grammaire d'arbre-itters.
Le nom treeedb est un Portmanteau de "Tree-Sitter" avec "EDB", où EDB signifie "Extensional Database" et fait référence à l'ensemble des faits dans un programme de datalog.
Vous aurez besoin de deux artefacts pour chaque langage de programmation que vous souhaitez analyser:
Par exemple, pour Java, ceux-ci sont appelés treeedb-java.dl et treeedb-java , respectivement.
Pour analyser réellement un code, vous devrez également installer Soufflé.
Accédez à la version la plus récente de la page des versions et téléchargez les artefacts liés à la langue que vous souhaitez analyser. Les exécutables prédéfinis sont liés statiquement, mais sont actuellement disponibles uniquement pour Linux.
Vous pouvez créer une version publiée de Crates.io. Vous aurez besoin du compilateur de rouille et de l'outil de construction de cargaison. La rustup rend très facile les obtenir. Ensuite, pour installer les outils pour la langue <LANG> , exécutez:
cargo install treeedb-<LANG> treeedbgen-souffle-<LANG>
Cela installera des binaires sur ~/.cargo/bin . Pour générer le fichier de données de données, exécutez le binaire treeedbgen-souffle-<LANG> .
Malheureusement, les binaires liés à Java ne sont pas encore disponibles sur Crates.io.
Pour construire à partir de Source, vous aurez besoin du compilateur de rouille et de l'outil de construction de cargaison. La rustup rend très facile les obtenir.
Ensuite, obtenez la source:
git clone https://github.com/langston-barrett/treeedb
cd treeedbEnfin, construisez tout:
cargo build --release Vous pouvez trouver les binaires treeedb-<LANG> dans target/release . Pour générer le fichier de données de données, exécutez le binaire treeedbgen-souffle-<LANG> correspondant.
Pour suivre cet exemple, suivez les instructions d'installation pour Java. Ensuite, créez un fichier Java nommé Main.java :
class Main {
public static void main ( String [] args ) {
int x = 2 + 2 ;
}
} (Les fichiers indiqués dans cette section sont également disponibles dans examples/java/ .)
Créez un fichier de datalog nommé const-binop.dl qui inclut treeedb-java.dl et a une règle pour trouver des expressions binaires à valeur constante:
#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)
Générer les fichiers d'entrée ( node.csv et field.csv ):
treeedb-java Main.javaEnfin, exécutez l'analyse avec Soufflé:
souffle const-binop.dlVous verrez quelque chose comme ceci:
---------------
const_binop
===============
94001952741472
===============
---------------
show_const_binop
===============
2 + 2
===============
Pour voir quel type et des noms de relation sont disponibles, regardez treeedb-<LANGUAGE>.dl . S'il n'est pas évident dans quelle partie de la langue à laquelle un type ou une relation donnée correspond, jetez un œil à la grammaire d'arbre-sitter (par exemple grammaire.js dans le repo arbre-sitter-java pour java).
Avant d'écrire une analyse de programme dans Datalog, vous devez déterminer (1) comment représenter le programme en tant que relations, et (2) comment ingérer des programmes dans cette représentation. Les projets de données de la technologie de pointe font tout cela "à la main":
analysis-input.dl (1). La rédaction de ces représentations et d'outils d'ingestion prend un temps précieux et distrait du travail de rédaction des analyses. treeedb vise à l'automatiser, en installant le même créneau que ces outils.
treeedb : générer des faits de datalog à partir d'arbres d'analyse d'arbretreeedb-c : générer des faits de datalog à partir du code source Ctreeedb-csharp : générer des faits de datalog à partir du code source C #treeedbgen : Parse Node-Types.json d'une grammaire d'arbre-sittertreeedbgen-souffle : Générez des types de soufflé et des relations à partir de grammaires d'arbres-sittertreeedbgen-souffle-c : générer des types de soufflé et des relations à partir de la grammaire C Tree-Sittertreeedbgen-souffle-csharp : Générez des types de soufflé et des relations à partir de la grammaire C # Tree-Sittertreeedbgen-souffle-java : Générez des types de soufflé et des relations de la grammaire Java Tree-Sittertreeedbgen-souffle-javascript : Générez des types de Soufflé et des relations de la grammaire JavaScript Tree-Sittertreeedbgen-souffle-rust : Générez des types de soufflé et des relations de la grammaire de la rouille Tree-Sittertreeedbgen-souffle-souffle : Générez des types de soufflé et des relations de la grammaire Soufflé Tree-Sittertreeedbgen-souffle-swift : Générez des types de soufflé et des relations à partir de la grammaire Swift Tree-Sittertreeedb-java : générer des faits de données de données à partir du code source Javatreeedb-javascript : générer des faits de datalg à partir du code source JavaScripttreeedb-rust : générer des faits de données de données à partir du code source de la rouilletreeedb-souffle : générer des faits de données de données à partir du code source Soufflétreeedb-swift : générer des faits de données à partir du code source Swift Merci de votre intérêt pour treeedb ! Nous accueillons et apprécions toutes sortes de contributions. N'hésitez pas à déposer et à émettre ou d'ouvrir une demande de traction.
Comme expliqué dans l'installation, il existe deux outils impliqués dans l'analyse à l'appui de chaque langage de programmation: l'un pour générer des types et des relations de sufflé (par exemple, treeedbgen-souffle-c ), et un autre pour analyser le langage analysé et émettre des faits (par exemple, treeedb-c ).
Pour ajouter une nouvelle langue:
treeedb-<LANG> et treeedbgen-souffle-<LANG> avec la même structure que celle existante (il pourrait être plus facile de simplement copier récursivement ceux existants).Cargo.toml de niveau supérieur.toml..github/workflows/release.yml en copiant et en modifiant les lignes existantes pour d'autres langues.Voir PR # 9 pour un exemple complet.
Le script ./scripts/add-language.sh automatise quelques-unes de ces étapes - mais ce n'est pas nécessairement une solution clé en main. Exemple d'utilisation:
bash scripts/add-language.sh python Python