diff --git a/fuzz/.gitignore b/fuzz/.gitignore new file mode 100644 index 000000000..9c64849b8 --- /dev/null +++ b/fuzz/.gitignore @@ -0,0 +1,3 @@ +corpus +hfuzz_target +hfuzz_workspace diff --git a/fuzz/Cargo.toml b/fuzz/Cargo.toml new file mode 100644 index 000000000..72ab86ef6 --- /dev/null +++ b/fuzz/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "fuzz" +version = "0.1.0" +edition = "2018" +publish = false + +[dependencies] +honggfuzz = "0.5.54" +sqlparser = { path = ".." } + +# Prevent this from interfering with workspaces +[workspace] +members = ["."] + +[[bin]] +name = "fuzz_parse_sql" +path = "fuzz_targets/fuzz_parse_sql.rs" diff --git a/fuzz/README.md b/fuzz/README.md new file mode 100644 index 000000000..d63f06b0e --- /dev/null +++ b/fuzz/README.md @@ -0,0 +1,35 @@ +# fuzz + +## Installing `honggfuzz` + +``` +cargo install honggfuzz +``` + +Install [dependencies](https://github.com/rust-fuzz/honggfuzz-rs#dependencies) for your system. + +## Fuzzing + +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 +cd fuzz +cargo hfuzz run +``` + +After a panic is found, get a stack trace with: + +```shell +cargo hfuzz run-debug hfuzz_workspace//*.fuzz +``` + +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 +``` diff --git a/fuzz/fuzz_targets/fuzz_parse_sql.rs b/fuzz/fuzz_targets/fuzz_parse_sql.rs new file mode 100644 index 000000000..629fa360b --- /dev/null +++ b/fuzz/fuzz_targets/fuzz_parse_sql.rs @@ -0,0 +1,12 @@ +use honggfuzz::fuzz; +use sqlparser::dialect::GenericDialect; +use sqlparser::parser::Parser; + +fn main() { + loop { + fuzz!(|data: String| { + let dialect = GenericDialect {}; + let _ = Parser::parse_sql(&dialect, &data); + }); + } +}