treeedb memudahkan untuk mulai menulis analisis program tingkat sumber di Souffle Datalog. Pertama, treeedb menghasilkan jenis dan hubungan souffle yang mewakili ast program. Kemudian, treeedb mem -parsing kode sumber dan memancarkan fakta yang mengisi hubungan tersebut.
treeedb saat ini mendukung analisis bahasa -bahasa ini:
Parser dan AST treeedb didasarkan pada tata bahasa pengasuh pohon, dan sangat mudah untuk menambah dukungan untuk bahasa apa pun dengan tata bahasa pengasuh pohon.
Nama treeedb adalah portmanteau dari "pengasuh pohon" dengan "EDB", di mana EDB adalah singkatan dari "Extensional Database" dan mengacu pada serangkaian fakta dalam program Datalog.
Anda akan membutuhkan dua artefak untuk setiap bahasa pemrograman yang ingin Anda analisis:
Misalnya, untuk Java ini masing-masing disebut treeedb-java.dl dan treeedb-java .
Untuk benar -benar menganalisis beberapa kode, Anda juga harus menginstal Souffle.
Arahkan ke rilis terbaru di halaman rilis dan unduh artefak yang terkait dengan bahasa yang ingin Anda analisis. Eksekusi pra-dibangun secara statis terkait, tetapi saat ini hanya tersedia untuk Linux.
Anda dapat membangun versi yang dirilis dari Crates.io. Anda akan membutuhkan kompiler karat dan alat pembuatan kargo. Rustup membuatnya sangat mudah untuk mendapatkan ini. Kemudian, untuk menginstal alat untuk bahasa <LANG> , jalankan:
cargo install treeedb-<LANG> treeedbgen-souffle-<LANG>
Ini akan menginstal binari ke ~/.cargo/bin . Untuk menghasilkan file datalog, jalankan biner treeedbgen-souffle-<LANG> .
Sayangnya, binari terkait Java belum tersedia di Crates.io.
Untuk membangun dari sumber, Anda akan membutuhkan kompiler karat dan alat pembuatan kargo. Rustup membuatnya sangat mudah untuk mendapatkan ini.
Kemudian, dapatkan sumbernya:
git clone https://github.com/langston-barrett/treeedb
cd treeedbAkhirnya, bangun semuanya:
cargo build --release Anda dapat menemukan binari treeedb-<LANG> di target/release . Untuk menghasilkan file datalog, jalankan biner treeedbgen-souffle-<LANG> yang sesuai.
Untuk mengikuti contoh ini, ikuti instruksi instalasi untuk Java. Kemudian, buat file java bernama Main.java :
class Main {
public static void main ( String [] args ) {
int x = 2 + 2 ;
}
} (File yang ditampilkan di bagian ini juga tersedia dalam examples/java/ .)
Buat file datalog bernama const-binop.dl yang mencakup treeedb-java.dl dan memiliki aturan untuk menemukan ekspresi biner bernilai konstan:
#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)
Hasilkan file input ( node.csv dan field.csv ):
treeedb-java Main.javaAkhirnya, jalankan analisis dengan souffle:
souffle const-binop.dlAnda akan melihat sesuatu seperti ini:
---------------
const_binop
===============
94001952741472
===============
---------------
show_const_binop
===============
2 + 2
===============
Untuk melihat jenis dan nama relasi apa yang tersedia, lihat treeedb-<LANGUAGE>.dl . Jika tidak terbukti, bagian mana dari bahasa yang sesuai dengan jenis atau hubungan yang diberikan, lihatlah tata bahasa pengasuh pohon (misalnya tata bahasa.
Sebelum menulis analisis program di Datalog, Anda perlu mencari tahu (1) bagaimana mewakili program sebagai hubungan, dan (2) cara mencerna program ke dalam representasi itu. Proyek datalog canggih melakukan semua ini "dengan tangan":
analysis-input.dl (1). Menulis representasi dan alat konsumsi ini membutuhkan waktu yang berharga dan mengalihkan perhatian dari pekerjaan analisis penulisan. treeedb bertujuan untuk mengotomatiskannya, menyesuaikan ceruk yang sama dengan alat -alat ini.
treeedb : menghasilkan fakta datalog dari pohon parse pengasuh pohontreeedb-c : menghasilkan fakta datalog dari kode sumber Ctreeedb-csharp : Hasilkan fakta datalog dari kode sumber C#treeedbgen : Parse node-types.json dari tata bahasa pengasuh pohontreeedbgen-souffle : Hasilkan jenis dan hubungan souffle dari tata bahasa pengasuh pohontreeedbgen-souffle-c : Hasilkan jenis dan hubungan souffle dari tata bahasa C Tree-Sittertreeedbgen-souffle-csharp : Hasilkan jenis dan hubungan souffle dari tata bahasa C#-pengasuh pohontreeedbgen-souffle-java : Hasilkan jenis dan hubungan souffle dari tata bahasa pengasuh pohon javatreeedbgen-souffle-javascript : Hasilkan jenis dan hubungan souffle dari tata bahasa pengasuh pohon javascripttreeedbgen-souffle-rust : Hasilkan jenis dan hubungan souffle dari tata bahasa pemecah pohon karattreeedbgen-souffle-souffle : Hasilkan jenis dan hubungan souffle dari tata bahasa pengasuh pohon souffletreeedbgen-souffle-swift : Hasilkan jenis dan hubungan souffle dari tata bahasa pengasuh pohon yang cepattreeedb-java : Hasilkan fakta datalog dari kode sumber javatreeedb-javascript : Hasilkan fakta datalog dari kode sumber JavaScripttreeedb-rust : Hasilkan fakta datalog dari kode sumber karattreeedb-souffle : Hasilkan fakta datalog dari kode sumber Souffletreeedb-swift : menghasilkan fakta datalog dari kode sumber cepat Terima kasih atas minat Anda pada treeedb ! Kami menyambut dan menghargai semua jenis kontribusi. Silakan mengajukan dan mengeluarkan atau membuka permintaan tarik.
Seperti yang dijelaskan dalam instalasi, ada dua alat yang terlibat dalam analisis pendukung masing-masing bahasa pemrograman: satu untuk menghasilkan jenis dan hubungan souffle (misalnya, treeedbgen-souffle-c ), dan satu lagi untuk mengurai bahasa yang dianalisis dan memancarkan fakta (misalnya, treeedb-c ).
Untuk menambahkan bahasa baru:
treeedb-<LANG> dan treeedbgen-souffle-<LANG> dengan struktur yang sama dengan yang sudah ada (mungkin paling mudah untuk hanya menyalin yang sudah ada secara rekursif).Cargo.toml tingkat atas..github/workflows/release.yml dengan menyalin dan memodifikasi baris yang ada untuk bahasa lain.Lihat PR #9 untuk contoh lengkap.
Script ./scripts/add-language.sh mengotomatiskan beberapa langkah ini-tetapi tidak selalu merupakan solusi turn-key. Contoh Penggunaan:
bash scripts/add-language.sh python Python