treeedb 사용하면 Soufflé Datalog에서 소스 레벨 프로그램 분석을보다 쉽게 시작할 수 있습니다. 먼저 treeedb 프로그램의 AST를 나타내는 수플레 유형과 관계를 생성합니다. 그런 다음 treeedb 소스 코드를 파서 구문 분석하고 이러한 관계를 채우는 사실을 방출합니다.
treeedb 현재 이러한 언어의 분석을 지원합니다.
treeedb 의 구식 구식 및 AST는 트리 시터 문법을 기반으로하며 트리 시터 문법으로 모든 언어에 대한 지원을 추가하기가 매우 쉽습니다.
treeedb 라는 이름은 "EDB"가있는 "트리-사이터"의 포트 만토이며, 여기서 EDB는 "확장 데이터베이스"를 나타냅니다.
분석하려는 각 프로그래밍 언어마다 두 개의 아티팩트가 필요합니다.
예를 들어, Java의 경우 각각 treeedb-java.dl 및 treeedb-java 라고합니다.
실제로 일부 코드를 분석하려면 Soufflé를 설치해야합니다.
릴리스 페이지에서 가장 최근의 릴리스로 이동하여 분석하려는 언어와 관련된 아티팩트를 다운로드하십시오. 사전 제작 된 실행 파일은 정적으로 연결되어 있지만 현재 Linux에서만 사용할 수 있습니다.
Crates.io에서 릴리스 버전을 만들 수 있습니다. Rust 컴파일러와화물 빌드 도구가 필요합니다. Rustup은 이것을 쉽게 얻을 수 있습니다. 그런 다음 언어 <LANG> 위한 도구를 설치하려면 실행하십시오.
cargo install treeedb-<LANG> treeedbgen-souffle-<LANG>
이것은 바이너리를 ~/.cargo/bin 에 설치합니다. Datalog 파일을 생성하려면 treeedbgen-souffle-<LANG> 이진을 실행하십시오.
불행히도, Java 관련 바이너리는 아직 Crates.io에서 사용할 수 없습니다.
소스에서 빌드하려면 Rust 컴파일러와화물 빌드 도구가 필요합니다. Rustup은 이것을 쉽게 얻을 수 있습니다.
그런 다음 출처를 얻으십시오.
git clone https://github.com/langston-barrett/treeedb
cd treeedb마지막으로 모든 것을 구축하십시오.
cargo build --release treeedb-<LANG> 바이너리를 target/release 에서 찾을 수 있습니다. Datalog 파일을 생성하려면 해당 treeedbgen-souffle-<LANG> 이진을 실행하십시오.
이 예제를 따르려면 Java의 설치 지침을 따르십시오. 그런 다음 Main.java 라는 Java 파일을 만듭니다.
class Main {
public static void main ( String [] args ) {
int x = 2 + 2 ;
}
} (이 섹션에 표시된 파일은 examples/java/ 에서도 사용할 수 있습니다.)
treeedb-java.dl 포함하는 const-binop.dl 이라는 Datalog 파일을 만듭니다.
#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마지막으로 Soufflé를 사용하여 분석을 실행하십시오.
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) 그 표현에 프로그램을 섭취하는 방법을 알아 내야합니다. 최첨단 Datalog 프로젝트는이 모든 "손으로"를 수행합니다.
analysis-input.dl (1). 이러한 표현 및 섭취 도구를 작성하면 소중한 시간이 걸리고 분석 작업에서 산만 해집니다. treeedb 이 도구와 동일한 틈새 시장에 맞는 자동화를 목표로합니다.
treeedb : 트리 시터 파스 나무에서 데이터 로그 사실을 생성합니다treeedb-c : C 소스 코드에서 데이터 로그 사실을 생성합니다treeedb-csharp : c# 소스 코드에서 데이터 로그 사실을 생성합니다treeedbgen : 트리 시터 문법에서 나오는 구문 분석 노드-타입 .jsontreeedbgen-souffle : Tree-Sitter 문법에서 수플레 유형 및 관계 생성treeedbgen-souffle-c : C 트리 시터 문법에서 수플레 유형 및 관계 생성treeedbgen-souffle-csharp : c# tree-sitter 문법에서 수플레 유형 및 관계 생성treeedbgen-souffle-java : Java Tree-Sitter Grammar에서 Soufflé 유형 및 관계 생성treeedbgen-souffle-javascript : JavaScript Tree-Sitter Grammar에서 Soufflé 유형 및 관계 생성treeedbgen-souffle-rust : Rust Tree-Sitter 문법에서 수플레 유형 및 관계 생성treeedbgen-souffle-souffle : Soufflé Tree-Sitter 문법에서 수플레 유형 및 관계를 생성합니다.treeedbgen-souffle-swift : Swift Tree-Sitter 문법에서 수플레 유형 및 관계 생성treeedb-java : Java 소스 코드에서 Datalog 사실을 생성합니다treeedb-javascript : JavaScript 소스 코드에서 Datalog 사실을 생성합니다treeedb-rust : Rust 소스 코드에서 Datalog 사실을 생성합니다treeedb-souffle : soufflé 소스 코드에서 데이터 로그 사실을 생성합니다treeedb-swift : 신속한 소스 코드에서 데이터 로그 사실을 생성합니다 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