treeedb使用すると、SouffléDatalogでソースレベルのプログラム分析の作成を簡単に作成できます。まず、 treeedb 、プログラムのASTを表すスフレタイプと関係を生成します。次に、 treeedbソースコードを解析し、それらの関係に登場する事実を放出します。
treeedb現在、これらの言語の分析をサポートしています。
treeedbのパーサーとASTは、ツリーシッターの文法に基づいており、ツリーシッター文法を備えたあらゆる言語のサポートを追加するのは非常に簡単です。
treeedbという名前は、「EDB」を備えた「ツリーシッター」のポートマントーであり、EDBは「拡張データベース」を表し、Datalogプログラムの一連の事実を指します。
分析するプログラミング言語ごとに2つのアーティファクトが必要です。
たとえば、Javaの場合、これらはそれぞれtreeedb-java.dlとtreeedb-javaと呼ばれます。
実際にいくつかのコードを分析するには、Souffléをインストールする必要があります。
リリースページの最新のリリースに移動し、分析する言語に関連するアーティファクトをダウンロードします。事前に構築された実行可能ファイルは静的にリンクされていますが、現在Linuxでのみ利用できます。
crates.ioからリリースバージョンを構築できます。 Rustコンパイラと貨物ビルドツールが必要です。 Rustupはこれらを簡単に入手できます。次に、言語<LANG>のツールをインストールするには、実行してください。
cargo install treeedb-<LANG> treeedbgen-souffle-<LANG>
これにより~/.cargo/binにバイナリがインストールされます。 DataLogファイルを生成するには、 treeedbgen-souffle-<LANG>バイナリを実行します。
残念ながら、Java関連のバイナリはまだcrates.ioで入手できません。
ソースから構築するには、Rustコンパイラと貨物ビルドツールが必要です。 Rustupはこれらを簡単に入手できます。
次に、ソースを取得します。
git clone https://github.com/langston-barrett/treeedb
cd treeedb最後に、すべてを構築します。
cargo build --release target/releaseでtreeedb-<LANG>バイナリを見つけることができます。 DataLogファイルを生成するには、対応するtreeedbgen-souffle-<LANG>バイナリを実行します。
この例に従うには、Javaのインストール手順に従ってください。次に、 Main.javaという名前のJavaファイルを作成します。
class Main {
public static void main ( String [] args ) {
int x = 2 + 2 ;
}
} (このセクションに示されているファイルは、 examples/java/でも入手できます。)
treeedb-java.dlを含むconst-binop.dlという名前のdatalogファイルを作成し、定数値のバイナリ式を見つけるルールがあります。
#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 and field.csv )を生成します。
treeedb-java Main.java最後に、スフレで分析を実行します。
souffle const-binop.dlあなたはこのようなものを見るでしょう:
---------------
const_binop
===============
94001952741472
===============
---------------
show_const_binop
===============
2 + 2
===============
どのタイプと関係名が利用可能かを確認するには、 treeedb-<LANGUAGE>.dlをご覧ください。特定のタイプまたは関係の言語のどの部分が対応するかが明らかではない場合は、ツリーシッターの文法(Javaのツリーシッタージャバレポのgrammar.jsなど)を見てください。
Datalogでプログラム分析を作成する前に、(1)プログラムを関係として表現する方法と(2)プログラムをその表現に摂取する方法を把握する必要があります。最先端のDatalogプロジェクトは、これをすべて「手で」行います。
analysis-input.dl (1)があります。これらの表現と摂取ツールを書くことは、貴重な時間を占め、分析を書く作業から気を散らします。 treeedb 、これらのツールと同じニッチに適合し、自動化することを目指しています。
treeedb :ツリーシッター解析ツリーからDatalogファクトを生成しますtreeedb-c :CソースコードからDatalogファクトを生成しますtreeedb-csharp :C#ソースコードからDatalogファクトを生成しますtreeedbgen :ツリーシッター文法からのparse node-types.jsontreeedbgen-souffle :ツリーシッター文法からスフレタイプと関係を生成するtreeedbgen-souffle-c :c tree-sitter文法からスフレタイプと関係を生成するtreeedbgen-souffle-csharp :c#tree-sitter文法からスフレタイプと関係を生成するtreeedbgen-souffle-java :javaツリーシッター文法からスフレタイプと関係を生成するtreeedbgen-souffle-javascript :javascript tree-sitter文法からスフレタイプと関係を生成するtreeedbgen-souffle-rust :錆びたツリーシッターの文法からスフレタイプと関係を生成するtreeedbgen-souffle-souffle :スフレのタイプと関係を生成します。treeedbgen-souffle-swift :迅速なツリーシッター文法からスフレタイプと関係を生成するtreeedb-java :JavaソースコードからDatalogファクトを生成しますtreeedb-javascript :JavaScriptソースコードからDatalogファクトを生成しますtreeedb-rust :RustソースコードからDatalogファクトを生成しますtreeedb-souffle :SouffléソースコードからDatalogファクトを生成しますtreeedb-swift :SwiftソースコードからDatalogファクトを生成しますtreeedbに興味を持ってくれてありがとう!あらゆる種類の貢献を歓迎し、感謝しています。 Pullリクエストをお気軽にファイルして発行または開いてください。
インストールで説明されているように、各プログラミング言語の分析をサポートすることには2つのツールがあります。1つはスフレの種類と関係(たとえば、 treeedbgen-souffle-c )を生成し、もう1つは分析されている言語を解析し、事実を発します(例、 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