From 45ffcad29d96ae5b5b61a0a745bf70995fbd0c99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mikrut?= Date: Tue, 14 Mar 2023 11:45:26 +0100 Subject: [PATCH] Ruff fuzzer --- crates/ruff/src/settings/mod.rs | 1 - crates/ruff_cli/src/lib.rs | 2 +- fuzz/.gitignore | 5 ++++ fuzz/Cargo.toml | 31 +++++++++++++++++++++ fuzz/fuzz_targets/fuzz_target_1.rs | 43 ++++++++++++++++++++++++++++++ 5 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 fuzz/.gitignore create mode 100644 fuzz/Cargo.toml create mode 100644 fuzz/fuzz_targets/fuzz_target_1.rs diff --git a/crates/ruff/src/settings/mod.rs b/crates/ruff/src/settings/mod.rs index 6a19f8fa..5ac24f8f 100644 --- a/crates/ruff/src/settings/mod.rs +++ b/crates/ruff/src/settings/mod.rs @@ -232,7 +232,6 @@ impl Settings { } } - #[cfg(test)] pub fn for_rules(rules: impl IntoIterator) -> Self { Self { rules: rules.into(), diff --git a/crates/ruff_cli/src/lib.rs b/crates/ruff_cli/src/lib.rs index b95889c1..f5e92260 100644 --- a/crates/ruff_cli/src/lib.rs +++ b/crates/ruff_cli/src/lib.rs @@ -17,7 +17,7 @@ use ruff::{fix, fs, warn_user_once}; pub mod args; mod cache; mod commands; -mod diagnostics; +pub mod diagnostics; mod printer; mod resolve; diff --git a/fuzz/.gitignore b/fuzz/.gitignore new file mode 100644 index 00000000..5c404b95 --- /dev/null +++ b/fuzz/.gitignore @@ -0,0 +1,5 @@ +target +corpus +artifacts +coverage +Cargo.lock diff --git a/fuzz/Cargo.toml b/fuzz/Cargo.toml new file mode 100644 index 00000000..20a45e06 --- /dev/null +++ b/fuzz/Cargo.toml @@ -0,0 +1,31 @@ +[package] +name = "ruff-fuzz" +version = "0.0.0" +authors = ["Automatically generated"] +publish = false +edition = "2021" + +[package.metadata] +cargo-fuzz = true + +[dependencies] +libfuzzer-sys = "0.4" +once_cell = "1.17.1" +rand = "0.8.5" + + +[dependencies.ruff_cli] +path = "../crates/ruff_cli" + +[dependencies.ruff] +path = "../crates/ruff" + +# Prevent this from interfering with workspaces +[workspace] +members = ["."] + +[[bin]] +name = "fuzz_target_1" +path = "fuzz_targets/fuzz_target_1.rs" +test = false +doc = false diff --git a/fuzz/fuzz_targets/fuzz_target_1.rs b/fuzz/fuzz_targets/fuzz_target_1.rs new file mode 100644 index 00000000..db1c9300 --- /dev/null +++ b/fuzz/fuzz_targets/fuzz_target_1.rs @@ -0,0 +1,43 @@ +#![no_main] +#![allow(unused_imports)] + +use libfuzzer_sys::fuzz_target; +use ruff::registry::Rule; +use ruff::settings::{flags, Settings}; +use ruff_cli::diagnostics::lint_stdin; +use std::fs; +use std::fs::File; +use std::io::Write; + +use once_cell::sync::OnceCell; +use rand::Rng; + +static SETTINGS_CELL: OnceCell = OnceCell::new(); + +fuzz_target!(|data: &[u8]| { + if let Ok(s) = String::from_utf8(data.to_vec()) { + let settings = SETTINGS_CELL.get_or_init(|| { + Settings::for_rules( + [Rule::UselessSemicolon] + // [ + // "F401" + // ] + // .into_iter() + // .map(|name| Rule::from_code(name).expect(&format!("Invalid Rule {name}"))), + ) + }); + + let file_name = format!("/home/rafal/Desktop/pp/{}.py", rand::thread_rng().gen_range(0..99999999999)); + fs::write(&file_name, data).unwrap(); + println!("\nOUTPUT_START___{file_name}\n{s}\n___OUTPUT_END"); + let _def = lint_stdin( + None, + None, + &s, + &settings, + flags::Noqa::Disabled, + ruff::fix::FixMode::Apply, + ); + //println!("{def:?}") + } +}); -- 2.37.2