#datalog #javascript #javascript-parser #souffle #programming-language #parser

app treeedb-javascript

从 JavaScript 源代码生成 Datalog 事实

1 个不稳定版本

0.1.0-rc.52022 年 10 月 29 日

#1190编程语言

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. 一个 Soufflé 文件,其中包含定义 AST 的类型和关系
  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。如果不确定给定的类型或关系对应于语言的哪个部分,请查看树-sitter 语法(例如,Java 中的 tree-sitter-java 仓库中的 grammar.js)。

动机和与其他工具的比较

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

编写这些表示和摄入工具需要宝贵的时间,并会分散编写分析的工作。 treeedb 旨在自动化这个过程,与这些工具位于相同的细分市场。

仓库结构

贡献

感谢您对 treeedb 的兴趣!我们欢迎并感谢所有类型的贡献。请随意提交问题或发起拉取请求。

添加语言

如《安装》部分所述,支持每种编程语言分析涉及两个工具:一个用于生成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

依赖项

~10MB
~208K SLoC