treeedb hace que sea más fácil comenzar a escribir un análisis de programa a nivel de fuente en el conjunto de datos de Soufflé. Primero, treeedb genera tipos y relaciones de soufflé que representan el AST de un programa. Luego, treeedb analiza el código fuente y emite hechos que pueblan esas relaciones.
treeedb actualmente admite el análisis de estos idiomas:
Los analizadores y los AST de treeedb se basan en gramáticas de la hermana del árbol, y es muy fácil agregar soporte para cualquier idioma con una gramática del otorgante de árboles.
El nombre treeedb es un portmanteau de "Tree-Witter" con "EDB", donde EDB significa "Base de datos extensional" y se refiere al conjunto de hechos en un programa de datos.
Necesitará dos artefactos para cada lenguaje de programación que desee analizar:
Por ejemplo, para Java se llaman treeedb-java.dl y treeedb-java , respectivamente.
Para analizar realmente algún código, también deberá instalar Soufflé.
Navegue al lanzamiento más reciente en la página de lanzamientos y descargue los artefactos relacionados con el lenguaje que desea analizar. Los ejecutables preconstruidos están estáticamente vinculados, pero actualmente solo están disponibles para Linux.
Puede construir una versión lanzada de Craates.io. Necesitará el compilador de óxido y la herramienta de construcción de carga. Rustup hace que sea muy fácil obtenerlos. Luego, para instalar las herramientas para el idioma <LANG> , ejecute:
cargo install treeedb-<LANG> treeedbgen-souffle-<LANG>
Esto instalará binarios para ~/.cargo/bin . Para generar el archivo de datos, ejecute treeedbgen-souffle-<LANG> binario.
Desafortunadamente, los binarios relacionados con Java aún no están disponibles en cajas.
Para construir desde la fuente, necesitará el compilador de óxido y la herramienta de construcción de carga. Rustup hace que sea muy fácil obtenerlos.
Entonces, obtenga la fuente:
git clone https://github.com/langston-barrett/treeedb
cd treeedbFinalmente, construye todo:
cargo build --release Puede encontrar los binarios treeedb-<LANG> en target/release . Para generar el archivo de datos, ejecute el binario treeedbgen-souffle-<LANG> correspondiente.
Para seguir con este ejemplo, siga las instrucciones de instalación para Java. Luego, cree un archivo Java llamado Main.java :
class Main {
public static void main ( String [] args ) {
int x = 2 + 2 ;
}
} (Los archivos que se muestran en esta sección también están disponibles en examples/java/ .)
Cree un archivo de datos llamado const-binop.dl que incluya treeedb-java.dl y tenga una regla para encontrar expresiones binarias con valor constante:
#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)
Genere los archivos de entrada ( node.csv y field.csv ):
treeedb-java Main.javaFinalmente, ejecute el análisis con Soufflé:
souffle const-binop.dlVerás algo como esto:
---------------
const_binop
===============
94001952741472
===============
---------------
show_const_binop
===============
2 + 2
===============
Para ver qué tipo y nombres de relaciones están disponibles, mire treeedb-<LANGUAGE>.dl . Si no es evidente a qué parte del idioma se corresponde un tipo o relación determinada, eche un vistazo a la gramática del otorgador de árboles (por ejemplo, gramática.js en el repositorio de java-itter-java para java).
Antes de escribir un análisis de programa en DataSalog, debe descubrir (1) cómo representar el programa como relaciones, y (2) cómo ingerir programas en esa representación. Los proyectos de datos de última generación hacen todo esto "a mano":
analysis-input.dl (1). Escribir estas representaciones e herramientas de ingestión lleva tiempo valioso y distrae del trabajo de escritura de análisis. treeedb tiene como objetivo automatizarlo, encajando en el mismo nicho que estas herramientas.
treeedb : generar datos de datos de árboles de análisistreeedb-c : Generar datos de datos del código fuente Ctreeedb-csharp : Genere datos de datos del código fuente de C#treeedbgen : Pan Node-types.json de una gramática de maderatreeedbgen-souffle : genere tipos de soufflé y relaciones a partir de gramáticastreeedbgen-souffle-c : Genere los tipos de soufflé y las relaciones de la gramática C de los árboles Ctreeedbgen-souffle-csharp : generar tipos de soufflé y relaciones a partir de la gramática C#-itter-ittertreeedbgen-souffle-java : generar tipos de soufflé y relaciones a partir de la gramática de la camiseta de árbol de Javatreeedbgen-souffle-javascript : Generar tipos y relaciones de soufflé de la gramática JavaScript Tree-Wittertreeedbgen-souffle-rust : genere tipos de soufflé y relaciones a partir de la gramática del titular de la óxidotreeedbgen-souffle-souffle : generar tipos de soufflé y relaciones a partir de la gramática Soufflé Tree-Wittertreeedbgen-souffle-swift : Genere tipos de soufflé y relaciones de la gramática de titular de árboles rápidostreeedb-java : Genere datos de data de datos a partir del código fuente de Javatreeedb-javascript : Genere datos de data de datos del código fuente de JavaScripttreeedb-rust : Genere datos de datos del código fuente de Rust Rusttreeedb-souffle : Genere datos de datos de Soufflé Código fuente de Soufflétreeedb-swift : Genere datos de datos del código fuente de Swift ¡Gracias por su interés en treeedb ! Agradecemos y apreciamos todo tipo de contribuciones. No dude en archivar y emitir o abrir una solicitud de extracción.
Como se explica en la instalación, existen dos herramientas involucradas en el análisis de respaldo de cada lenguaje de programación: uno para generar tipos y relaciones de soufflé (por ejemplo, treeedbgen-souffle-c ), y otro para analizar el lenguaje que se analiza y emite hechos (por ejemplo, treeedb-c ).
Para agregar un nuevo idioma:
treeedb-<LANG> y treeedbgen-souffle-<LANG> con la misma estructura que una existente (podría ser más fácil copiar recursivamente los existentes).Cargo.toml de nivel superior.toml..github/workflows/release.yml copiando y modificando las líneas existentes para otros idiomas.Ver PR #9 para un ejemplo completo.
El script ./scripts/add-language.sh automatiza algunos de estos pasos, pero no es necesariamente una solución llave en mano. Ejemplo de uso:
bash scripts/add-language.sh python Python