From fc3b0732d81864737a967aae0aefd682567bb9ea Mon Sep 17 00:00:00 2001 From: LucaCappelletti94 Date: Wed, 16 Sep 2026 16:33:44 +0200 Subject: [PATCH] Fuzz: Replace honggfuzz harness with cargo-fuzz --- docs/fuzzing.md | 35 ++------------------- fuzz/.gitignore | 6 ++-- fuzz/Cargo.toml | 10 ++++-- fuzz/fuzz_targets/fuzz_parse_sql.rs | 49 ++++++++++++++--------------- 4 files changed, 37 insertions(+), 63 deletions(-) diff --git a/docs/fuzzing.md b/docs/fuzzing.md index cc4ca4d787..588d162f33 100644 --- a/docs/fuzzing.md +++ b/docs/fuzzing.md @@ -19,39 +19,10 @@ # Fuzzing -## Installing `honggfuzz` - -``` -cargo install honggfuzz -``` - -Install [dependencies](https://github.com/rust-fuzz/honggfuzz-rs#dependencies) for your system. - -## Running the fuzzer - -Running the fuzzer is as easy as running in the `fuzz` directory. - -Choose a target: - -These are `[[bin]]` entries in `Cargo.toml`. -List them with `cargo read-manifest | jq '.targets[].name'` from the `fuzz` directory. - -Run the fuzzer: - ```shell +cargo install cargo-fuzz cd fuzz -cargo hfuzz run -``` - -After a panic is found, get a stack trace with: - -```shell -cargo hfuzz run-debug hfuzz_workspace//*.fuzz +cargo fuzz run fuzz_parse_sql -- -max_total_time=600 ``` -For example, with the `fuzz_parse_sql` target: - -```shell -cargo hfuzz run fuzz_parse_sql -cargo hfuzz run-debug fuzz_parse_sql hfuzz_workspace/fuzz_parse_sql/*.fuzz -``` +Crashes land in `artifacts//` and replay with `cargo fuzz run `. diff --git a/fuzz/.gitignore b/fuzz/.gitignore index 9c64849b81..ec43de481e 100644 --- a/fuzz/.gitignore +++ b/fuzz/.gitignore @@ -1,3 +1,3 @@ -corpus -hfuzz_target -hfuzz_workspace +/artifacts +/corpus +/target diff --git a/fuzz/Cargo.toml b/fuzz/Cargo.toml index c162854d48..4ee8c504d6 100644 --- a/fuzz/Cargo.toml +++ b/fuzz/Cargo.toml @@ -18,11 +18,14 @@ [package] name = "fuzz" version = "0.1.0" -edition = "2018" +edition = "2021" publish = false +[package.metadata] +cargo-fuzz = true + [dependencies] -honggfuzz = "0.5.54" +libfuzzer-sys = "0.4" sqlparser = { path = ".." } # Prevent this from interfering with workspaces @@ -32,3 +35,6 @@ members = ["."] [[bin]] name = "fuzz_parse_sql" path = "fuzz_targets/fuzz_parse_sql.rs" +test = false +doc = false +bench = false diff --git a/fuzz/fuzz_targets/fuzz_parse_sql.rs b/fuzz/fuzz_targets/fuzz_parse_sql.rs index 15c198cb23..89c841842e 100644 --- a/fuzz/fuzz_targets/fuzz_parse_sql.rs +++ b/fuzz/fuzz_targets/fuzz_parse_sql.rs @@ -15,36 +15,33 @@ // specific language governing permissions and limitations // under the License. -use honggfuzz::fuzz; +#![no_main] + +use libfuzzer_sys::fuzz_target; use sqlparser::dialect::{ - AnsiDialect, BigQueryDialect, ClickHouseDialect, DatabricksDialect, DuckDbDialect, + AnsiDialect, BigQueryDialect, ClickHouseDialect, DatabricksDialect, Dialect, DuckDbDialect, GenericDialect, HiveDialect, MsSqlDialect, MySqlDialect, OracleDialect, PostgreSqlDialect, RedshiftSqlDialect, SQLiteDialect, SnowflakeDialect, }; use sqlparser::parser::Parser; - -fn main() { - let dialects: Vec> = vec![ - Box::new(AnsiDialect::default()), - Box::new(BigQueryDialect::default()), - Box::new(ClickHouseDialect::default()), - Box::new(DatabricksDialect::default()), - Box::new(DuckDbDialect::default()), - Box::new(GenericDialect::default()), - Box::new(HiveDialect::default()), - Box::new(MsSqlDialect::default()), - Box::new(MySqlDialect::default()), - Box::new(OracleDialect::default()), - Box::new(PostgreSqlDialect::default()), - Box::new(RedshiftSqlDialect::default()), - Box::new(SQLiteDialect::default()), - Box::new(SnowflakeDialect::default()), +fuzz_target!(|sql: &str| { + let dialects: [&dyn Dialect; 14] = [ + &AnsiDialect {}, + &BigQueryDialect {}, + &ClickHouseDialect {}, + &DatabricksDialect {}, + &DuckDbDialect {}, + &GenericDialect {}, + &HiveDialect {}, + &MsSqlDialect {}, + &MySqlDialect {}, + &OracleDialect {}, + &PostgreSqlDialect {}, + &RedshiftSqlDialect {}, + &SQLiteDialect {}, + &SnowflakeDialect {}, ]; - loop { - fuzz!(|data: String| { - for dialect in &dialects { - let _ = Parser::parse_sql(dialect.as_ref(), &data); - } - }); + for dialect in dialects { + let _ = Parser::parse_sql(dialect, sql); } -} +});