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