diff --git a/.github/workflows/fuzz.yml b/.github/workflows/fuzz.yml index 17604dd8..20588921 100644 --- a/.github/workflows/fuzz.yml +++ b/.github/workflows/fuzz.yml @@ -23,9 +23,6 @@ decode_program, parse_human, ] steps: - - name: Install test dependencies - run: sudo apt-get update -y && sudo apt-get install -y binutils-dev libunwind8-dev libcurl4-openssl-dev libelf-dev libdw-dev cmake gcc libiberty-dev - - name: Checkout Crate uses: actions/checkout@v4 @@ -38,15 +35,18 @@ parse_human, fuzz/target target key: cache-${{ matrix.target }}-${{ hashFiles('**/Cargo.toml','**/Cargo.lock') }} + - name: Install Toolchain - uses: dtolnay/rust-toolchain@stable + uses: dtolnay/rust-toolchain@master with: - toolchain: '1.65.0' + toolchain: nightly-2024-07-01 + components: "llvm-tools-preview" + + - name: Install Dependencies + run: cargo update && cargo update -p cc --precise 1.0.83 && cargo install cargo-fuzz - name: Run Fuzz Target - run: | - echo "Using RUSTFLAGS $RUSTFLAGS" - cd fuzz && cargo update && cargo update -p cc --precise 1.0.83 && ./fuzz.sh "${{ matrix.fuzz_target }}" + run: ./fuzz/fuzz.sh "${{ matrix.fuzz_target }}" - name: Prepare Artifact run: echo "${{ matrix.fuzz_target }}" >executed_${{ matrix.fuzz_target }} diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3ca7b951..3aa9945c 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -54,7 +54,7 @@ jobs: - stable - beta - nightly - - 1.63.0 + - 1.78.0 steps: - name: Checkout Crate uses: actions/checkout@v4 diff --git a/.gitignore b/.gitignore index 8a281a0e..e2d17abc 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,8 @@ Cargo.lock #fuzz fuzz/hfuzz_target fuzz/hfuzz_workspace +fuzz/artifacts +fuzz/corpus #IntelliJ project files .idea diff --git a/Cargo-recent.lock b/Cargo-recent.lock index 7e0560e7..fe5d5c18 100644 --- a/Cargo-recent.lock +++ b/Cargo-recent.lock @@ -2,6 +2,21 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "arbitrary" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" + [[package]] name = "arrayvec" version = "0.7.6" @@ -24,6 +39,12 @@ version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + [[package]] name = "bech32" version = "0.11.0" @@ -32,9 +53,9 @@ checksum = "d965446196e3b7decd44aa7ee49e31d630118f90ef12f97900f262eb915c951d" [[package]] name = "bitcoin" -version = "0.32.2" +version = "0.32.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea507acc1cd80fc084ace38544bbcf7ced7c2aa65b653b102de0ce718df668f6" +checksum = "ce6bc65742dea50536e35ad42492b234c27904a27f0abdcbce605015cb4ea026" dependencies = [ "base58ck", "bech32", @@ -59,9 +80,9 @@ dependencies = [ [[package]] name = "bitcoin-io" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "340e09e8399c7bd8912f495af6aa58bea0c9214773417ffaa8f6460f93aaee56" +checksum = "0b47c4ab7a93edb0c7198c5535ed9b52b63095f4e9b45279c6736cec4b856baf" [[package]] name = "bitcoin-private" @@ -92,23 +113,25 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.15.4" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "cc" -version = "1.0.83" +version = "1.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "0c3d1b2e905a3a7b00a6141adb0e4c0bb941d11caf55349d863942a1cc44e3c9" dependencies = [ + "jobserver", "libc", + "shlex", ] [[package]] @@ -119,9 +142,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "elements" -version = "0.25.0" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "739a0201c8b2d1e35e6509872ddb8250dd37b38d2a462b9cea05988bf9630196" +checksum = "e8ab681914c4d96235d4c30d6a758f4aeb4eace26837f4995ca84bf7ea3189ea" dependencies = [ "bech32", "bitcoin", @@ -164,57 +187,57 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3011d1213f159867b13cfd6ac92d2cd5f1345762c63be3554e84092d85a50bbd" [[package]] -name = "honggfuzz" -version = "0.5.56" +name = "jobserver" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c76b6234c13c9ea73946d1379d33186151148e0da231506b964b44f3d023505" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ - "lazy_static", - "memmap2", - "rustc_version", + "libc", ] [[package]] name = "js-sys" -version = "0.3.70" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ + "once_cell", "wasm-bindgen", ] [[package]] -name = "lazy_static" -version = "1.5.0" +name = "libc" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] -name = "libc" -version = "0.2.159" +name = "libfuzzer-sys" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" +checksum = "cf78f52d400cf2d84a3a973a78a592b4adc535739e0a5597a0da6f0c357adc75" +dependencies = [ + "arbitrary", + "cc", +] [[package]] name = "log" -version = "0.4.22" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" [[package]] -name = "memmap2" -version = "0.9.5" +name = "memchr" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" -dependencies = [ - "libc", -] +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "miniscript" -version = "12.2.0" +version = "12.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "add2d4aee30e4291ce5cffa3a322e441ff4d4bc57b38c8d9bf0e94faa50ab626" +checksum = "5bd3c9608217b0d6fa9c9c8ddd875b85ab72bd4311cfc8db35e1b5a08fc11f4d" dependencies = [ "bech32", "bitcoin", @@ -222,9 +245,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.17.2" +version = "1.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9670a07f94779e00908f3e686eab508878ebb390ba6e604d3a284c00e8d0487b" +checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" [[package]] name = "ppv-lite86" @@ -237,18 +260,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.37" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -285,27 +308,32 @@ dependencies = [ [[package]] name = "regex" -version = "1.8.4" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0ab3ca65655bb1e41f2a8c8cd662eb4fb035e67c3f78da1d61dffe89d07300f" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", "regex-syntax", ] [[package]] -name = "regex-syntax" -version = "0.7.2" +name = "regex-automata" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] [[package]] -name = "rustc_version" -version = "0.4.1" +name = "regex-syntax" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "santiago" @@ -352,45 +380,45 @@ dependencies = [ [[package]] name = "secp256k1-zkp-sys" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c6eea7919e0cab992510edfbf40bd9342c0a3c2bb910f2c51355c2cb2d69839" +checksum = "57f08b2d0b143a22e07f798ae4f0ab20d5590d7c68e0d090f2088a48a21d1654" dependencies = [ "cc", "secp256k1-sys", ] -[[package]] -name = "semver" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" - [[package]] name = "serde" -version = "1.0.210" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.210" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", "syn", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "simpcli" version = "0.3.0" dependencies = [ - "base64", + "base64 0.21.7", "simplicity-lang", ] @@ -398,7 +426,8 @@ dependencies = [ name = "simplicity-fuzz" version = "0.0.1" dependencies = [ - "honggfuzz", + "base64 0.22.1", + "libfuzzer-sys", "simplicity-lang", ] @@ -428,9 +457,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.56" +version = "2.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2415488199887523e74fd9a5f7be804dfd42d868ae0eca382e3917094d210e" +checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" dependencies = [ "proc-macro2", "quote", @@ -439,9 +468,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.13" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" [[package]] name = "wasi" @@ -451,9 +480,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.93" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", "once_cell", @@ -462,13 +491,12 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.93" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", "syn", @@ -477,9 +505,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.93" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -487,9 +515,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.93" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", @@ -500,9 +528,12 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.93" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "zerocopy" diff --git a/Cargo.toml b/Cargo.toml index 8eb3fccc..43adffc7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ repository = "https://github.com/BlockstreamResearch/rust-simplicity/" documentation = "https://docs.rs/simplicity-lang/" description = "General purpose library for processing Simplicity programs" edition = "2021" -rust-version = "1.63.0" +rust-version = "1.78.0" [features] default = ["elements"] diff --git a/README.md b/README.md index 5661fda4..96707e02 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Under development.... # Minimum Supported Rust Version -The MSRV of this crate is **1.63.0**. +The MSRV of this crate is **1.78.0**. # Updating jets code diff --git a/clippy.toml b/clippy.toml index 31a5c0d2..b6dfc821 100644 --- a/clippy.toml +++ b/clippy.toml @@ -1,4 +1,4 @@ -msrv = "1.63.0" +msrv = "1.78.0" # Default 250, not sure what units. But it does not like the generic node stuff. type-complexity-threshold = 1000 diff --git a/fuzz/Cargo.toml b/fuzz/Cargo.toml index 591a7491..d2e47157 100644 --- a/fuzz/Cargo.toml +++ b/fuzz/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "simplicity-fuzz" edition = "2021" -rust-version = "1.63.0" +rust-version = "1.78.0" version = "0.0.1" authors = ["Generated by fuzz/generate-files.sh"] publish = false @@ -10,21 +10,39 @@ publish = false cargo-fuzz = true [dependencies] -honggfuzz = { version = "0.5.55", default-features = false } +libfuzzer-sys = "0.4" simplicity-lang = { path = "..", features = ["test-utils"] } +[dev-dependencies] +base64 = "0.22.1" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(fuzzing)'] } + [[bin]] name = "c_rust_merkle" path = "fuzz_targets/c_rust_merkle.rs" +test = false +doc = false +bench = false [[bin]] name = "decode_natural" path = "fuzz_targets/decode_natural.rs" +test = false +doc = false +bench = false [[bin]] name = "decode_program" path = "fuzz_targets/decode_program.rs" +test = false +doc = false +bench = false [[bin]] name = "parse_human" path = "fuzz_targets/parse_human.rs" +test = false +doc = false +bench = false diff --git a/fuzz/cycle.sh b/fuzz/cycle.sh index 0b59827a..07f3b2aa 100755 --- a/fuzz/cycle.sh +++ b/fuzz/cycle.sh @@ -2,10 +2,10 @@ # Continuosly cycle over fuzz targets running each for 1 hour. # It uses chrt SCHED_IDLE so that other process takes priority. -# -# For hfuzz options see https://github.com/google/honggfuzz/blob/master/docs/USAGE.md -set -e +set -o errexit # exit immediately if any command fails +set -o xtrace # print trace of executed commands + REPO_DIR=$(git rev-parse --show-toplevel) # shellcheck source=./fuzz-util.sh source "$REPO_DIR/fuzz/fuzz-util.sh" @@ -14,12 +14,11 @@ while : do for targetFile in $(listTargetFiles); do targetName=$(targetFileToName "$targetFile") - echo "Fuzzing target $targetName ($targetFile)" # fuzz for one hour - HFUZZ_RUN_ARGS='--run_time 3600' chrt -i 0 cargo hfuzz run "$targetName" + chrt -i 0 cargo-fuzz run "$targetName" -- -max_total_time=3600 # minimize the corpus - HFUZZ_RUN_ARGS="-i hfuzz_workspace/$targetName/input/ -P -M" chrt -i 0 cargo hfuzz run "$targetName" + cargo-fuzz cmin "$targetName" done done diff --git a/fuzz/fuzz-util.sh b/fuzz/fuzz-util.sh index d6377e4e..a845d307 100755 --- a/fuzz/fuzz-util.sh +++ b/fuzz/fuzz-util.sh @@ -15,14 +15,6 @@ targetFileToName() { | sed 's/\//_/g' } -targetFileToHFuzzInputArg() { - baseName=$(basename "$1") - dirName="${baseName%.*}" - if [ -d "hfuzz_input/$dirName" ]; then - echo "HFUZZ_INPUT_ARGS=\"-f hfuzz_input/$FILE/input\"" - fi -} - listTargetNames() { for target in $(listTargetFiles); do targetFileToName "$target" @@ -37,23 +29,3 @@ checkWindowsFiles() { exit 2 fi } - -# Checks whether a fuzz case output some report, and dumps it in hex -getReport() { - reportFile="hfuzz_workspace/$1/HONGGFUZZ.REPORT.TXT" - if [ -f "$reportFile" ]; then - cat "$reportFile" - for CASE in "hfuzz_workspace/$1/SIG"*; do - xxd -p -c10000 < "$CASE" - done - return 1 - fi - return 0 -} - -# Check for reports and exit if there are any -checkReport() { - if ! getReport "$1"; then - exit 1 - fi -} diff --git a/fuzz/fuzz.sh b/fuzz/fuzz.sh index 5fc65ae6..69bb1102 100755 --- a/fuzz/fuzz.sh +++ b/fuzz/fuzz.sh @@ -1,5 +1,6 @@ #!/usr/bin/env bash -set -ex +set -o errexit # exit immediately if any command fails +set -o xtrace # print trace of executed commands REPO_DIR=$(git rev-parse --show-toplevel) @@ -18,17 +19,8 @@ fi cargo --version rustc --version -# Testing -cargo install --force honggfuzz --no-default-features +# Run fuzz target for targetFile in $targetFiles; do targetName=$(targetFileToName "$targetFile") - echo "Fuzzing target $targetName ($targetFile)" - if [ -d "hfuzz_input/$targetName" ]; then - HFUZZ_INPUT_ARGS="-f hfuzz_input/$targetName/input\"" - else - HFUZZ_INPUT_ARGS="" - fi - HFUZZ_RUN_ARGS="--run_time 30 --exit_upon_crash -v $HFUZZ_INPUT_ARGS" cargo hfuzz run "$targetName" - - checkReport "$targetName" + cargo-fuzz run "$targetName" -- -max_total_time=30 done diff --git a/fuzz/fuzz_targets/c_rust_merkle.rs b/fuzz/fuzz_targets/c_rust_merkle.rs index 6a2cf67e..f39b8aac 100644 --- a/fuzz/fuzz_targets/c_rust_merkle.rs +++ b/fuzz/fuzz_targets/c_rust_merkle.rs @@ -1,13 +1,14 @@ // SPDX-License-Identifier: CC0-1.0 -use honggfuzz::fuzz; - -use simplicity::ffi::tests::{ffi::SimplicityErr, run_program, TestUpTo}; -use simplicity::hashes::sha256::Midstate; -use simplicity::jet::Elements; -use simplicity::{BitIter, RedeemNode}; +#![cfg_attr(fuzzing, no_main)] +#[cfg(any(fuzzing, test))] fn do_test(data: &[u8]) { + use simplicity::ffi::tests::{ffi::SimplicityErr, run_program, TestUpTo}; + use simplicity::hashes::sha256::Midstate; + use simplicity::jet::Elements; + use simplicity::{BitIter, RedeemNode}; + // To decode the program length, we first try decoding the program using // `decode_expression` which will not error on a length check. Alternately // we could decode using RedeemNode::decode and then extract the length @@ -54,37 +55,21 @@ fn do_test(data: &[u8]) { } } -fn main() { - loop { - fuzz!(|data| { - do_test(data); - }); - } -} +#[cfg(fuzzing)] +libfuzzer_sys::fuzz_target!(|data| do_test(data)); + +#[cfg(not(fuzzing))] +fn main() {} #[cfg(test)] mod tests { - fn extend_vec_from_hex(hex: &str, out: &mut Vec) { - let mut b = 0; - for (idx, c) in hex.as_bytes().iter().enumerate() { - b <<= 4; - match *c { - b'A'..=b'F' => b |= c - b'A' + 10, - b'a'..=b'f' => b |= c - b'a' + 10, - b'0'..=b'9' => b |= c - b'0', - _ => panic!("Bad hex"), - } - if (idx & 1) == 1 { - out.push(b); - b = 0; - } - } - } + use base64::Engine; #[test] fn duplicate_crash() { - let mut a = Vec::new(); - extend_vec_from_hex("ffffff0000010080800000000000380000001adfc7040000000000000000000007fffffffffffffe1000000000000000000001555600000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff0300000000000000000000000000000000000000000000000000008000000000000000ffffffffffffff7f00000000000000ffffff151515111515155555555555d6eeffffff00", &mut a); - super::do_test(&a); + let data = base64::prelude::BASE64_STANDARD + .decode("Cg==") + .expect("base64 should be valid"); + super::do_test(&data); } } diff --git a/fuzz/fuzz_targets/decode_natural.rs b/fuzz/fuzz_targets/decode_natural.rs index 581c6357..af2829a1 100644 --- a/fuzz/fuzz_targets/decode_natural.rs +++ b/fuzz/fuzz_targets/decode_natural.rs @@ -1,11 +1,12 @@ // SPDX-License-Identifier: CC0-1.0 -use honggfuzz::fuzz; - -use simplicity::encode_natural; -use simplicity::{BitIter, BitWriter}; +#![cfg_attr(fuzzing, no_main)] +#[cfg(any(fuzzing, test))] fn do_test(data: &[u8]) { + use simplicity::encode_natural; + use simplicity::{BitIter, BitWriter}; + let mut iter = BitIter::new(data.iter().cloned()); if let Ok(natural) = iter.read_natural(None) { @@ -28,37 +29,21 @@ fn do_test(data: &[u8]) { } } -fn main() { - loop { - fuzz!(|data| { - do_test(data); - }); - } -} +#[cfg(fuzzing)] +libfuzzer_sys::fuzz_target!(|data| do_test(data)); + +#[cfg(not(fuzzing))] +fn main() {} #[cfg(test)] mod tests { - fn extend_vec_from_hex(hex: &str, out: &mut Vec) { - let mut b = 0; - for (idx, c) in hex.as_bytes().iter().enumerate() { - b <<= 4; - match *c { - b'A'..=b'F' => b |= c - b'A' + 10, - b'a'..=b'f' => b |= c - b'a' + 10, - b'0'..=b'9' => b |= c - b'0', - _ => panic!("Bad hex"), - } - if (idx & 1) == 1 { - out.push(b); - b = 0; - } - } - } + use base64::Engine; #[test] fn duplicate_crash() { - let mut a = Vec::new(); - extend_vec_from_hex("00000", &mut a); - super::do_test(&a); + let data = base64::prelude::BASE64_STANDARD + .decode("Cg==") + .expect("base64 should be valid"); + super::do_test(&data); } } diff --git a/fuzz/fuzz_targets/decode_program.rs b/fuzz/fuzz_targets/decode_program.rs index a01882f9..e4583d83 100644 --- a/fuzz/fuzz_targets/decode_program.rs +++ b/fuzz/fuzz_targets/decode_program.rs @@ -1,11 +1,12 @@ // SPDX-License-Identifier: CC0-1.0 -use honggfuzz::fuzz; - -use simplicity::jet::Core; -use simplicity::{BitIter, BitWriter, RedeemNode}; +#![cfg_attr(fuzzing, no_main)] +#[cfg(any(fuzzing, test))] fn do_test(data: &[u8]) { + use simplicity::jet::Core; + use simplicity::{BitIter, BitWriter, RedeemNode}; + let prog_iter = BitIter::new(data.iter().cloned()); let wit_iter = BitIter::new(core::iter::repeat(0)); if let Ok(program) = RedeemNode::::decode(prog_iter, wit_iter) { @@ -24,37 +25,21 @@ fn do_test(data: &[u8]) { } } -fn main() { - loop { - fuzz!(|data| { - do_test(data); - }); - } -} +#[cfg(fuzzing)] +libfuzzer_sys::fuzz_target!(|data| do_test(data)); + +#[cfg(not(fuzzing))] +fn main() {} #[cfg(test)] mod tests { - fn extend_vec_from_hex(hex: &str, out: &mut Vec) { - let mut b = 0; - for (idx, c) in hex.as_bytes().iter().enumerate() { - b <<= 4; - match *c { - b'A'..=b'F' => b |= c - b'A' + 10, - b'a'..=b'f' => b |= c - b'a' + 10, - b'0'..=b'9' => b |= c - b'0', - _ => panic!("Bad hex"), - } - if (idx & 1) == 1 { - out.push(b); - b = 0; - } - } - } + use base64::Engine; #[test] fn duplicate_crash() { - let mut a = Vec::new(); - extend_vec_from_hex("00000", &mut a); - super::do_test(&a); + let data = base64::prelude::BASE64_STANDARD + .decode("Cg==") + .expect("base64 should be valid"); + super::do_test(&data); } } diff --git a/fuzz/fuzz_targets/parse_human.rs b/fuzz/fuzz_targets/parse_human.rs index 60199526..877e5a8b 100644 --- a/fuzz/fuzz_targets/parse_human.rs +++ b/fuzz/fuzz_targets/parse_human.rs @@ -1,12 +1,13 @@ // SPDX-License-Identifier: CC0-1.0 -use honggfuzz::fuzz; -use simplicity::human_encoding::Forest; -use simplicity::jet::Elements; -use std::str; +#![cfg_attr(fuzzing, no_main)] +#[cfg(any(fuzzing, test))] fn do_test(data: &[u8]) { - let s = match str::from_utf8(data) { + use simplicity::human_encoding::Forest; + use simplicity::jet::Elements; + + let s = match std::str::from_utf8(data) { Ok(s) => s, Err(_) => return, }; @@ -18,37 +19,21 @@ fn do_test(data: &[u8]) { } } -fn main() { - loop { - fuzz!(|data| { - do_test(data); - }); - } -} +#[cfg(fuzzing)] +libfuzzer_sys::fuzz_target!(|data| do_test(data)); + +#[cfg(not(fuzzing))] +fn main() {} #[cfg(test)] mod tests { - fn extend_vec_from_hex(hex: &str, out: &mut Vec) { - let mut b = 0; - for (idx, c) in hex.as_bytes().iter().enumerate() { - b <<= 4; - match *c { - b'A'..=b'F' => b |= c - b'A' + 10, - b'a'..=b'f' => b |= c - b'a' + 10, - b'0'..=b'9' => b |= c - b'0', - _ => panic!("Bad hex"), - } - if (idx & 1) == 1 { - out.push(b); - b = 0; - } - } - } + use base64::Engine; #[test] fn duplicate_crash() { - let mut a = Vec::new(); - extend_vec_from_hex("00", &mut a); - super::do_test(&a); + let data = base64::prelude::BASE64_STANDARD + .decode("Cg==") + .expect("base64 should be valid"); + super::do_test(&data); } } diff --git a/fuzz/generate-files.sh b/fuzz/generate-files.sh index c9f4842c..ece77261 100755 --- a/fuzz/generate-files.sh +++ b/fuzz/generate-files.sh @@ -12,7 +12,7 @@ cat > "$REPO_DIR/fuzz/Cargo.toml" <executed_\${{ matrix.fuzz_target }} diff --git a/fuzz/honggfuzz-rs.nix b/fuzz/honggfuzz-rs.nix deleted file mode 100644 index 2a8c8931..00000000 --- a/fuzz/honggfuzz-rs.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ - nixpkgs ? import {} -}: -nixpkgs.rustPlatform.buildRustPackage rec { - pname = "honggfuzz-rs"; - version = "0.5.55-git"; - - src = fetchGit { - url = "https://github.com/rust-fuzz/honggfuzz-rs"; - ref = "master"; - }; - cargoLock = { - lockFile = "${src}/Cargo.lock"; - }; - # Pinned version because of breaking change in args to init_disassemble_info - buildInputs = with nixpkgs; [ - libopcodes_2_38 # for dis-asm.h and bfd.h - libunwind # for libunwind-ptrace.h - ]; -} diff --git a/fuzz/shell.nix b/fuzz/shell.nix deleted file mode 100644 index 491e8389..00000000 --- a/fuzz/shell.nix +++ /dev/null @@ -1,14 +0,0 @@ -{ - pkgs ? import {} -}: -let - cargoHfuzz = import ./honggfuzz-rs.nix { }; -in -pkgs.mkShell { - buildInputs = [ - cargoHfuzz - ]; - shellHook = '' - source fuzz-util.sh - ''; -} diff --git a/simplicity-sys/Cargo.toml b/simplicity-sys/Cargo.toml index 2920aed3..e60e2a49 100644 --- a/simplicity-sys/Cargo.toml +++ b/simplicity-sys/Cargo.toml @@ -7,7 +7,7 @@ repository = "https://github.com/BlockstreamResearch/rust-simplicity/" documentation = "https://docs.rs/simplicity-sys/" description = "FFI bindings to libsimplicity" edition = "2021" -rust-version = "1.63.0" +rust-version = "1.78.0" [build-dependencies] cc = "1.0.83" diff --git a/simplicity-sys/src/c_jets/c_frame.rs b/simplicity-sys/src/c_jets/c_frame.rs index 9fafccec..1a1ea481 100644 --- a/simplicity-sys/src/c_jets/c_frame.rs +++ b/simplicity-sys/src/c_jets/c_frame.rs @@ -53,7 +53,7 @@ impl CFrameItem { /// Number of UWORDs required to hold n bits pub fn uword_width(n_bits: usize) -> usize { - (n_bits + 8 * mem::size_of::() - 1) / (8 * mem::size_of::()) + n_bits.div_ceil(8 * mem::size_of::()) } /// Number of bytes required to hold n bits