зеркало из
https://github.com/glebtv/tui-textarea.git
synced 2026-09-08 08:25:51 +03:00
derive Arbitrary to generate better random inputs on fuzzing
Этот коммит содержится в:
@@ -20,5 +20,5 @@ To run fuzzer:
|
|||||||
[cargo-fuzz](https://github.com/rust-fuzz/cargo-fuzz) is necessary.
|
[cargo-fuzz](https://github.com/rust-fuzz/cargo-fuzz) is necessary.
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
cargo fuzz run edit
|
cargo +nightly fuzz run edit
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ cargo-fuzz = true
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
libfuzzer-sys = "0.4"
|
libfuzzer-sys = "0.4"
|
||||||
arbitrary = "1"
|
arbitrary = { version = "1", features = ["derive"] }
|
||||||
|
|
||||||
[dependencies.tui-textarea]
|
[dependencies.tui-textarea]
|
||||||
path = ".."
|
path = ".."
|
||||||
|
|||||||
@@ -6,38 +6,66 @@ use std::iter;
|
|||||||
use std::str;
|
use std::str;
|
||||||
use tui_textarea::{Input, Key, TextArea};
|
use tui_textarea::{Input, Key, TextArea};
|
||||||
|
|
||||||
fn arbitrary_input(u: &mut Unstructured) -> Result<Input> {
|
macro_rules! arbitrary_key_enum {
|
||||||
let i = u8::arbitrary(u)? % 15;
|
($($p:ident$(($x:ident))?,)+) => {
|
||||||
let key = match i {
|
|
||||||
1 => Key::Backspace,
|
#[derive(Arbitrary)]
|
||||||
2 => Key::Enter,
|
enum ArbitraryKey {
|
||||||
3 => Key::Left,
|
$(
|
||||||
4 => Key::Right,
|
$p$(($x))?,
|
||||||
5 => Key::Up,
|
)+
|
||||||
6 => Key::Down,
|
}
|
||||||
7 => Key::Tab,
|
|
||||||
8 => Key::Delete,
|
impl From<ArbitraryKey> for Key {
|
||||||
9 => Key::Home,
|
fn from(k: ArbitraryKey) -> Key {
|
||||||
10 => Key::End,
|
match k {
|
||||||
11 => Key::PageUp,
|
$(
|
||||||
12 => Key::PageDown,
|
ArbitraryKey::$p$(($x))? => Key::$p$(($x))?,
|
||||||
13 => Key::Esc,
|
)+
|
||||||
14 => Key::Null,
|
}
|
||||||
_ => match char::arbitrary(u)? {
|
}
|
||||||
'\n' | '\r' => Key::Enter,
|
}
|
||||||
c => Key::Char(c),
|
}
|
||||||
},
|
}
|
||||||
};
|
|
||||||
Ok(Input {
|
arbitrary_key_enum!(
|
||||||
key,
|
Char(char),
|
||||||
ctrl: bool::arbitrary(u)?,
|
Backspace,
|
||||||
alt: bool::arbitrary(u)?,
|
Enter,
|
||||||
})
|
Left,
|
||||||
|
Right,
|
||||||
|
Up,
|
||||||
|
Down,
|
||||||
|
Tab,
|
||||||
|
Delete,
|
||||||
|
Home,
|
||||||
|
End,
|
||||||
|
PageUp,
|
||||||
|
PageDown,
|
||||||
|
Esc,
|
||||||
|
Null,
|
||||||
|
);
|
||||||
|
|
||||||
|
#[derive(Arbitrary)]
|
||||||
|
struct ArbitraryInput {
|
||||||
|
key: ArbitraryKey,
|
||||||
|
ctrl: bool,
|
||||||
|
alt: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<ArbitraryInput> for Input {
|
||||||
|
fn from(i: ArbitraryInput) -> Input {
|
||||||
|
Input {
|
||||||
|
key: i.key.into(),
|
||||||
|
ctrl: i.ctrl,
|
||||||
|
alt: i.alt,
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn fuzz(data: &[u8]) -> Result<()> {
|
fn fuzz(data: &[u8]) -> Result<()> {
|
||||||
let mut u = Unstructured::new(data);
|
let mut u = Unstructured::new(data);
|
||||||
let inputs: Vec<_> = iter::repeat_with(|| arbitrary_input(&mut u))
|
let inputs: Vec<_> = iter::repeat_with(|| ArbitraryInput::arbitrary(&mut u))
|
||||||
.take(10)
|
.take(10)
|
||||||
.collect::<Result<_>>()?;
|
.collect::<Result<_>>()?;
|
||||||
let text = <&str>::arbitrary(&mut u)?;
|
let text = <&str>::arbitrary(&mut u)?;
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user