langston-barrett/tree-splicer

GitHub: langston-barrett/tree-splicer

基于语法感知的测试用例生成器,解析并拼接 AST 以生成畸形输入,辅助模糊测试。

Stars: 42 | Forks: 10

# tree-splicer tree-splicer 是一个基于语法测试用例生成器。它解析 多个输入文件并使用 [tree-sitter][tree-sitter] 语法,然后将它们的 AST 拼接起来生成新的文件。 tree-splicer 为 [tree-crasher][tree-crasher] 模糊测试器和 [icemaker][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](https://github.com/langston-barrett/tree-splicer/pull/3) 了解示例。 - JavaScript - OpenSCAD - Rust - TypeScript ## 发现的漏洞 ### boa [#2717](https://github.com/boa-dev/boa/issues/2717) [#2718](https://github.com/boa-dev/boa/issues/2718) [#2719](https://github.com/boa-dev/boa/issues/2719) ### clang [#61635](https://github.com/llvm/llvm-project/issues/61635) [#61666](https://github.com/llvm/llvm-project/issues/61666) [#61667](https://github.com/llvm/llvm-project/issues/61667) [#61746](https://github.com/llvm/llvm-project/issues/61746) [#61747](https://github.com/llvm/llvm-project/issues/61747) ### deno [#18338](https://github.com/denoland/deno/issues/18338) ### rustc [#109066](https://github.com/rust-lang/rust/issues/109066) [#109071](https://github.com/rust-lang/rust/issues/109071) [#109072](https://github.com/rust-lang/rust/issues/109072) [#109078](https://github.com/rust-lang/rust/issues/109078) [#109079](https://github.com/rust-lang/rust/issues/109079) [#109090](https://github.com/rust-lang/rust/issues/109090) [#109129](https://github.com/rust-lang/rust/issues/109129) [#109141](https://github.com/rust-lang/rust/issues/109141) [#109143](https://github.com/rust-lang/rust/issues/109143) [#109144](https://github.com/rust-lang/rust/issues/109144) [#109146](https://github.com/rust-lang/rust/issues/109146) [#109147](https://github.com/rust-lang/rust/issues/109147) [#109148](https://github.com/rust-lang/rust/issues/109148) [#109152](https://github.com/rust-lang/rust/issues/109152) [#109178](https://github.com/rust-lang/rust/issues/109178) [#109188](https://github.com/rust-lang/rust/issues/109188) [#109191](https://github.com/rust-lang/rust/issues/109191) [#109204](https://github.com/rust-lang/rust/issues/109204) [#109232](https://github.com/rust-lang/rust/issues/109232) [#109239](https://github.com/rust-lang/rust/issues/109239) [#109296](https://github.com/rust-lang/rust/issues/109296) [#109297](https://github.com/rust-lang/rust/issues/109297) [#109298](https://github.com/rust-lang/rust/issues/109298) [#109299](https://github.com/rust-lang/rust/issues/109299) [#109300](https://github.com/rust-lang/rust/issues/109300) [#109304](https://github.com/rust-lang/rust/issues/109304) [#109305](https://github.com/rust-lang/rust/issues/109305) [#123988](https://github.com/rust-lang/rust/issues/123988) ### rustfmt [#5716](https://github.com/rust-lang/rustfmt/issues/5716) [#5738](https://github.com/rust-lang/rustfmt/issues/5738) [#5739](https://github.com/rust-lang/rustfmt/issues/5739)