treeedb ทำให้ง่ายต่อการเริ่มเขียนการวิเคราะห์โปรแกรมระดับต้นทางในSoufflé Datalog อันดับแรก treeedb สร้างประเภทSouffléและความสัมพันธ์ที่เป็นตัวแทนของโปรแกรม AST จากนั้นรหัสต้นฉบับของ treeedb Parses และปล่อยข้อเท็จจริงที่เติมเต็มความสัมพันธ์เหล่านั้น
ปัจจุบัน treeedb สนับสนุนการวิเคราะห์ภาษาเหล่านี้:
Parsers และ AST ของ treeedb ขึ้นอยู่กับไวยากรณ์ของ Tree-Sitter และมันง่ายมากที่จะเพิ่มการสนับสนุนสำหรับภาษาใด ๆ ด้วยไวยากรณ์ของ Tree-Sitter
ชื่อ treeedb เป็นพอร์ตมานูของ "ผู้จับต้นไม้" ด้วย "EDB" ซึ่ง EDB ย่อมาจาก "ฐานข้อมูลส่วนขยาย" และหมายถึงชุดของข้อเท็จจริงในโปรแกรม Datalog
คุณจะต้องมีสองสิ่งประดิษฐ์สำหรับแต่ละภาษาการเขียนโปรแกรมที่คุณต้องการวิเคราะห์:
ตัวอย่างเช่นสำหรับ java เหล่านี้เรียกว่า treeedb-java.dl และ treeedb-java ตามลำดับ
ในการวิเคราะห์รหัสบางอย่างจริงคุณจะต้องติดตั้งsoufflé
นำทางไปยังรุ่นล่าสุดในหน้ารีลีสและดาวน์โหลดสิ่งประดิษฐ์ที่เกี่ยวข้องกับภาษาที่คุณต้องการวิเคราะห์ ปฏิบัติการที่สร้างไว้ล่วงหน้านั้นมีการเชื่อมโยงแบบคงที่ แต่ปัจจุบันมีให้สำหรับ Linux เท่านั้น
คุณสามารถสร้างเวอร์ชันที่ปล่อยออกมาจาก Crates.io คุณจะต้องใช้คอมไพเลอร์สนิมและเครื่องมือสร้างสินค้า Rustup ทำให้ง่ายต่อการได้รับสิ่งเหล่านี้ จากนั้นเพื่อติดตั้งเครื่องมือสำหรับภาษา <LANG> ให้เรียกใช้:
cargo install treeedb-<LANG> treeedbgen-souffle-<LANG>
สิ่งนี้จะติดตั้งไบนารีเป็น ~/.cargo/bin ในการสร้างไฟล์ Datalog ให้เรียกใช้ Binary treeedbgen-souffle-<LANG> ไบนารี
น่าเสียดายที่ไบนารีที่เกี่ยวข้องกับจาวายังไม่สามารถใช้งานได้ใน Crates.io
ในการสร้างจากแหล่งที่มาคุณจะต้องใช้คอมไพเลอร์สนิมและเครื่องมือสร้างสินค้า Rustup ทำให้ง่ายต่อการได้รับสิ่งเหล่านี้
จากนั้นรับแหล่งที่มา:
git clone https://github.com/langston-barrett/treeedb
cd treeedbในที่สุดก็สร้างทุกอย่าง:
cargo build --release คุณสามารถค้นหาไบนารี treeedb-<LANG> ใน target/release ในการสร้างไฟล์ Datalog ให้เรียกใช้ Binary treeedbgen-souffle-<LANG> Binary
หากต้องการติดตามตัวอย่างนี้ให้ทำตามคำแนะนำการติดตั้งสำหรับ Java จากนั้นสร้างไฟล์ java ชื่อ Main.java :
class Main {
public static void main ( String [] args ) {
int x = 2 + 2 ;
}
} (ไฟล์ที่แสดงในส่วนนี้มีอยู่ใน examples/java/ .)
สร้างไฟล์ datalog ชื่อ const-binop.dl ซึ่งมี 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.csv และ field.csv ):
treeedb-java Main.javaในที่สุดเรียกใช้การวิเคราะห์ด้วยsoufflé:
souffle const-binop.dlคุณจะเห็นอะไรแบบนี้:
---------------
const_binop
===============
94001952741472
===============
---------------
show_const_binop
===============
2 + 2
===============
หากต้องการดูชื่อประเภทและความสัมพันธ์ใดให้ดูที่ treeedb-<LANGUAGE>.dl หากไม่ชัดเจนว่าส่วนใดของภาษาประเภทหรือความสัมพันธ์ที่กำหนดสอดคล้องกับให้ดูที่ไวยากรณ์ของผู้เลี้ยงต้นไม้ (เช่นไวยากรณ์. js ใน repo tree-sitter-java repo สำหรับ Java)
ก่อนที่จะเขียนการวิเคราะห์โปรแกรมใน Datalog คุณต้องคิดออก (1) วิธีการแสดงโปรแกรมเป็นความสัมพันธ์และ (2) วิธีการบริโภคโปรแกรมในการเป็นตัวแทนนั้น โครงการ Datalog ที่ทันสมัยทำทั้งหมดนี้ "ด้วยมือ":
analysis-input.dl (1) การเขียนการเป็นตัวแทนและเครื่องมือกลืนกินเหล่านี้ใช้เวลาอันมีค่าและเบี่ยงเบนความสนใจจากงานเขียนการวิเคราะห์ treeedb ตั้งเป้าหมายที่จะทำให้มันเป็นไปโดยอัตโนมัติและติดตั้งในช่องเดียวกับเครื่องมือเหล่านี้
treeedb : สร้างข้อเท็จจริง datalog จากต้นไม้แยกวิเคราะห์ต้นไม้treeedb-c : สร้างข้อเท็จจริง Datalog จาก C ซอร์สโค้ด Ctreeedb-csharp : สร้างข้อเท็จจริง datalog จาก c# ซอร์สโค้ด c#treeedbgen : แยกประเภทโหนดโหนด json จากไวยากรณ์ของต้นไม้treeedbgen-souffle : สร้างประเภทSouffléและความสัมพันธ์จากไวยากรณ์ของผู้เลี้ยงต้นไม้treeedbgen-souffle-c : สร้างประเภทsouffléและความสัมพันธ์จากไวยากรณ์ของ Tree-tree-treetreeedbgen-souffle-csharp : สร้างประเภทsouffléและความสัมพันธ์จากไวยากรณ์ C# tree-sittertreeedbgen-souffle-java : สร้างประเภทSouffléและความสัมพันธ์จากไวยากรณ์ของ Tree-Tree Javatreeedbgen-souffle-javascript : สร้างประเภทsouffléและความสัมพันธ์จากไวยากรณ์ของ Tree-Tree JavaScripttreeedbgen-souffle-rust : สร้างประเภทSouffléและความสัมพันธ์จากไวยากรณ์ของผู้เลี้ยงต้นไม้สนิมtreeedbgen-souffle-souffle : สร้างประเภทSouffléและความสัมพันธ์จากไวยากรณ์Soufflé Tree-Tree-Tree-Treetreeedbgen-souffle-swift : สร้างประเภทSouffléและความสัมพันธ์จากไวยากรณ์ของผู้เลี้ยงต้นไม้ที่รวดเร็วtreeedb-java : สร้างข้อเท็จจริง Datalog จากซอร์สโค้ด Javatreeedb-javascript : สร้างข้อเท็จจริง datalog จากซอร์สโค้ด JavaScripttreeedb-rust : สร้างข้อเท็จจริง datalog จากซอร์สโค้ดสนิมtreeedb-souffle : สร้างข้อเท็จจริง datalog จากซอร์สโค้ดsoufflétreeedb-swift : สร้างข้อเท็จจริง datalog จากซอร์สโค้ด 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