treeedb使得開始在SouffléDatalog中開始編寫源級程序分析變得更加容易。首先, treeedb生成代表程序AST的蛋推式和關係。然後, treeedb解析源代碼並發出填充這些關係的事實。
treeedb當前支持對這些語言的分析:
treeedb的解析器和ASTS基於樹木的語法,並且很容易用樹狀語法添加對任何語言的支持。
該名稱treeedb是帶有“ EDB”的“樹特”的Portmanteau,其中EDB代表“擴展數據庫”,並指DATALOG程序中的事實集。
對於要分析的每種編程語言,您將需要兩個工件:
例如,對於Java,這些分別稱為treeedb-java.dl和treeedb-java 。
為了實際分析一些代碼,您還需要安裝蛋leflé。
導航到發行頁面上的最新版本,並下載與您要分析的語言相關的工件。預構建的可執行文件是靜態鏈接的,但目前僅適用於Linux。
您可以從Crates.io構建發布版本。您將需要Rust編譯器和貨物構建工具。 Rusup使得獲得這些非常容易。然後,要安裝語言<LANG>的工具,請運行:
cargo install treeedb-<LANG> treeedbgen-souffle-<LANG>
這將安裝二進製文件至~/.cargo/bin 。要生成DataLog文件,請運行treeedbgen-souffle-<LANG>二進製文件。
不幸的是,與Java相關的二進製文件尚未在Crates.io上可用。
要從源構建,您將需要Rust編譯器和貨物構建工具。 Rusup使得獲得這些非常容易。
然後,獲取來源:
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/ 。
創建一個名為const-binop.dl的datalog文件,其中包含treeedb-java.dl ,並有一個規則可以找到常數值二進制expressions:
#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最後,用蛋oufflé進行分析:
souffle const-binop.dl您會看到這樣的東西:
---------------
const_binop
===============
94001952741472
===============
---------------
show_const_binop
===============
2 + 2
===============
要查看可用的類型和關係名稱,請查看treeedb-<LANGUAGE>.dl 。如果不明顯的是給定類型或關係的語言的哪一部分對應,請看一下樹的特點語法(例如,Java的tree-sitter-java repo中的grammar.js)。
在DataLog中編寫程序分析之前,您需要找出(1)如何表示該程序為關係,以及(2)如何將程序攝入該表示形式。最先進的數據核項目“手工”完成了所有這些:
analysis-input.dl (1)。編寫這些表示和攝入工具佔用了寶貴的時間,並分散了寫作分析的工作。 treeedb目的是將其自動化,與這些工具相同的利基擬合。
treeedb :從樹木解析樹中生成數據學事實treeedb-c :從C源代碼生成數據編號事實treeedb-csharp :從c#源代碼生成數據編號事實treeedbgen :parse節點型。treeedbgen-souffle :生成蛋soufflé的類型和關係。treeedbgen-souffle-c :從C樹的類型和關係生成蛋sutter語法treeedbgen-souffle-csharp :從C#樹式語法生成蛋奶酥類型和關係treeedbgen-souffle-java :生成Java樹的類型和關係treeedbgen-souffle-javascript :生成JavaScript樹的類型和關係treeedbgen-souffle-rust :生成蛋奶酥類型和從生鏽的樹特語法treeedbgen-souffle-souffle :生成蛋奶酥的類型和關係。treeedbgen-souffle-swift :生成Swift Tree-Sitter語法的蛋sufflé類型和關係treeedb-java :從Java源代碼生成數據編號事實treeedb-javascript :從JavaScript源代碼生成數據編號事實treeedb-rust :從Rust源代碼生成Datalog事實treeedb-souffle :從蛋treeedb-swift :從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