#test-cases #fuzzer #black-box-testing #black-box #grammar-based #ast #rust

tree-splicer

简单的基于语法的测试用例生成器(黑盒模糊器)

6 个版本 (重大更改)

0.5.0 2023年7月17日
0.4.0 2023年4月6日
0.3.1 2023年3月24日
0.2.0 2023年3月13日
0.1.0 2023年3月12日

#330 in 测试

Download history 216/week @ 2024-03-13 138/week @ 2024-03-20 130/week @ 2024-03-27 121/week @ 2024-04-03 203/week @ 2024-04-10 103/week @ 2024-04-17 194/week @ 2024-04-24 175/week @ 2024-05-01 121/week @ 2024-05-08 162/week @ 2024-05-15 185/week @ 2024-05-22 122/week @ 2024-05-29 132/week @ 2024-06-05 84/week @ 2024-06-12 85/week @ 2024-06-19 89/week @ 2024-06-26

每月下载量 412
10 个 Crates 中使用 (3 个直接使用)

MIT 许可证

32KB
571

tree-splicer

tree-splicer 是一个简单的基于语法的测试用例生成器。它使用 tree-sitter 语法解析多个输入文件,并通过拼接它们的抽象语法树(AST)来生成新的文件。

tree-splicer 在 tree-crasher 模糊器和 icemaker 中生成测试用例,尽管它也可以作为一个独立的工具使用。

tree-sitter 语法对语法错误有抵抗力。因此,tree-splicer 甚至可以突变语法无效的输入!您还可以使用不完整的语法与 tree-splicer 一起使用。

示例

给定这个简单的 Rust 程序

use std::env;

fn even(x: usize) -> bool {
    if x % 2 == 0 {
        return true;
    } else {
        return false;
    }
}

fn main() -> () {
    let argc = env::args().len();
    println!("Hello, world!");
    if even(argc) {
        println!("Even!");
    } else {
        println!("Odd!");
    }
    return ();
}

以下是由 tree-splicer-rust 创建的几个候选者

use even::env;

fn even() -> bool {
    if even(argc) {
        println!("Even!");
    } else {
        println!("Odd!");
    }
}

fn std() -> () {
    return true;
}
use args::env;

fn argc(main: usize) -> bool {
    return true;
}

fn even(x: usize) -> bool {
    if x % 2 == 0 {
        return true;
    } else {
        return false;
    }
}
use std::env;

fn x(x: usize) -> bool {
    return true;
}

fn x(x: usize) -> () {
    return false;
}

支持的语言

语言很容易添加,有关示例,请参阅 PR #3

  • JavaScript
  • Rust
  • TypeScript

发现的错误

boa

#2717 #2718 #2719

clang

#61635 #61666 #61667 #61746 #61747

deno

#18338

rustc

#109066 #109071 #109072 #109078 #109079 #109090 #109129 #109141 #109143 #109144 #109146 #109147 #109148 #109152 #109178 #109188 #109191 #109204 #109232 #109239 #109296 #109297 #109298 #109299 #109300 #109304 #109305

rustfmt

#5716 #5738 #5739

安装

预编译的二进制文件

预编译的二进制文件可在 发布页面 上找到。

从源代码构建

要从源代码安装,您需要安装 Rust 和 Cargo。遵循 Rust 安装页面 上的说明。

从 crates.io 的版本

您可以从 crates.io 构建发布版本。要安装 <LANG> 语言的最新 tree-splicer 发布版,请运行

cargo install tree-splicer-<LANG>

这将自动从crates.io下载源代码,构建它,并将其安装到Cargo的全局二进制目录(默认为~/.cargo/bin/)。

从GitHub的最新未发布版本

要构建和安装最新的未发布版本,请运行

cargo install --git https://github.com/langston-barrett/tree-splicer.git tree-splicer-LANG

卸载

要卸载,请运行cargo uninstall tree-splicer-<LANG>

构建

要从源代码构建,您需要安装Rust和Cargo。按照Rust安装页面上的说明进行操作。然后,获取源代码

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

最后,构建一切

cargo build --release

您可以在target/release中找到二进制文件。使用cargo test运行测试。

依赖项

~4–16MB
~175K SLoC