From 069e1351a765be2a23666b94af4b1f01d7a2bd02 Mon Sep 17 00:00:00 2001 From: rhysd Date: Fri, 3 Nov 2023 23:10:48 +0900 Subject: [PATCH] add `insert_delete` fuzzing target --- CONTRIBUTING.md | 4 ++++ fuzz/Cargo.lock | 2 +- fuzz/Cargo.toml | 6 ++++++ fuzz/fuzz_targets/insert_delete.rs | 26 ++++++++++++++++++++++++++ 4 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 fuzz/fuzz_targets/insert_delete.rs diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8d5beda..17c32f6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -72,6 +72,10 @@ tail -F debug.txt To run fuzzing tests, [cargo-fuzz][] and Rust nightly toolchain are necessary. ```sh +# Show list of fuzzing targets +cargo +nightly fuzz list + +# Run 'edit' fuzzing test case cargo +nightly fuzz run edit ``` diff --git a/fuzz/Cargo.lock b/fuzz/Cargo.lock index 2d0680b..6df54bd 100644 --- a/fuzz/Cargo.lock +++ b/fuzz/Cargo.lock @@ -363,7 +363,7 @@ dependencies = [ [[package]] name = "tui-textarea" -version = "0.2.4" +version = "0.3.0" dependencies = [ "arbitrary", "crossterm", diff --git a/fuzz/Cargo.toml b/fuzz/Cargo.toml index 6f2c0ca..2313159 100644 --- a/fuzz/Cargo.toml +++ b/fuzz/Cargo.toml @@ -23,3 +23,9 @@ name = "edit" path = "fuzz_targets/edit.rs" test = false doc = false + +[[bin]] +name = "insert_delete" +path = "fuzz_targets/insert_delete.rs" +test = false +doc = false diff --git a/fuzz/fuzz_targets/insert_delete.rs b/fuzz/fuzz_targets/insert_delete.rs new file mode 100644 index 0000000..7035469 --- /dev/null +++ b/fuzz/fuzz_targets/insert_delete.rs @@ -0,0 +1,26 @@ +#![no_main] + +use arbitrary::{Arbitrary as _, Result, Unstructured}; +use libfuzzer_sys::fuzz_target; +use tui_textarea::{CursorMove, TextArea}; +use tui_textarea_bench::{dummy_terminal, TerminalExt}; + +fn fuzz(data: &[u8]) -> Result<()> { + let mut term = dummy_terminal(); + let mut textarea = TextArea::default(); + let mut data = Unstructured::new(data); + for i in 0..100 { + textarea.move_cursor(CursorMove::arbitrary(&mut data)?); + if i % 2 == 0 { + textarea.insert_str(String::arbitrary(&mut data)?); + } else { + textarea.delete_str(usize::arbitrary(&mut data)?); + } + term.draw_textarea(&mut textarea); + } + Ok(()) +} + +fuzz_target!(|data: &[u8]| { + fuzz(data).unwrap(); +});