From 1b93d83ff7d60c840bda56dd331cacefa782eb12 Mon Sep 17 00:00:00 2001 From: Boshen Date: Sun, 12 Mar 2023 00:44:42 +0800 Subject: [PATCH] chore(oxc_parser): setup fuzzer closes #155 --- .github/workflows/fuzz.yaml | 27 ++ crates/oxc_parser/fuzz/.gitignore | 3 + crates/oxc_parser/fuzz/Cargo.lock | 338 ++++++++++++++++++ crates/oxc_parser/fuzz/Cargo.toml | 26 ++ crates/oxc_parser/fuzz/REAME.md | 14 + crates/oxc_parser/fuzz/fuzz_targets/parser.rs | 15 + 6 files changed, 423 insertions(+) create mode 100644 .github/workflows/fuzz.yaml create mode 100644 crates/oxc_parser/fuzz/.gitignore create mode 100644 crates/oxc_parser/fuzz/Cargo.lock create mode 100644 crates/oxc_parser/fuzz/Cargo.toml create mode 100644 crates/oxc_parser/fuzz/REAME.md create mode 100644 crates/oxc_parser/fuzz/fuzz_targets/parser.rs diff --git a/.github/workflows/fuzz.yaml b/.github/workflows/fuzz.yaml new file mode 100644 index 000000000..adc9f5f78 --- /dev/null +++ b/.github/workflows/fuzz.yaml @@ -0,0 +1,27 @@ +name: Cargo Fuzz + +on: + workflow_dispatch: + +env: + CARGO_TERM_QUIET: true + +jobs: + fuzz: + name: Cargo Fuzz + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Cache + uses: Swatinem/rust-cache@v2 + + - name: Install cargo-fuzz + run: cargo install cargo-fuzz + + - name: Run + run: | + cd crates/oxc_parser/fuzz + cargo fuzz run --release parser -- -only_ascii=1 -max_total_time=900 + diff --git a/crates/oxc_parser/fuzz/.gitignore b/crates/oxc_parser/fuzz/.gitignore new file mode 100644 index 000000000..a0925114d --- /dev/null +++ b/crates/oxc_parser/fuzz/.gitignore @@ -0,0 +1,3 @@ +target +corpus +artifacts diff --git a/crates/oxc_parser/fuzz/Cargo.lock b/crates/oxc_parser/fuzz/Cargo.lock new file mode 100644 index 000000000..f5022a312 --- /dev/null +++ b/crates/oxc_parser/fuzz/Cargo.lock @@ -0,0 +1,338 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "arbitrary" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e90af4de65aa7b293ef2d09daff88501eb254f58edde2e1ac02c82d873eadad" + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bumpalo" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" + +[[package]] +name = "castaway" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a17ed5635fc8536268e5d4de1e22e81ac34419e5f052d4d51f4e01dcc263fcc" +dependencies = [ + "rustversion", +] + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +dependencies = [ + "jobserver", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "compact_str" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bff0805f79ecb1b35163f3957a6934ea8d04fcd36ef98b52e7316f63e72e73d1" +dependencies = [ + "castaway", + "cfg-if", + "itoa", + "ryu", + "serde", + "static_assertions", +] + +[[package]] +name = "itoa" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" + +[[package]] +name = "jobserver" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" +dependencies = [ + "libc", +] + +[[package]] +name = "libc" +version = "0.2.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99227334921fae1a979cf0bfdfcc6b3e5ce376ef57e16fb6fb3ea2ed6095f80c" + +[[package]] +name = "libfuzzer-sys" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "beb09950ae85a0a94b27676cccf37da5ff13f27076aa1adbc6545dd0d0e1bd4e" +dependencies = [ + "arbitrary", + "cc", + "once_cell", +] + +[[package]] +name = "miette" +version = "5.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4afd9b301defa984bbdbe112b4763e093ed191750a0d914a78c1106b2d0fe703" +dependencies = [ + "miette-derive", + "once_cell", + "thiserror", + "unicode-width", +] + +[[package]] +name = "miette-derive" +version = "5.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97c2401ab7ac5282ca5c8b518a87635b1a93762b0b90b9990c509888eeccba29" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "num-bigint" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" + +[[package]] +name = "ordered-float" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d84eb1409416d254e4a9c8fa56cc24701755025b458f0fcd8e59e1f5f40c23bf" +dependencies = [ + "num-traits", + "serde", +] + +[[package]] +name = "oxc_allocator" +version = "0.0.0" +dependencies = [ + "bumpalo", + "serde", +] + +[[package]] +name = "oxc_ast" +version = "0.0.0" +dependencies = [ + "bitflags", + "compact_str", + "miette", + "num-bigint", + "ordered-float", + "oxc_allocator", + "ryu-js", + "serde", + "thiserror", +] + +[[package]] +name = "oxc_diagnostics" +version = "0.0.0" +dependencies = [ + "miette", + "oxc_ast", + "thiserror", +] + +[[package]] +name = "oxc_fuzzer" +version = "0.0.0" +dependencies = [ + "libfuzzer-sys", + "oxc_allocator", + "oxc_ast", + "oxc_parser", +] + +[[package]] +name = "oxc_parser" +version = "0.0.0" +dependencies = [ + "bitflags", + "num-bigint", + "oxc_allocator", + "oxc_ast", + "oxc_diagnostics", + "rustc-hash", + "unicode-id-start", +] + +[[package]] +name = "proc-macro2" +version = "1.0.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d727cae5b39d21da60fa540906919ad737832fe0b1c165da3a34d6548c849d6" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustversion" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" + +[[package]] +name = "ryu" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" + +[[package]] +name = "ryu-js" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6518fc26bced4d53678a22d6e423e9d8716377def84545fe328236e3af070e7f" + +[[package]] +name = "serde" +version = "1.0.154" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cdd151213925e7f1ab45a9bbfb129316bd00799784b174b7cc7bcd16961c49e" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.154" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fc80d722935453bcafdc2c9a73cd6fac4dc1938f0346035d84bf99fa9e33217" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "1.0.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5ab016db510546d856297882807df8da66a16fb8c4101cb8b30054b0d5b2d9c" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5420d42e90af0c38c3290abcca25b9b3bdf379fc9f55c528f53a269d9c9a267e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "unicode-id-start" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e15598ae4ac01f33d64525526e028beb497b216015dd768c44187a62b44cbce8" + +[[package]] +name = "unicode-ident" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" + +[[package]] +name = "unicode-width" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" diff --git a/crates/oxc_parser/fuzz/Cargo.toml b/crates/oxc_parser/fuzz/Cargo.toml new file mode 100644 index 000000000..d8c9f0583 --- /dev/null +++ b/crates/oxc_parser/fuzz/Cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "oxc_fuzzer" +version = "0.0.0" +publish = false +edition = "2018" + +[package.metadata] +cargo-fuzz = true + +[dependencies] +oxc_ast = { path = "../../oxc_ast" } +oxc_allocator = { path = "../../oxc_allocator" } +libfuzzer-sys = "0.4" + +[dependencies.oxc_parser] +path = ".." + +# Prevent this from interfering with workspaces +[workspace] +members = ["."] + +[[bin]] +name = "parser" +path = "fuzz_targets/parser.rs" +test = false +doc = false diff --git a/crates/oxc_parser/fuzz/REAME.md b/crates/oxc_parser/fuzz/REAME.md new file mode 100644 index 000000000..5862d6a0f --- /dev/null +++ b/crates/oxc_parser/fuzz/REAME.md @@ -0,0 +1,14 @@ +# Fuzzer + +# Installation + +```bash +cargo install cargo-fuzz +``` + +Run fuzzer for the parser, for 15mins. + +```bash +cd crates/oxc_parser/fuzz +cargo fuzz run parser -- -only_ascii=1 -max_total_time=900 +``` diff --git a/crates/oxc_parser/fuzz/fuzz_targets/parser.rs b/crates/oxc_parser/fuzz/fuzz_targets/parser.rs new file mode 100644 index 000000000..8e57810a0 --- /dev/null +++ b/crates/oxc_parser/fuzz/fuzz_targets/parser.rs @@ -0,0 +1,15 @@ +#![no_main] + +use oxc_allocator::Allocator; +use oxc_ast::SourceType; +use oxc_parser::Parser; + +libfuzzer_sys::fuzz_target!(|data: &[u8]| { + if let Ok(s) = std::str::from_utf8(data) { + if s.chars().all(|s| !s.is_control()) { + let allocator = Allocator::default(); + let source_type = *SourceType::default().with_typescript(true).with_jsx(true); + let _ = Parser::new(&allocator, &s, source_type).parse(); + } + } +});