1个不稳定版本

0.1.0-rc.52022年10月29日

#1157编程语言

MIT许可证

30KB
202

treeedb

treeedb使编写源级程序分析变得更加容易,适用于Soufflé Datalog。首先,treeedb生成表示程序AST的Soufflé类型和关系。然后,treeedb解析源代码并发出填充这些关系的实体。

treeedb目前支持以下语言的分析

  • C
  • C#
  • Java
  • JavaScript
  • Rust
  • Soufflé
  • Swift

treeedb的解析器和AST基于tree-sitter语法,并且很容易添加对任何具有tree-sitter语法的语言的支持

treeedb这个名字是“tree-sitter”和“EDB”(扩展数据库)的组合,其中EDB代表Datalog程序中的事实集。

安装

您需要为要分析的每种编程语言安装两个组件

  1. 一个定义AST类型和关系的Soufflé文件
  2. 解析该语言并发出实体的可执行文件

例如,对于Java,这些分别是treeedb-java.dltreeedb-java

要实际分析一些代码,您还需要安装Soufflé

从发布版安装

导航到发布页面上最新的发布版,并下载与您要分析的编程语言相关的组件。预构建的可执行文件是静态链接的,但目前仅适用于Linux。

从crates.io构建

您可以从crates.io构建发布版本。您需要Rust编译器和Cargo构建工具。 rustup使获取这些工具变得非常简单。然后,要安装语言<LANG>的工具,运行

cargo install treeedb-<LANG> treeedbgen-souffle-<LANG>

这将在~/.cargo/bin安装二进制文件。要生成Datalog文件,运行treeedbgen--souffle-<LANG>二进制文件。

从源代码构建

要从源代码构建,您需要Rust编译器和Cargo构建工具。rustup可以使获取这些工具变得非常简单。

然后,获取源代码

git clone https://github.com/langston-barrett/treeedb
cd treeedb

最后,构建一切

cargo build --release

您可以在target/release中找到treeedb-<LANG>二进制文件。要生成Datalog文件,运行相应的treeedbgen--souffle-<LANG>二进制文件。

示例:分析Java代码

要跟随此示例,请遵循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并包含一个用于查找具有常量值的二元表达式的规则

#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.csvfield.csv

treeedb-java Main.java

最后,使用Soufflé运行分析

souffle const-binop.dl

您将看到类似以下内容

---------------
const_binop
===============
94001952741472
===============
---------------
show_const_binop
===============
2 + 2
===============

深入挖掘

要查看可用的类型和关系名称,请查看treeedb-<LANGUAGE>.dl。如果不太清楚给定的类型或关系对应于语言的哪个部分,请查看tree-sitter语法(例如,Java的tree-sitter-java存储库中的grammar.js)。

动机和与其他工具的比较

在用Datalog编写程序分析之前,您需要弄清楚(1)如何将程序表示为关系,以及(2)如何将程序输入到该表示中。最先进的Datalog项目都是“手动”做这些事的

编写这些表示和摄入工具需要占用宝贵的时间,并会分散编写分析的工作。 treeedb旨在自动化它,与这些工具处于同一利基。

存储库结构

贡献

感谢您对 treeedb 的关注!我们欢迎并感谢所有类型的贡献。请随时提交问题或发起 pull request。

添加语言

安装部分所述,支持每种编程语言的分析涉及两个工具:一个用于生成 Soufflé 类型和相关关系(例如,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

依赖关系

约 41MB
约 1M 行代码(SLoC)