From e8fe5bb614cfbba2e6efe7c00174c89df13d2ab1 Mon Sep 17 00:00:00 2001 From: "Dongjia \"toka\" Zhang" Date: Mon, 8 Apr 2024 19:24:56 +0200 Subject: [PATCH] Move HasMetadata/HasNamedMetadata trait to libafl_bolts (#2016) * move around * fmt * rev * fmt * doc job * name * move to libafl * separate even more * miri --- .github/workflows/build_and_test.yml | 68 ++++++-- fuzzers/baby_fuzzer_grimoire/src/main.rs | 3 +- fuzzers/baby_fuzzer_nautilus/src/main.rs | 3 +- fuzzers/forkserver_libafl_cc/src/main.rs | 3 +- fuzzers/forkserver_simple/src/main.rs | 3 +- fuzzers/frida_executable_libpng/src/fuzzer.rs | 4 +- fuzzers/frida_gdiplus/src/fuzzer.rs | 4 +- fuzzers/frida_libpng/src/fuzzer.rs | 4 +- fuzzers/fuzzbench/src/lib.rs | 4 +- fuzzers/fuzzbench_ctx/src/lib.rs | 4 +- fuzzers/fuzzbench_fork_qemu/src/fuzzer.rs | 4 +- fuzzers/fuzzbench_forkserver/src/main.rs | 4 +- .../fuzzbench_forkserver_cmplog/src/main.rs | 4 +- fuzzers/fuzzbench_qemu/src/fuzzer.rs | 4 +- fuzzers/fuzzbench_text/src/lib.rs | 4 +- fuzzers/libafl_atheris/src/lib.rs | 4 +- fuzzers/libfuzzer_libmozjpeg/src/lib.rs | 4 +- fuzzers/libfuzzer_libpng/src/lib.rs | 4 +- .../libfuzzer_libpng_accounting/src/lib.rs | 4 +- fuzzers/libfuzzer_libpng_aflpp_ui/src/lib.rs | 4 +- .../libfuzzer_libpng_centralized/src/lib.rs | 4 +- fuzzers/libfuzzer_libpng_cmin/src/lib.rs | 4 +- fuzzers/libfuzzer_libpng_launcher/src/lib.rs | 4 +- fuzzers/libfuzzer_libpng_norestart/src/lib.rs | 4 +- .../libfuzzer_libpng_tcp_manager/src/lib.rs | 4 +- fuzzers/nautilus_sync/src/lib.rs | 4 +- fuzzers/qemu_launcher/src/instance.rs | 4 +- fuzzers/tutorial/src/metadata.rs | 4 +- libafl/src/common/mod.rs | 149 ++++++++++++++++++ libafl/src/corpus/inmemory_ondisk.rs | 3 +- libafl/src/corpus/minimizer.rs | 4 +- libafl/src/corpus/testcase.rs | 3 +- libafl/src/events/centralized.rs | 4 +- libafl/src/events/llmp.rs | 4 +- libafl/src/events/mod.rs | 4 +- libafl/src/events/simple.rs | 4 +- libafl/src/events/tcp.rs | 4 +- libafl/src/executors/inprocess/mod.rs | 4 +- libafl/src/feedbacks/concolic.rs | 4 +- libafl/src/feedbacks/differential.rs | 4 +- libafl/src/feedbacks/list.rs | 3 +- libafl/src/feedbacks/map.rs | 4 +- libafl/src/feedbacks/nautilus.rs | 4 +- libafl/src/feedbacks/new_hash_feedback.rs | 4 +- libafl/src/feedbacks/transferred.rs | 7 +- libafl/src/fuzzer/mod.rs | 11 +- libafl/src/inputs/generalized.rs | 4 +- libafl/src/lib.rs | 2 + libafl/src/mutators/gramatron.rs | 4 +- libafl/src/mutators/grimoire.rs | 4 +- libafl/src/mutators/mopt_mutator.rs | 4 +- libafl/src/mutators/mutations.rs | 7 +- libafl/src/mutators/nautilus.rs | 4 +- libafl/src/mutators/scheduled.rs | 4 +- libafl/src/mutators/string.rs | 3 +- libafl/src/mutators/token_mutations.rs | 4 +- libafl/src/mutators/tuneable.rs | 4 +- libafl/src/observers/cmp.rs | 4 +- libafl/src/schedulers/accounting.rs | 4 +- libafl/src/schedulers/minimizer.rs | 4 +- libafl/src/schedulers/mod.rs | 4 +- libafl/src/schedulers/powersched.rs | 4 +- .../src/schedulers/probabilistic_sampling.rs | 8 +- libafl/src/schedulers/testcase_score.rs | 4 +- libafl/src/schedulers/tuneable.rs | 4 +- libafl/src/schedulers/weighted.rs | 4 +- libafl/src/stages/calibrate.rs | 7 +- libafl/src/stages/colorization.rs | 4 +- libafl/src/stages/concolic.rs | 6 +- libafl/src/stages/dump.rs | 4 +- libafl/src/stages/generalization.rs | 4 +- libafl/src/stages/mod.rs | 11 +- libafl/src/stages/mutational.rs | 7 +- libafl/src/stages/power.rs | 4 +- libafl/src/stages/push/mod.rs | 4 +- libafl/src/stages/push/mutational.rs | 4 +- libafl/src/stages/stats.rs | 4 +- libafl/src/stages/string.rs | 3 +- libafl/src/stages/sync.rs | 4 +- libafl/src/stages/tmin.rs | 5 +- libafl/src/stages/tracing.rs | 4 +- libafl/src/stages/tuneable.rs | 7 +- libafl/src/state/mod.rs | 149 +----------------- libafl_frida/src/asan/errors.rs | 4 +- .../libafl_libfuzzer_runtime/src/feedbacks.rs | 4 +- .../libafl_libfuzzer_runtime/src/fuzz.rs | 4 +- .../libafl_libfuzzer_runtime/src/misc.rs | 2 +- .../libafl_libfuzzer_runtime/src/report.rs | 4 +- .../src/schedulers.rs | 4 +- libafl_qemu/src/asan.rs | 4 +- libafl_qemu/src/cmplog.rs | 2 +- libafl_qemu/src/drcov.rs | 4 +- libafl_qemu/src/edges.rs | 2 +- libafl_qemu/src/executor/mod.rs | 8 +- libafl_qemu/src/snapshot.rs | 2 +- libafl_sugar/src/forkserver.rs | 4 +- libafl_sugar/src/inmemory.rs | 4 +- libafl_sugar/src/qemu.rs | 3 +- libafl_targets/src/cmps/observers/aflpp.rs | 3 +- libafl_targets/src/cmps/observers/cmplog.rs | 3 +- .../src/cmps/stages/aflpptracing.rs | 6 +- 101 files changed, 402 insertions(+), 376 deletions(-) create mode 100644 libafl/src/common/mod.rs diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index b9c17061e6..544a777d4b 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -83,6 +83,64 @@ jobs: run: pwd && ls & cd libafl_cc && cargo build --release + ubuntu-doc: + runs-on: ubuntu-22.04 + steps: + - name: Remove Dotnet & Haskell + run: rm -rf /usr/share/dotnet && rm -rf /opt/ghc + - uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + - name: Remove existing clang and LLVM + run: sudo apt purge llvm* clang* lld* lldb* opt* + - name: Install and cache deps + run: sudo apt update && sudo apt install ninja-build shellcheck libgtk-3-dev gcc-arm-linux-gnueabi g++-arm-linux-gnueabi libslirp-dev libz3-dev + - name: Add nightly rustfmt and clippy + run: rustup toolchain install nightly --component rustfmt --component clippy --component miri --allow-downgrade + - name: Install ucd-generate + run: cargo install -f ucd-generate + - uses: actions/checkout@v3 + - uses: Swatinem/rust-cache@v2 + - name: Install LLVM and Clang + uses: KyleMayes/install-llvm-action@v1 + with: + directory: ${{ runner.temp }}/llvm + version: 17 + # ---- doc check ---- + - name: Build Docs + run: RUSTFLAGS="--cfg docsrs" cargo +nightly doc --all-features + - name: Test Docs + run: RUSTFLAGS="--cfg docsrs" cargo +nightly test --doc --all-features + + ubuntu-miri: + runs-on: ubuntu-22.04 + steps: + - name: Remove Dotnet & Haskell + run: rm -rf /usr/share/dotnet && rm -rf /opt/ghc + - uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + - name: Remove existing clang and LLVM + run: sudo apt purge llvm* clang* lld* lldb* opt* + - name: Install and cache deps + run: sudo apt update && sudo apt install ninja-build shellcheck libgtk-3-dev gcc-arm-linux-gnueabi g++-arm-linux-gnueabi libslirp-dev libz3-dev + - name: Add nightly rustfmt and clippy + run: rustup toolchain install nightly --component rustfmt --component clippy --component miri --allow-downgrade + - name: Install ucd-generate + run: cargo install -f ucd-generate + - uses: actions/checkout@v3 + - uses: Swatinem/rust-cache@v2 + - name: Install LLVM and Clang + uses: KyleMayes/install-llvm-action@v1 + with: + directory: ${{ runner.temp }}/llvm + version: 17 + # --- miri undefined behavior test -- + - name: Run miri tests + run: RUST_BACKTRACE=1 MIRIFLAGS="-Zmiri-disable-isolation" cargo +nightly miri test + ubuntu: runs-on: ubuntu-22.04 steps: @@ -119,22 +177,12 @@ jobs: run: clang-format -n -Werror --style=file $(find . -type f \( -name '*.cpp' -o -iname '*.hpp' -o -name '*.cc' -o -name '*.cxx' -o -name '*.cc' -o -name '*.h' \) | grep -v '/target/' | grep -v 'libpng-1\.6\.37' | grep -v 'stb_image\.h' | grep -v 'dlmalloc\.c' | grep -v 'QEMU-Nyx') - name: run shellcheck run: shellcheck ./scripts/*.sh - - # ---- doc check ---- - - name: Build Docs - run: RUSTFLAGS="--cfg docsrs" cargo +nightly doc --all-features - - name: Test Docs - run: RUSTFLAGS="--cfg docsrs" cargo +nightly test --doc --all-features # ---- build normal and examples ---- - name: Run a normal build run: cargo build --verbose - name: Build examples run: cargo build --examples --verbose - # --- miri undefined behavior test -- - - name: Run miri tests - run: RUST_BACKTRACE=1 MIRIFLAGS="-Zmiri-disable-isolation" cargo +nightly miri test - ubuntu-clippy: runs-on: ubuntu-22.04 steps: diff --git a/fuzzers/baby_fuzzer_grimoire/src/main.rs b/fuzzers/baby_fuzzer_grimoire/src/main.rs index b3be156e47..df84a52192 100644 --- a/fuzzers/baby_fuzzer_grimoire/src/main.rs +++ b/fuzzers/baby_fuzzer_grimoire/src/main.rs @@ -18,7 +18,8 @@ use libafl::{ observers::StdMapObserver, schedulers::QueueScheduler, stages::{mutational::StdMutationalStage, GeneralizationStage}, - state::{HasMetadata, StdState}, + state::StdState, + HasMetadata, }; use libafl_bolts::{current_nanos, rands::StdRand, tuples::tuple_list, AsSlice}; diff --git a/fuzzers/baby_fuzzer_nautilus/src/main.rs b/fuzzers/baby_fuzzer_nautilus/src/main.rs index 5c61c2bbc2..626b564580 100644 --- a/fuzzers/baby_fuzzer_nautilus/src/main.rs +++ b/fuzzers/baby_fuzzer_nautilus/src/main.rs @@ -18,7 +18,8 @@ use libafl::{ observers::StdMapObserver, schedulers::QueueScheduler, stages::mutational::StdMutationalStage, - state::{HasMetadata, StdState}, + state::StdState, + HasMetadata, }; use libafl_bolts::{current_nanos, rands::StdRand, tuples::tuple_list}; diff --git a/fuzzers/forkserver_libafl_cc/src/main.rs b/fuzzers/forkserver_libafl_cc/src/main.rs index e90f048272..05ceb79616 100644 --- a/fuzzers/forkserver_libafl_cc/src/main.rs +++ b/fuzzers/forkserver_libafl_cc/src/main.rs @@ -15,7 +15,8 @@ use libafl::{ observers::{HitcountsMapObserver, StdMapObserver, TimeObserver}, schedulers::{IndexesLenTimeMinimizerScheduler, QueueScheduler}, stages::mutational::StdMutationalStage, - state::{HasCorpus, HasMetadata, StdState}, + state::{HasCorpus, StdState}, + HasMetadata, }; use libafl_bolts::{ current_nanos, diff --git a/fuzzers/forkserver_simple/src/main.rs b/fuzzers/forkserver_simple/src/main.rs index a0c752eee1..558bbce11d 100644 --- a/fuzzers/forkserver_simple/src/main.rs +++ b/fuzzers/forkserver_simple/src/main.rs @@ -15,7 +15,8 @@ use libafl::{ observers::{HitcountsMapObserver, StdMapObserver, TimeObserver}, schedulers::{IndexesLenTimeMinimizerScheduler, QueueScheduler}, stages::mutational::StdMutationalStage, - state::{HasCorpus, HasMetadata, StdState}, + state::{HasCorpus, StdState}, + HasMetadata, }; use libafl_bolts::{ current_nanos, diff --git a/fuzzers/frida_executable_libpng/src/fuzzer.rs b/fuzzers/frida_executable_libpng/src/fuzzer.rs index 114b43538b..7d6240d3e0 100644 --- a/fuzzers/frida_executable_libpng/src/fuzzer.rs +++ b/fuzzers/frida_executable_libpng/src/fuzzer.rs @@ -23,8 +23,8 @@ use libafl::{ observers::{HitcountsMapObserver, StdMapObserver, TimeObserver}, schedulers::{IndexesLenTimeMinimizerScheduler, QueueScheduler}, stages::{ShadowTracingStage, StdMutationalStage}, - state::{HasCorpus, HasMetadata, StdState}, - Error, + state::{HasCorpus, StdState}, + Error, HasMetadata, }; #[cfg(unix)] use libafl::{feedback_and_fast, feedbacks::ConstFeedback}; diff --git a/fuzzers/frida_gdiplus/src/fuzzer.rs b/fuzzers/frida_gdiplus/src/fuzzer.rs index 57a334c072..54a0e80fca 100644 --- a/fuzzers/frida_gdiplus/src/fuzzer.rs +++ b/fuzzers/frida_gdiplus/src/fuzzer.rs @@ -29,8 +29,8 @@ use libafl::{ observers::{HitcountsMapObserver, StdMapObserver, TimeObserver}, schedulers::{IndexesLenTimeMinimizerScheduler, QueueScheduler}, stages::{ShadowTracingStage, StdMutationalStage}, - state::{HasCorpus, HasMetadata, StdState}, - Error, + state::{HasCorpus, StdState}, + Error, HasMetadata, }; #[cfg(unix)] use libafl::{feedback_and_fast, feedbacks::ConstFeedback}; diff --git a/fuzzers/frida_libpng/src/fuzzer.rs b/fuzzers/frida_libpng/src/fuzzer.rs index afd4ed7c51..ca3f223cd4 100644 --- a/fuzzers/frida_libpng/src/fuzzer.rs +++ b/fuzzers/frida_libpng/src/fuzzer.rs @@ -23,8 +23,8 @@ use libafl::{ observers::{HitcountsMapObserver, StdMapObserver, TimeObserver}, schedulers::{IndexesLenTimeMinimizerScheduler, QueueScheduler}, stages::{ShadowTracingStage, StdMutationalStage}, - state::{HasCorpus, HasMetadata, StdState}, - Error, + state::{HasCorpus, StdState}, + Error, HasMetadata, }; #[cfg(unix)] use libafl::{feedback_and_fast, feedbacks::ConstFeedback}; diff --git a/fuzzers/fuzzbench/src/lib.rs b/fuzzers/fuzzbench/src/lib.rs index b6cd2c869a..61ddc4a751 100644 --- a/fuzzers/fuzzbench/src/lib.rs +++ b/fuzzers/fuzzbench/src/lib.rs @@ -36,8 +36,8 @@ use libafl::{ calibrate::CalibrationStage, power::StdPowerMutationalStage, StdMutationalStage, TracingStage, }, - state::{HasCorpus, HasMetadata, StdState}, - Error, + state::{HasCorpus, StdState}, + Error, HasMetadata, }; use libafl_bolts::{ current_nanos, current_time, diff --git a/fuzzers/fuzzbench_ctx/src/lib.rs b/fuzzers/fuzzbench_ctx/src/lib.rs index 2d3e5be8ef..09df7caca6 100644 --- a/fuzzers/fuzzbench_ctx/src/lib.rs +++ b/fuzzers/fuzzbench_ctx/src/lib.rs @@ -39,8 +39,8 @@ use libafl::{ calibrate::CalibrationStage, power::StdPowerMutationalStage, StdMutationalStage, TracingStage, }, - state::{HasCorpus, HasMetadata, StdState}, - Error, + state::{HasCorpus, StdState}, + Error, HasMetadata, }; use libafl_bolts::{ current_nanos, current_time, diff --git a/fuzzers/fuzzbench_fork_qemu/src/fuzzer.rs b/fuzzers/fuzzbench_fork_qemu/src/fuzzer.rs index 5b3875ac7c..427a0d9a43 100644 --- a/fuzzers/fuzzbench_fork_qemu/src/fuzzer.rs +++ b/fuzzers/fuzzbench_fork_qemu/src/fuzzer.rs @@ -34,8 +34,8 @@ use libafl::{ calibrate::CalibrationStage, power::StdPowerMutationalStage, ShadowTracingStage, StdMutationalStage, }, - state::{HasCorpus, HasMetadata, StdState}, - Error, + state::{HasCorpus, StdState}, + Error, HasMetadata, }; use libafl_bolts::{ current_nanos, current_time, diff --git a/fuzzers/fuzzbench_forkserver/src/main.rs b/fuzzers/fuzzbench_forkserver/src/main.rs index 0e4157cc09..6c267c7486 100644 --- a/fuzzers/fuzzbench_forkserver/src/main.rs +++ b/fuzzers/fuzzbench_forkserver/src/main.rs @@ -29,8 +29,8 @@ use libafl::{ calibrate::CalibrationStage, power::StdPowerMutationalStage, StdMutationalStage, TracingStage, }, - state::{HasCorpus, HasMetadata, StdState}, - Error, + state::{HasCorpus, StdState}, + Error, HasMetadata, }; use libafl_bolts::{ current_nanos, current_time, diff --git a/fuzzers/fuzzbench_forkserver_cmplog/src/main.rs b/fuzzers/fuzzbench_forkserver_cmplog/src/main.rs index 9af24bb14a..15ed5d05fb 100644 --- a/fuzzers/fuzzbench_forkserver_cmplog/src/main.rs +++ b/fuzzers/fuzzbench_forkserver_cmplog/src/main.rs @@ -29,8 +29,8 @@ use libafl::{ calibrate::CalibrationStage, mutational::MultiMutationalStage, power::StdPowerMutationalStage, ColorizationStage, IfStage, }, - state::{HasCorpus, HasCurrentTestcase, HasMetadata, StdState}, - Error, + state::{HasCorpus, HasCurrentTestcase, StdState}, + Error, HasMetadata, }; use libafl_bolts::{ current_nanos, current_time, diff --git a/fuzzers/fuzzbench_qemu/src/fuzzer.rs b/fuzzers/fuzzbench_qemu/src/fuzzer.rs index 06f3a1bb39..b2be0c5b01 100644 --- a/fuzzers/fuzzbench_qemu/src/fuzzer.rs +++ b/fuzzers/fuzzbench_qemu/src/fuzzer.rs @@ -33,8 +33,8 @@ use libafl::{ calibrate::CalibrationStage, power::StdPowerMutationalStage, ShadowTracingStage, StdMutationalStage, }, - state::{HasCorpus, HasMetadata, StdState}, - Error, + state::{HasCorpus, StdState}, + Error, HasMetadata, }; use libafl_bolts::{ current_nanos, current_time, diff --git a/fuzzers/fuzzbench_text/src/lib.rs b/fuzzers/fuzzbench_text/src/lib.rs index 573ed1ff83..1967d53b46 100644 --- a/fuzzers/fuzzbench_text/src/lib.rs +++ b/fuzzers/fuzzbench_text/src/lib.rs @@ -42,8 +42,8 @@ use libafl::{ calibrate::CalibrationStage, power::StdPowerMutationalStage, GeneralizationStage, StdMutationalStage, TracingStage, }, - state::{HasCorpus, HasMetadata, StdState}, - Error, + state::{HasCorpus, StdState}, + Error, HasMetadata, }; use libafl_bolts::{ current_nanos, current_time, diff --git a/fuzzers/libafl_atheris/src/lib.rs b/fuzzers/libafl_atheris/src/lib.rs index 2645713e5d..c148040ddd 100644 --- a/fuzzers/libafl_atheris/src/lib.rs +++ b/fuzzers/libafl_atheris/src/lib.rs @@ -28,8 +28,8 @@ use libafl::{ observers::{HitcountsMapObserver, StdMapObserver, TimeObserver}, schedulers::{IndexesLenTimeMinimizerScheduler, QueueScheduler}, stages::{StdMutationalStage, TracingStage}, - state::{HasCorpus, HasMetadata, StdState}, - Error, + state::{HasCorpus, StdState}, + Error, HasMetadata, }; use libafl_bolts::{ core_affinity::Cores, diff --git a/fuzzers/libfuzzer_libmozjpeg/src/lib.rs b/fuzzers/libfuzzer_libmozjpeg/src/lib.rs index 458aab5cbd..c49cb9450d 100644 --- a/fuzzers/libfuzzer_libmozjpeg/src/lib.rs +++ b/fuzzers/libfuzzer_libmozjpeg/src/lib.rs @@ -22,8 +22,8 @@ use libafl::{ observers::StdMapObserver, schedulers::RandScheduler, stages::mutational::StdMutationalStage, - state::{HasCorpus, HasMetadata, StdState}, - Error, + state::{HasCorpus, StdState}, + Error, HasMetadata, }; use libafl_bolts::{ current_nanos, diff --git a/fuzzers/libfuzzer_libpng/src/lib.rs b/fuzzers/libfuzzer_libpng/src/lib.rs index e1e5cb00a6..8bb56ac48b 100644 --- a/fuzzers/libfuzzer_libpng/src/lib.rs +++ b/fuzzers/libfuzzer_libpng/src/lib.rs @@ -27,8 +27,8 @@ use libafl::{ powersched::PowerSchedule, IndexesLenTimeMinimizerScheduler, StdWeightedScheduler, }, stages::{calibrate::CalibrationStage, power::StdPowerMutationalStage}, - state::{HasCorpus, HasMetadata, StdState}, - Error, + state::{HasCorpus, StdState}, + Error, HasMetadata, }; use libafl_bolts::{ current_nanos, diff --git a/fuzzers/libfuzzer_libpng_accounting/src/lib.rs b/fuzzers/libfuzzer_libpng_accounting/src/lib.rs index 41cb95e07c..274c8e8ec5 100644 --- a/fuzzers/libfuzzer_libpng_accounting/src/lib.rs +++ b/fuzzers/libfuzzer_libpng_accounting/src/lib.rs @@ -26,8 +26,8 @@ use libafl::{ observers::{HitcountsMapObserver, StdMapObserver, TimeObserver}, schedulers::{CoverageAccountingScheduler, QueueScheduler}, stages::mutational::StdMutationalStage, - state::{HasCorpus, HasMetadata, StdState}, - Error, + state::{HasCorpus, StdState}, + Error, HasMetadata, }; use libafl_bolts::{ core_affinity::Cores, diff --git a/fuzzers/libfuzzer_libpng_aflpp_ui/src/lib.rs b/fuzzers/libfuzzer_libpng_aflpp_ui/src/lib.rs index a28d3ce6f2..75df797694 100644 --- a/fuzzers/libfuzzer_libpng_aflpp_ui/src/lib.rs +++ b/fuzzers/libfuzzer_libpng_aflpp_ui/src/lib.rs @@ -27,8 +27,8 @@ use libafl::{ powersched::PowerSchedule, IndexesLenTimeMinimizerScheduler, StdWeightedScheduler, }, stages::{calibrate::CalibrationStage, power::StdPowerMutationalStage, stats::AflStatsStage}, - state::{HasCorpus, HasMetadata, StdState}, - Error, + state::{HasCorpus, StdState}, + Error, HasMetadata, }; use libafl_bolts::{ current_nanos, diff --git a/fuzzers/libfuzzer_libpng_centralized/src/lib.rs b/fuzzers/libfuzzer_libpng_centralized/src/lib.rs index 0da15f16e4..e9ee97837b 100644 --- a/fuzzers/libfuzzer_libpng_centralized/src/lib.rs +++ b/fuzzers/libfuzzer_libpng_centralized/src/lib.rs @@ -26,8 +26,8 @@ use libafl::{ observers::{HitcountsMapObserver, TimeObserver}, schedulers::{IndexesLenTimeMinimizerScheduler, QueueScheduler}, stages::mutational::StdMutationalStage, - state::{HasCorpus, HasMetadata, StdState}, - Error, + state::{HasCorpus, StdState}, + Error, HasMetadata, }; use libafl_bolts::{ core_affinity::{CoreId, Cores}, diff --git a/fuzzers/libfuzzer_libpng_cmin/src/lib.rs b/fuzzers/libfuzzer_libpng_cmin/src/lib.rs index 59d9a449b9..2b2fb5d7ef 100644 --- a/fuzzers/libfuzzer_libpng_cmin/src/lib.rs +++ b/fuzzers/libfuzzer_libpng_cmin/src/lib.rs @@ -30,8 +30,8 @@ use libafl::{ powersched::PowerSchedule, IndexesLenTimeMinimizerScheduler, StdWeightedScheduler, }, stages::{calibrate::CalibrationStage, power::StdPowerMutationalStage}, - state::{HasCorpus, HasMetadata, StdState}, - Error, + state::{HasCorpus, StdState}, + Error, HasMetadata, }; use libafl_bolts::{ current_nanos, diff --git a/fuzzers/libfuzzer_libpng_launcher/src/lib.rs b/fuzzers/libfuzzer_libpng_launcher/src/lib.rs index 39fa57b2f3..5d6392a4d3 100644 --- a/fuzzers/libfuzzer_libpng_launcher/src/lib.rs +++ b/fuzzers/libfuzzer_libpng_launcher/src/lib.rs @@ -26,8 +26,8 @@ use libafl::{ observers::{HitcountsMapObserver, TimeObserver}, schedulers::{IndexesLenTimeMinimizerScheduler, QueueScheduler}, stages::mutational::StdMutationalStage, - state::{HasCorpus, HasMetadata, StdState}, - Error, + state::{HasCorpus, StdState}, + Error, HasMetadata, }; use libafl_bolts::{ core_affinity::Cores, diff --git a/fuzzers/libfuzzer_libpng_norestart/src/lib.rs b/fuzzers/libfuzzer_libpng_norestart/src/lib.rs index 354324b2f1..a3729914f8 100644 --- a/fuzzers/libfuzzer_libpng_norestart/src/lib.rs +++ b/fuzzers/libfuzzer_libpng_norestart/src/lib.rs @@ -29,8 +29,8 @@ use libafl::{ observers::{HitcountsMapObserver, TimeObserver}, schedulers::{IndexesLenTimeMinimizerScheduler, QueueScheduler}, stages::mutational::StdMutationalStage, - state::{HasCorpus, HasMetadata, StdState}, - Error, + state::{HasCorpus, StdState}, + Error, HasMetadata, }; use libafl_bolts::{ core_affinity::Cores, diff --git a/fuzzers/libfuzzer_libpng_tcp_manager/src/lib.rs b/fuzzers/libfuzzer_libpng_tcp_manager/src/lib.rs index 72ca166bd5..17eebbbd63 100644 --- a/fuzzers/libfuzzer_libpng_tcp_manager/src/lib.rs +++ b/fuzzers/libfuzzer_libpng_tcp_manager/src/lib.rs @@ -27,8 +27,8 @@ use libafl::{ powersched::PowerSchedule, IndexesLenTimeMinimizerScheduler, StdWeightedScheduler, }, stages::{calibrate::CalibrationStage, power::StdPowerMutationalStage}, - state::{HasCorpus, HasMetadata, StdState}, - Error, + state::{HasCorpus, StdState}, + Error, HasMetadata, }; use libafl_bolts::{ current_nanos, diff --git a/fuzzers/nautilus_sync/src/lib.rs b/fuzzers/nautilus_sync/src/lib.rs index e368cc1d9b..9e410f965a 100644 --- a/fuzzers/nautilus_sync/src/lib.rs +++ b/fuzzers/nautilus_sync/src/lib.rs @@ -23,8 +23,8 @@ use libafl::{ none_input_converter, schedulers::QueueScheduler, stages::{mutational::StdMutationalStage, sync::SyncFromBrokerStage}, - state::{HasMetadata, StdState}, - Error, + state::StdState, + Error, HasMetadata, }; use libafl_bolts::{ core_affinity::Cores, diff --git a/fuzzers/qemu_launcher/src/instance.rs b/fuzzers/qemu_launcher/src/instance.rs index a026e36827..2996fe7770 100644 --- a/fuzzers/qemu_launcher/src/instance.rs +++ b/fuzzers/qemu_launcher/src/instance.rs @@ -26,8 +26,8 @@ use libafl::{ calibrate::CalibrationStage, power::StdPowerMutationalStage, ShadowTracingStage, StagesTuple, StdMutationalStage, }, - state::{HasCorpus, HasMetadata, StdState, UsesState}, - Error, + state::{HasCorpus, StdState, UsesState}, + Error, HasMetadata, }; #[cfg(not(feature = "simplemgr"))] use libafl_bolts::shmem::StdShMemProvider; diff --git a/fuzzers/tutorial/src/metadata.rs b/fuzzers/tutorial/src/metadata.rs index 3123ddfe94..2d17ab7d53 100644 --- a/fuzzers/tutorial/src/metadata.rs +++ b/fuzzers/tutorial/src/metadata.rs @@ -5,8 +5,8 @@ use libafl::{ feedbacks::{Feedback, MapIndexesMetadata}, observers::ObserversTuple, schedulers::{MinimizerScheduler, TestcaseScore}, - state::{HasCorpus, HasMetadata, State}, - Error, + state::{HasCorpus, State}, + Error, HasMetadata, }; use libafl_bolts::{Named, SerdeAny}; use serde::{Deserialize, Serialize}; diff --git a/libafl/src/common/mod.rs b/libafl/src/common/mod.rs new file mode 100644 index 0000000000..53a85a35cf --- /dev/null +++ b/libafl/src/common/mod.rs @@ -0,0 +1,149 @@ +//! This module defines trait shared across different `LibAFL` modules + +use alloc::boxed::Box; +use core::any::type_name; + +use libafl_bolts::{ + serdeany::{NamedSerdeAnyMap, SerdeAny, SerdeAnyMap}, + Error, +}; +/// Trait for elements offering metadata +pub trait HasMetadata { + /// A map, storing all metadata + fn metadata_map(&self) -> &SerdeAnyMap; + /// A map, storing all metadata (mutable) + fn metadata_map_mut(&mut self) -> &mut SerdeAnyMap; + + /// Add a metadata to the metadata map + #[inline] + fn add_metadata(&mut self, meta: M) + where + M: SerdeAny, + { + self.metadata_map_mut().insert(meta); + } + + /// Gets metadata, or inserts it using the given construction function `default` + fn metadata_or_insert_with(&mut self, default: impl FnOnce() -> M) -> &mut M + where + M: SerdeAny, + { + self.metadata_map_mut().get_or_insert_with::(default) + } + + /// Remove a metadata from the metadata map + #[inline] + fn remove_metadata(&mut self) -> Option> + where + M: SerdeAny, + { + self.metadata_map_mut().remove::() + } + + /// Check for a metadata + /// + /// # Note + /// For performance reasons, you likely want to use [`Self::metadata_or_insert_with`] instead + #[inline] + fn has_metadata(&self) -> bool + where + M: SerdeAny, + { + self.metadata_map().get::().is_some() + } + + /// To get metadata + #[inline] + fn metadata(&self) -> Result<&M, Error> + where + M: SerdeAny, + { + self.metadata_map() + .get::() + .ok_or_else(|| Error::key_not_found(format!("{} not found", type_name::()))) + } + + /// To get mutable metadata + #[inline] + fn metadata_mut(&mut self) -> Result<&mut M, Error> + where + M: SerdeAny, + { + self.metadata_map_mut() + .get_mut::() + .ok_or_else(|| Error::key_not_found(format!("{} not found", type_name::()))) + } +} + +/// Trait for elements offering named metadata +pub trait HasNamedMetadata { + /// A map, storing all metadata + fn named_metadata_map(&self) -> &NamedSerdeAnyMap; + /// A map, storing all metadata (mutable) + fn named_metadata_map_mut(&mut self) -> &mut NamedSerdeAnyMap; + + /// Add a metadata to the metadata map + #[inline] + fn add_named_metadata(&mut self, name: &str, meta: M) + where + M: SerdeAny, + { + self.named_metadata_map_mut().insert(name, meta); + } + + /// Add a metadata to the metadata map + #[inline] + fn remove_named_metadata(&mut self, name: &str) -> Option> + where + M: SerdeAny, + { + self.named_metadata_map_mut().remove::(name) + } + + /// Gets metadata, or inserts it using the given construction function `default` + fn named_metadata_or_insert_with( + &mut self, + name: &str, + default: impl FnOnce() -> M, + ) -> &mut M + where + M: SerdeAny, + { + self.named_metadata_map_mut() + .get_or_insert_with::(name, default) + } + + /// Check for a metadata + /// + /// # Note + /// You likely want to use [`Self::named_metadata_or_insert_with`] for performance reasons. + #[inline] + fn has_named_metadata(&self, name: &str) -> bool + where + M: SerdeAny, + { + self.named_metadata_map().contains::(name) + } + + /// To get named metadata + #[inline] + fn named_metadata(&self, name: &str) -> Result<&M, Error> + where + M: SerdeAny, + { + self.named_metadata_map() + .get::(name) + .ok_or_else(|| Error::key_not_found(format!("{} not found", type_name::()))) + } + + /// To get mutable named metadata + #[inline] + fn named_metadata_mut(&mut self, name: &str) -> Result<&mut M, Error> + where + M: SerdeAny, + { + self.named_metadata_map_mut() + .get_mut::(name) + .ok_or_else(|| Error::key_not_found(format!("{} not found", type_name::()))) + } +} diff --git a/libafl/src/corpus/inmemory_ondisk.rs b/libafl/src/corpus/inmemory_ondisk.rs index 91e7ca0154..4209c94b62 100644 --- a/libafl/src/corpus/inmemory_ondisk.rs +++ b/libafl/src/corpus/inmemory_ondisk.rs @@ -24,8 +24,7 @@ use super::{ use crate::{ corpus::{Corpus, CorpusId, InMemoryCorpus, Testcase}, inputs::{Input, UsesInput}, - state::HasMetadata, - Error, + Error, HasMetadata, }; /// The [`Testcase`] metadata that'll be stored to disk diff --git a/libafl/src/corpus/minimizer.rs b/libafl/src/corpus/minimizer.rs index 8b4d602e57..e5991830cb 100644 --- a/libafl/src/corpus/minimizer.rs +++ b/libafl/src/corpus/minimizer.rs @@ -19,8 +19,8 @@ use crate::{ monitors::{AggregatorOps, UserStats, UserStatsValue}, observers::{MapObserver, ObserversTuple}, schedulers::{LenTimeMulTestcaseScore, RemovableScheduler, Scheduler, TestcaseScore}, - state::{HasCorpus, HasExecutions, HasMetadata, UsesState}, - Error, HasScheduler, + state::{HasCorpus, HasExecutions, UsesState}, + Error, HasMetadata, HasScheduler, }; /// `CorpusMinimizers` minimize corpora according to internal logic. See various implementations for diff --git a/libafl/src/corpus/testcase.rs b/libafl/src/corpus/testcase.rs index 7aa7723408..096f91c38e 100644 --- a/libafl/src/corpus/testcase.rs +++ b/libafl/src/corpus/testcase.rs @@ -16,8 +16,7 @@ use super::Corpus; use crate::{ corpus::CorpusId, inputs::{Input, UsesInput}, - state::HasMetadata, - Error, + Error, HasMetadata, }; /// Shorthand to receive a [`Ref`] or [`RefMut`] to a stored [`Testcase`], by [`CorpusId`]. diff --git a/libafl/src/events/centralized.rs b/libafl/src/events/centralized.rs index 22208064e3..eb4b55b297 100644 --- a/libafl/src/events/centralized.rs +++ b/libafl/src/events/centralized.rs @@ -38,8 +38,8 @@ use crate::{ fuzzer::{EvaluatorObservers, ExecutionProcessor}, inputs::{Input, UsesInput}, observers::ObserversTuple, - state::{HasExecutions, HasLastReportTime, HasMetadata, UsesState}, - Error, + state::{HasExecutions, HasLastReportTime, UsesState}, + Error, HasMetadata, }; const _LLMP_TAG_TO_MAIN: Tag = Tag(0x3453453); diff --git a/libafl/src/events/llmp.rs b/libafl/src/events/llmp.rs index de82425144..46fe070735 100644 --- a/libafl/src/events/llmp.rs +++ b/libafl/src/events/llmp.rs @@ -57,8 +57,8 @@ use crate::{ inputs::{Input, InputConverter, UsesInput}, monitors::Monitor, observers::ObserversTuple, - state::{HasExecutions, HasLastReportTime, HasMetadata, State, UsesState}, - Error, + state::{HasExecutions, HasLastReportTime, State, UsesState}, + Error, HasMetadata, }; /// Forward this to the client diff --git a/libafl/src/events/mod.rs b/libafl/src/events/mod.rs index d91223b44f..79e5064ea2 100644 --- a/libafl/src/events/mod.rs +++ b/libafl/src/events/mod.rs @@ -46,8 +46,8 @@ use crate::{ inputs::Input, monitors::UserStats, observers::ObserversTuple, - state::{HasExecutions, HasLastReportTime, HasMetadata, State}, - Error, + state::{HasExecutions, HasLastReportTime, State}, + Error, HasMetadata, }; #[cfg(feature = "scalability_introspection")] use crate::{ diff --git a/libafl/src/events/simple.rs b/libafl/src/events/simple.rs index 52fd880afd..2eae589ff6 100644 --- a/libafl/src/events/simple.rs +++ b/libafl/src/events/simple.rs @@ -32,8 +32,8 @@ use crate::{ }, inputs::UsesInput, monitors::Monitor, - state::{HasExecutions, HasLastReportTime, HasMetadata, State, UsesState}, - Error, + state::{HasExecutions, HasLastReportTime, State, UsesState}, + Error, HasMetadata, }; #[cfg(feature = "std")] use crate::{ diff --git a/libafl/src/events/tcp.rs b/libafl/src/events/tcp.rs index 4f647f24f9..3e699597bf 100644 --- a/libafl/src/events/tcp.rs +++ b/libafl/src/events/tcp.rs @@ -48,8 +48,8 @@ use crate::{ fuzzer::{EvaluatorObservers, ExecutionProcessor}, inputs::{Input, UsesInput}, monitors::Monitor, - state::{HasExecutions, HasLastReportTime, HasMetadata, State, UsesState}, - Error, + state::{HasExecutions, HasLastReportTime, State, UsesState}, + Error, HasMetadata, }; /// Tries to create (synchronously) a [`TcpListener`] that is `nonblocking` (for later use in tokio). diff --git a/libafl/src/executors/inprocess/mod.rs b/libafl/src/executors/inprocess/mod.rs index 66d9a197be..aa409c0189 100644 --- a/libafl/src/executors/inprocess/mod.rs +++ b/libafl/src/executors/inprocess/mod.rs @@ -32,8 +32,8 @@ use crate::{ fuzzer::HasObjective, inputs::UsesInput, observers::{ObserversTuple, UsesObservers}, - state::{HasCorpus, HasExecutions, HasMetadata, HasSolutions, State, UsesState}, - Error, + state::{HasCorpus, HasExecutions, HasSolutions, State, UsesState}, + Error, HasMetadata, }; /// The inner structure of `InProcessExecutor`. diff --git a/libafl/src/feedbacks/concolic.rs b/libafl/src/feedbacks/concolic.rs index a768b4c61e..061b74c3d9 100644 --- a/libafl/src/feedbacks/concolic.rs +++ b/libafl/src/feedbacks/concolic.rs @@ -15,8 +15,8 @@ use crate::{ feedbacks::Feedback, inputs::UsesInput, observers::{concolic::ConcolicObserver, ObserversTuple}, - state::{HasMetadata, State}, - Error, + state::State, + Error, HasMetadata, }; /// The concolic feedback. It is used to attach concolic tracing metadata to the testcase. diff --git a/libafl/src/feedbacks/differential.rs b/libafl/src/feedbacks/differential.rs index 7e11638b3f..b375abd391 100644 --- a/libafl/src/feedbacks/differential.rs +++ b/libafl/src/feedbacks/differential.rs @@ -16,8 +16,8 @@ use crate::{ feedbacks::Feedback, inputs::Input, observers::{Observer, ObserversTuple}, - state::{HasMetadata, State}, - Error, + state::State, + Error, HasMetadata, }; /// The result of a differential test between two observers. diff --git a/libafl/src/feedbacks/list.rs b/libafl/src/feedbacks/list.rs index 8cacc507ba..ab9071be78 100644 --- a/libafl/src/feedbacks/list.rs +++ b/libafl/src/feedbacks/list.rs @@ -10,7 +10,8 @@ use crate::{ executors::ExitKind, feedbacks::Feedback, observers::{ListObserver, ObserversTuple}, - state::{HasNamedMetadata, State}, + state::State, + HasNamedMetadata, }; /// The metadata to remember past observed value diff --git a/libafl/src/feedbacks/map.rs b/libafl/src/feedbacks/map.rs index 69e777d8f8..322fecdfa5 100644 --- a/libafl/src/feedbacks/map.rs +++ b/libafl/src/feedbacks/map.rs @@ -24,8 +24,8 @@ use crate::{ inputs::UsesInput, monitors::{AggregatorOps, UserStats, UserStatsValue}, observers::{MapObserver, Observer, ObserversTuple, UsesObserver}, - state::{HasMetadata, HasNamedMetadata, State}, - Error, + state::State, + Error, HasMetadata, HasNamedMetadata, }; /// A [`MapFeedback`] that implements the AFL algorithm using an [`OrReducer`] combining the bits for the history map and the bit from ``HitcountsMapObserver``. diff --git a/libafl/src/feedbacks/nautilus.rs b/libafl/src/feedbacks/nautilus.rs index bdb919ee22..f06db45cd3 100644 --- a/libafl/src/feedbacks/nautilus.rs +++ b/libafl/src/feedbacks/nautilus.rs @@ -15,8 +15,8 @@ use crate::{ generators::NautilusContext, inputs::NautilusInput, observers::ObserversTuple, - state::{HasCorpus, HasMetadata, State}, - Error, + state::{HasCorpus, State}, + Error, HasMetadata, }; /// Metadata for Nautilus grammar mutator chunks diff --git a/libafl/src/feedbacks/new_hash_feedback.rs b/libafl/src/feedbacks/new_hash_feedback.rs index 1bd9f7ca58..c99c4e79e9 100644 --- a/libafl/src/feedbacks/new_hash_feedback.rs +++ b/libafl/src/feedbacks/new_hash_feedback.rs @@ -13,8 +13,8 @@ use crate::{ feedbacks::{Feedback, HasObserverName}, inputs::UsesInput, observers::{ObserverWithHashField, ObserversTuple}, - state::{HasNamedMetadata, State}, - Error, + state::State, + Error, HasNamedMetadata, }; /// The prefix of the metadata names diff --git a/libafl/src/feedbacks/transferred.rs b/libafl/src/feedbacks/transferred.rs index 86f8cd06e3..e0c4090da2 100644 --- a/libafl/src/feedbacks/transferred.rs +++ b/libafl/src/feedbacks/transferred.rs @@ -5,11 +5,8 @@ use libafl_bolts::{impl_serdeany, Error, Named}; use serde::{Deserialize, Serialize}; use crate::{ - events::EventFirer, - executors::ExitKind, - feedbacks::Feedback, - observers::ObserversTuple, - state::{HasMetadata, State}, + events::EventFirer, executors::ExitKind, feedbacks::Feedback, observers::ObserversTuple, + state::State, HasMetadata, }; /// Constant name of the [`TransferringMetadata`]. diff --git a/libafl/src/fuzzer/mod.rs b/libafl/src/fuzzer/mod.rs index 2a9ab3c086..d91f3c4a3c 100644 --- a/libafl/src/fuzzer/mod.rs +++ b/libafl/src/fuzzer/mod.rs @@ -17,11 +17,8 @@ use crate::{ schedulers::Scheduler, stages::{HasCurrentStage, StagesTuple}, start_timer, - state::{ - HasCorpus, HasExecutions, HasImported, HasLastReportTime, HasMetadata, HasSolutions, - UsesState, - }, - Error, + state::{HasCorpus, HasExecutions, HasImported, HasLastReportTime, HasSolutions, UsesState}, + Error, HasMetadata, }; #[cfg(feature = "introspection")] use crate::{monitors::PerfFeature, state::HasClientPerfMonitor}; @@ -762,8 +759,8 @@ pub mod test { corpus::CorpusId, events::ProgressReporter, stages::{HasCurrentStage, StagesTuple}, - state::{HasExecutions, HasLastReportTime, HasMetadata, State, UsesState}, - Fuzzer, + state::{HasExecutions, HasLastReportTime, State, UsesState}, + Fuzzer, HasMetadata, }; #[derive(Clone, Debug)] diff --git a/libafl/src/inputs/generalized.rs b/libafl/src/inputs/generalized.rs index 2252838168..48c7e09b45 100644 --- a/libafl/src/inputs/generalized.rs +++ b/libafl/src/inputs/generalized.rs @@ -9,8 +9,8 @@ use crate::{ corpus::Testcase, inputs::BytesInput, stages::mutational::{MutatedTransform, MutatedTransformPost}, - state::{HasCorpus, HasMetadata}, - Error, + state::HasCorpus, + Error, HasMetadata, }; /// An item of the generalized input diff --git a/libafl/src/lib.rs b/libafl/src/lib.rs index 019acd0594..9ad2d543fa 100644 --- a/libafl/src/lib.rs +++ b/libafl/src/lib.rs @@ -98,6 +98,8 @@ pub mod bolts {} #[doc(hidden)] pub use libafl_derive::*; +pub mod common; +pub use common::*; pub mod corpus; pub mod events; pub mod executors; diff --git a/libafl/src/mutators/gramatron.rs b/libafl/src/mutators/gramatron.rs index 6deee6f93b..af0dacffa6 100644 --- a/libafl/src/mutators/gramatron.rs +++ b/libafl/src/mutators/gramatron.rs @@ -13,8 +13,8 @@ use crate::{ inputs::{GramatronInput, Terminal}, mutators::{MutationResult, Mutator}, random_corpus_id, - state::{HasCorpus, HasMetadata, HasRand}, - Error, + state::{HasCorpus, HasRand}, + Error, HasMetadata, }; const RECUR_THRESHOLD: u64 = 5; diff --git a/libafl/src/mutators/grimoire.rs b/libafl/src/mutators/grimoire.rs index 49dba54a5c..eb45693bb4 100644 --- a/libafl/src/mutators/grimoire.rs +++ b/libafl/src/mutators/grimoire.rs @@ -11,8 +11,8 @@ use crate::{ inputs::{GeneralizedInputMetadata, GeneralizedItem}, mutators::{token_mutations::Tokens, MutationResult, Mutator}, random_corpus_id, - state::{HasCorpus, HasMetadata, HasRand}, - Error, + state::{HasCorpus, HasRand}, + Error, HasMetadata, }; const RECURSIVE_REPLACEMENT_DEPTH: [usize; 6] = [2, 4, 8, 16, 32, 64]; diff --git a/libafl/src/mutators/mopt_mutator.rs b/libafl/src/mutators/mopt_mutator.rs index 143aaed82b..762c971a4c 100644 --- a/libafl/src/mutators/mopt_mutator.rs +++ b/libafl/src/mutators/mopt_mutator.rs @@ -18,8 +18,8 @@ use super::MutationId; use crate::{ corpus::{Corpus, CorpusId}, mutators::{ComposedByMutations, MutationResult, Mutator, MutatorsTuple, ScheduledMutator}, - state::{HasCorpus, HasMetadata, HasRand, HasSolutions}, - Error, + state::{HasCorpus, HasRand, HasSolutions}, + Error, HasMetadata, }; /// A Struct for managing MOpt-mutator parameters. diff --git a/libafl/src/mutators/mutations.rs b/libafl/src/mutators/mutations.rs index c0d57f5e21..eeb6b9af7b 100644 --- a/libafl/src/mutators/mutations.rs +++ b/libafl/src/mutators/mutations.rs @@ -1306,11 +1306,8 @@ mod tests { use super::*; use crate::{ - corpus::InMemoryCorpus, - feedbacks::ConstFeedback, - inputs::BytesInput, - mutators::MutatorsTuple, - state::{HasMetadata, StdState}, + corpus::InMemoryCorpus, feedbacks::ConstFeedback, inputs::BytesInput, + mutators::MutatorsTuple, state::StdState, HasMetadata, }; type TestMutatorsTupleType = tuple_list_type!( diff --git a/libafl/src/mutators/nautilus.rs b/libafl/src/mutators/nautilus.rs index 7637dec32b..88d808c915 100644 --- a/libafl/src/mutators/nautilus.rs +++ b/libafl/src/mutators/nautilus.rs @@ -14,8 +14,8 @@ use crate::{ generators::nautilus::NautilusContext, inputs::nautilus::NautilusInput, mutators::{MutationResult, Mutator}, - state::{HasCorpus, HasMetadata}, - Error, + state::HasCorpus, + Error, HasMetadata, }; /// The randomic mutator for `Nautilus` grammar. diff --git a/libafl/src/mutators/scheduled.rs b/libafl/src/mutators/scheduled.rs index f6230a3e3c..49b3b2be83 100644 --- a/libafl/src/mutators/scheduled.rs +++ b/libafl/src/mutators/scheduled.rs @@ -28,8 +28,8 @@ use crate::{ token_mutations::{TokenInsert, TokenReplace}, MutationResult, Mutator, MutatorsTuple, }, - state::{HasCorpus, HasMetadata, HasRand}, - Error, + state::{HasCorpus, HasRand}, + Error, HasMetadata, }; /// The metadata placed in a [`crate::corpus::Testcase`] by a [`LoggerScheduledMutator`]. diff --git a/libafl/src/mutators/string.rs b/libafl/src/mutators/string.rs index 9217737663..144a12e243 100644 --- a/libafl/src/mutators/string.rs +++ b/libafl/src/mutators/string.rs @@ -16,7 +16,8 @@ use crate::{ mutational::{MutatedTransform, MutatedTransformPost}, StringIdentificationMetadata, }, - state::{HasCorpus, HasMaxSize, HasMetadata, HasRand}, + state::{HasCorpus, HasMaxSize, HasRand}, + HasMetadata, }; /// Unicode category data, as used by string analysis and mutators. diff --git a/libafl/src/mutators/token_mutations.rs b/libafl/src/mutators/token_mutations.rs index 270f581ca4..22819942bf 100644 --- a/libafl/src/mutators/token_mutations.rs +++ b/libafl/src/mutators/token_mutations.rs @@ -30,8 +30,8 @@ use crate::{ }, observers::cmp::{AFLppCmpValuesMetadata, CmpValues, CmpValuesMetadata}, stages::TaintMetadata, - state::{HasCorpus, HasMaxSize, HasMetadata, HasRand}, - Error, + state::{HasCorpus, HasMaxSize, HasRand}, + Error, HasMetadata, }; /// A state metadata holding a list of tokens diff --git a/libafl/src/mutators/tuneable.rs b/libafl/src/mutators/tuneable.rs index d5c02dc486..9b950b4267 100644 --- a/libafl/src/mutators/tuneable.rs +++ b/libafl/src/mutators/tuneable.rs @@ -18,8 +18,8 @@ use crate::{ mutators::{ ComposedByMutations, MutationId, MutationResult, Mutator, MutatorsTuple, ScheduledMutator, }, - state::{HasMetadata, HasRand}, - Error, + state::HasRand, + Error, HasMetadata, }; /// Metadata in the state, that controls the behavior of the [`TuneableScheduledMutator`] at runtime diff --git a/libafl/src/observers/cmp.rs b/libafl/src/observers/cmp.rs index 8dba86b29f..7483af0582 100644 --- a/libafl/src/observers/cmp.rs +++ b/libafl/src/observers/cmp.rs @@ -11,9 +11,7 @@ use hashbrown::HashMap; use libafl_bolts::{ownedref::OwnedRefMut, serdeany::SerdeAny, AsMutSlice, AsSlice, Named}; use serde::{de::DeserializeOwned, Deserialize, Serialize}; -use crate::{ - executors::ExitKind, inputs::UsesInput, observers::Observer, state::HasMetadata, Error, -}; +use crate::{executors::ExitKind, inputs::UsesInput, observers::Observer, Error, HasMetadata}; /// Generic metadata trait for use in a `CmpObserver`, which adds comparisons from a `CmpObserver` /// primarily intended for use with `AFLppCmpValuesMetadata` or `CmpValuesMetadata` diff --git a/libafl/src/schedulers/accounting.rs b/libafl/src/schedulers/accounting.rs index e6778cbce0..a3d7d05ec1 100644 --- a/libafl/src/schedulers/accounting.rs +++ b/libafl/src/schedulers/accounting.rs @@ -16,8 +16,8 @@ use crate::{ minimizer::{IsFavoredMetadata, MinimizerScheduler, DEFAULT_SKIP_NON_FAVORED_PROB}, LenTimeMulTestcaseScore, Scheduler, }, - state::{HasCorpus, HasMetadata, HasRand, UsesState}, - Error, + state::{HasCorpus, HasRand, UsesState}, + Error, HasMetadata, }; /// A testcase metadata holding a list of indexes of a map diff --git a/libafl/src/schedulers/minimizer.rs b/libafl/src/schedulers/minimizer.rs index 62d249b6d9..c19959134f 100644 --- a/libafl/src/schedulers/minimizer.rs +++ b/libafl/src/schedulers/minimizer.rs @@ -14,8 +14,8 @@ use crate::{ inputs::UsesInput, observers::ObserversTuple, schedulers::{LenTimeMulTestcaseScore, RemovableScheduler, Scheduler, TestcaseScore}, - state::{HasCorpus, HasMetadata, HasRand, UsesState}, - Error, + state::{HasCorpus, HasRand, UsesState}, + Error, HasMetadata, }; /// Default probability to skip the non-favored values diff --git a/libafl/src/schedulers/mod.rs b/libafl/src/schedulers/mod.rs index 192077cd4e..f346e18903 100644 --- a/libafl/src/schedulers/mod.rs +++ b/libafl/src/schedulers/mod.rs @@ -35,8 +35,8 @@ use crate::{ inputs::UsesInput, observers::{MapObserver, ObserversTuple}, random_corpus_id, - state::{HasCorpus, HasMetadata, HasRand, State, UsesState}, - Error, + state::{HasCorpus, HasRand, State, UsesState}, + Error, HasMetadata, }; /// The scheduler also implements `on_remove` and `on_replace` if it implements this stage. diff --git a/libafl/src/schedulers/powersched.rs b/libafl/src/schedulers/powersched.rs index da5142a741..1d08a0a771 100644 --- a/libafl/src/schedulers/powersched.rs +++ b/libafl/src/schedulers/powersched.rs @@ -13,8 +13,8 @@ use crate::{ inputs::UsesInput, observers::{MapObserver, ObserversTuple}, schedulers::{HasAFLSchedulerMetadata, RemovableScheduler, Scheduler}, - state::{HasCorpus, HasMetadata, State, UsesState}, - Error, + state::{HasCorpus, State, UsesState}, + Error, HasMetadata, }; /// The n fuzz size diff --git a/libafl/src/schedulers/probabilistic_sampling.rs b/libafl/src/schedulers/probabilistic_sampling.rs index 11764f604e..421f9e1ad2 100644 --- a/libafl/src/schedulers/probabilistic_sampling.rs +++ b/libafl/src/schedulers/probabilistic_sampling.rs @@ -12,8 +12,8 @@ use crate::{ corpus::{Corpus, CorpusId, HasTestcase, Testcase}, inputs::UsesInput, schedulers::{RemovableScheduler, Scheduler, TestcaseScore}, - state::{HasCorpus, HasMetadata, HasRand, State, UsesState}, - Error, + state::{HasCorpus, HasRand, State, UsesState}, + Error, HasMetadata, }; /// Conduct reservoir sampling (probabilistic sampling) over all corpus elements. @@ -202,8 +202,8 @@ mod tests { feedbacks::ConstFeedback, inputs::{bytes::BytesInput, Input, UsesInput}, schedulers::{ProbabilitySamplingScheduler, Scheduler, TestcaseScore}, - state::{HasCorpus, HasMetadata, StdState}, - Error, + state::{HasCorpus, StdState}, + Error, HasMetadata, }; const FACTOR: f64 = 1337.0; diff --git a/libafl/src/schedulers/testcase_score.rs b/libafl/src/schedulers/testcase_score.rs index 17dc86feaa..0acfc4508e 100644 --- a/libafl/src/schedulers/testcase_score.rs +++ b/libafl/src/schedulers/testcase_score.rs @@ -11,8 +11,8 @@ use crate::{ minimizer::{IsFavoredMetadata, TopRatedsMetadata}, powersched::{PowerSchedule, SchedulerMetadata}, }, - state::{HasCorpus, HasMetadata}, - Error, + state::HasCorpus, + Error, HasMetadata, }; /// Compute the favor factor of a [`Testcase`]. Higher is better. diff --git a/libafl/src/schedulers/tuneable.rs b/libafl/src/schedulers/tuneable.rs index 7a2df0fc7b..de4fb44332 100644 --- a/libafl/src/schedulers/tuneable.rs +++ b/libafl/src/schedulers/tuneable.rs @@ -12,8 +12,8 @@ use super::RemovableScheduler; use crate::{ corpus::{Corpus, CorpusId, HasTestcase}, schedulers::Scheduler, - state::{HasCorpus, HasMetadata, State, UsesState}, - Error, + state::{HasCorpus, State, UsesState}, + Error, HasMetadata, }; #[derive(Default, Clone, Copy, Eq, PartialEq, Debug, Serialize, Deserialize)] diff --git a/libafl/src/schedulers/weighted.rs b/libafl/src/schedulers/weighted.rs index 9c4227894a..f0da18540e 100644 --- a/libafl/src/schedulers/weighted.rs +++ b/libafl/src/schedulers/weighted.rs @@ -18,8 +18,8 @@ use crate::{ testcase_score::{CorpusWeightTestcaseScore, TestcaseScore}, HasAFLSchedulerMetadata, RemovableScheduler, Scheduler, }, - state::{HasCorpus, HasMetadata, HasRand, State, UsesState}, - Error, + state::{HasCorpus, HasRand, State, UsesState}, + Error, HasMetadata, }; /// The Metadata for `WeightedScheduler` diff --git a/libafl/src/stages/calibrate.rs b/libafl/src/stages/calibrate.rs index b43e5b6de5..e6222a8f17 100644 --- a/libafl/src/stages/calibrate.rs +++ b/libafl/src/stages/calibrate.rs @@ -21,11 +21,8 @@ use crate::{ observers::{MapObserver, ObserversTuple, UsesObserver}, schedulers::powersched::SchedulerMetadata, stages::{ExecutionCountRestartHelper, Stage}, - state::{ - HasCorpus, HasCurrentTestcase, HasExecutions, HasMetadata, HasNamedMetadata, State, - UsesState, - }, - Error, + state::{HasCorpus, HasCurrentTestcase, HasExecutions, State, UsesState}, + Error, HasMetadata, HasNamedMetadata, }; /// The metadata to keep unstable entries diff --git a/libafl/src/stages/colorization.rs b/libafl/src/stages/colorization.rs index f1015893c6..8df70ff726 100644 --- a/libafl/src/stages/colorization.rs +++ b/libafl/src/stages/colorization.rs @@ -16,8 +16,8 @@ use crate::{ mutators::mutations::buffer_copy, observers::{MapObserver, ObserversTuple}, stages::{RetryRestartHelper, Stage}, - state::{HasCorpus, HasCurrentTestcase, HasMetadata, HasNamedMetadata, HasRand, UsesState}, - Error, + state::{HasCorpus, HasCurrentTestcase, HasRand, UsesState}, + Error, HasMetadata, HasNamedMetadata, }; // Bigger range is better diff --git a/libafl/src/stages/concolic.rs b/libafl/src/stages/concolic.rs index 153b90071a..0becb32efb 100644 --- a/libafl/src/stages/concolic.rs +++ b/libafl/src/stages/concolic.rs @@ -18,10 +18,8 @@ use crate::{ executors::{Executor, HasObservers}, observers::concolic::ConcolicObserver, stages::{RetryRestartHelper, Stage, TracingStage}, - state::{ - HasCorpus, HasCurrentTestcase, HasExecutions, HasMetadata, HasNamedMetadata, UsesState, - }, - Error, + state::{HasCorpus, HasCurrentTestcase, HasExecutions, UsesState}, + Error, HasMetadata, HasNamedMetadata, }; #[cfg(feature = "concolic_mutation")] use crate::{ diff --git a/libafl/src/stages/dump.rs b/libafl/src/stages/dump.rs index 61a8f80d8d..be1bd9cfc1 100644 --- a/libafl/src/stages/dump.rs +++ b/libafl/src/stages/dump.rs @@ -11,8 +11,8 @@ use crate::{ corpus::{Corpus, CorpusId}, inputs::UsesInput, stages::Stage, - state::{HasCorpus, HasMetadata, HasRand, HasSolutions, UsesState}, - Error, + state::{HasCorpus, HasRand, HasSolutions, UsesState}, + Error, HasMetadata, }; /// Metadata used to store information about disk dump indexes for names diff --git a/libafl/src/stages/generalization.rs b/libafl/src/stages/generalization.rs index adb5cfb5ee..180891baca 100644 --- a/libafl/src/stages/generalization.rs +++ b/libafl/src/stages/generalization.rs @@ -17,8 +17,8 @@ use crate::{ observers::{MapObserver, ObserversTuple}, stages::{RetryRestartHelper, Stage}, start_timer, - state::{HasCorpus, HasExecutions, HasMetadata, HasNamedMetadata, UsesState}, - Error, + state::{HasCorpus, HasExecutions, UsesState}, + Error, HasMetadata, HasNamedMetadata, }; #[cfg(feature = "introspection")] use crate::{monitors::PerfFeature, state::HasClientPerfMonitor}; diff --git a/libafl/src/stages/mod.rs b/libafl/src/stages/mod.rs index f37691da93..8e3f90e986 100644 --- a/libafl/src/stages/mod.rs +++ b/libafl/src/stages/mod.rs @@ -46,11 +46,9 @@ use crate::{ observers::ObserversTuple, schedulers::Scheduler, stages::push::PushStage, - state::{ - HasCorpus, HasExecutions, HasLastReportTime, HasMetadata, HasNamedMetadata, HasRand, State, - UsesState, - }, - Error, EvaluatorObservers, ExecutesInput, ExecutionProcessor, HasScheduler, + state::{HasCorpus, HasExecutions, HasLastReportTime, HasRand, State, UsesState}, + Error, EvaluatorObservers, ExecutesInput, ExecutionProcessor, HasMetadata, HasNamedMetadata, + HasScheduler, }; /// Mutational stage is the normal fuzzing stage. @@ -655,7 +653,8 @@ pub mod test { corpus::{Corpus, HasCurrentCorpusIdx, Testcase}, inputs::NopInput, stages::{RetryRestartHelper, Stage}, - state::{test::test_std_state, HasCorpus, HasMetadata, State, UsesState}, + state::{test::test_std_state, HasCorpus, State, UsesState}, + HasMetadata, }; #[derive(Debug)] diff --git a/libafl/src/stages/mutational.rs b/libafl/src/stages/mutational.rs index eb7e5dd9e8..834f432ec9 100644 --- a/libafl/src/stages/mutational.rs +++ b/libafl/src/stages/mutational.rs @@ -13,11 +13,8 @@ use crate::{ mutators::{MultiMutator, MutationResult, Mutator}, stages::{ExecutionCountRestartHelper, RetryRestartHelper, Stage}, start_timer, - state::{ - HasCorpus, HasCurrentTestcase, HasExecutions, HasMetadata, HasNamedMetadata, HasRand, - UsesState, - }, - Error, + state::{HasCorpus, HasCurrentTestcase, HasExecutions, HasRand, UsesState}, + Error, HasMetadata, HasNamedMetadata, }; #[cfg(feature = "introspection")] use crate::{monitors::PerfFeature, state::HasClientPerfMonitor}; diff --git a/libafl/src/stages/power.rs b/libafl/src/stages/power.rs index c81177e629..55d1c63da0 100644 --- a/libafl/src/stages/power.rs +++ b/libafl/src/stages/power.rs @@ -8,8 +8,8 @@ use crate::{ mutators::Mutator, schedulers::{testcase_score::CorpusPowerTestcaseScore, TestcaseScore}, stages::{mutational::MutatedTransform, ExecutionCountRestartHelper, MutationalStage, Stage}, - state::{HasCorpus, HasCurrentTestcase, HasExecutions, HasMetadata, HasRand, UsesState}, - Error, + state::{HasCorpus, HasCurrentTestcase, HasExecutions, HasRand, UsesState}, + Error, HasMetadata, }; /// The mutational stage using power schedules diff --git a/libafl/src/stages/push/mod.rs b/libafl/src/stages/push/mod.rs index 61884c729a..239363e011 100644 --- a/libafl/src/stages/push/mod.rs +++ b/libafl/src/stages/push/mod.rs @@ -22,8 +22,8 @@ use crate::{ inputs::UsesInput, observers::ObserversTuple, schedulers::Scheduler, - state::{HasCorpus, HasExecutions, HasLastReportTime, HasMetadata, HasRand}, - Error, EvaluatorObservers, ExecutionProcessor, HasScheduler, + state::{HasCorpus, HasExecutions, HasLastReportTime, HasRand}, + Error, EvaluatorObservers, ExecutionProcessor, HasMetadata, HasScheduler, }; /// Send a monitor update all 15 (or more) seconds diff --git a/libafl/src/stages/push/mutational.rs b/libafl/src/stages/push/mutational.rs index 47ff29453a..e91239fbd0 100644 --- a/libafl/src/stages/push/mutational.rs +++ b/libafl/src/stages/push/mutational.rs @@ -20,8 +20,8 @@ use crate::{ observers::ObserversTuple, schedulers::Scheduler, start_timer, - state::{HasCorpus, HasExecutions, HasLastReportTime, HasMetadata, HasRand}, - Error, EvaluatorObservers, ExecutionProcessor, HasScheduler, + state::{HasCorpus, HasExecutions, HasLastReportTime, HasRand}, + Error, EvaluatorObservers, ExecutionProcessor, HasMetadata, HasScheduler, }; #[cfg(feature = "introspection")] use crate::{monitors::PerfFeature, state::HasClientPerfMonitor}; diff --git a/libafl/src/stages/stats.rs b/libafl/src/stages/stats.rs index 5959740f4d..27266abb69 100644 --- a/libafl/src/stages/stats.rs +++ b/libafl/src/stages/stats.rs @@ -13,8 +13,8 @@ use crate::{ events::EventFirer, schedulers::minimizer::IsFavoredMetadata, stages::Stage, - state::{HasCorpus, HasImported, HasMetadata, UsesState}, - Error, + state::{HasCorpus, HasImported, UsesState}, + Error, HasMetadata, }; #[cfg(feature = "std")] use crate::{ diff --git a/libafl/src/stages/string.rs b/libafl/src/stages/string.rs index e9c9841375..e2e75f30fe 100644 --- a/libafl/src/stages/string.rs +++ b/libafl/src/stages/string.rs @@ -11,7 +11,8 @@ use crate::{ corpus::HasTestcase, inputs::{BytesInput, HasBytesVec}, stages::Stage, - state::{HasCorpus, HasCurrentTestcase, HasMetadata, State, UsesState}, + state::{HasCorpus, HasCurrentTestcase, State, UsesState}, + HasMetadata, }; /// Metadata which stores the list of pre-computed string-like ranges in the input diff --git a/libafl/src/stages/sync.rs b/libafl/src/stages/sync.rs index f3c9b349a0..f8c8228bc5 100644 --- a/libafl/src/stages/sync.rs +++ b/libafl/src/stages/sync.rs @@ -19,8 +19,8 @@ use crate::{ fuzzer::{Evaluator, EvaluatorObservers, ExecutionProcessor}, inputs::{Input, InputConverter, UsesInput}, stages::{RetryRestartHelper, Stage}, - state::{HasCorpus, HasExecutions, HasMetadata, HasNamedMetadata, HasRand, State, UsesState}, - Error, + state::{HasCorpus, HasExecutions, HasRand, State, UsesState}, + Error, HasMetadata, HasNamedMetadata, }; /// Metadata used to store information about disk sync time diff --git a/libafl/src/stages/tmin.rs b/libafl/src/stages/tmin.rs index a4235cdc78..9fe63fdb86 100644 --- a/libafl/src/stages/tmin.rs +++ b/libafl/src/stages/tmin.rs @@ -22,10 +22,9 @@ use crate::{ }, start_timer, state::{ - HasCorpus, HasCurrentTestcase, HasExecutions, HasMaxSize, HasMetadata, HasSolutions, State, - UsesState, + HasCorpus, HasCurrentTestcase, HasExecutions, HasMaxSize, HasSolutions, State, UsesState, }, - Error, ExecutesInput, ExecutionProcessor, HasFeedback, HasScheduler, + Error, ExecutesInput, ExecutionProcessor, HasFeedback, HasMetadata, HasScheduler, }; #[cfg(feature = "introspection")] use crate::{monitors::PerfFeature, state::HasClientPerfMonitor}; diff --git a/libafl/src/stages/tracing.rs b/libafl/src/stages/tracing.rs index 65ae6b668e..f00b8c43ec 100644 --- a/libafl/src/stages/tracing.rs +++ b/libafl/src/stages/tracing.rs @@ -10,8 +10,8 @@ use crate::{ observers::ObserversTuple, stages::{RetryRestartHelper, Stage}, start_timer, - state::{HasCorpus, HasCurrentTestcase, HasExecutions, HasNamedMetadata, State, UsesState}, - Error, + state::{HasCorpus, HasCurrentTestcase, HasExecutions, State, UsesState}, + Error, HasNamedMetadata, }; #[cfg(feature = "introspection")] use crate::{monitors::PerfFeature, state::HasClientPerfMonitor}; diff --git a/libafl/src/stages/tuneable.rs b/libafl/src/stages/tuneable.rs index c3fc25856b..b55808ed0d 100644 --- a/libafl/src/stages/tuneable.rs +++ b/libafl/src/stages/tuneable.rs @@ -14,11 +14,8 @@ use crate::{ ExecutionCountRestartHelper, MutationalStage, Stage, }, start_timer, - state::{ - HasCorpus, HasCurrentTestcase, HasExecutions, HasMetadata, HasNamedMetadata, HasRand, - UsesState, - }, - Error, Evaluator, + state::{HasCorpus, HasCurrentTestcase, HasExecutions, HasRand, UsesState}, + Error, Evaluator, HasMetadata, HasNamedMetadata, }; #[cfg(feature = "introspection")] use crate::{monitors::PerfFeature, state::HasClientPerfMonitor}; diff --git a/libafl/src/state/mod.rs b/libafl/src/state/mod.rs index 17088bc7a4..1794b526b5 100644 --- a/libafl/src/state/mod.rs +++ b/libafl/src/state/mod.rs @@ -1,6 +1,6 @@ //! The fuzzer, and state are the core pieces of every good fuzzer -use alloc::{boxed::Box, vec::Vec}; +use alloc::vec::Vec; use core::{ borrow::BorrowMut, cell::{Ref, RefMut}, @@ -18,7 +18,7 @@ use std::{ use libafl_bolts::core_affinity::{CoreId, Cores}; use libafl_bolts::{ rands::{Rand, StdRand}, - serdeany::{NamedSerdeAnyMap, SerdeAny, SerdeAnyMap}, + serdeany::{NamedSerdeAnyMap, SerdeAnyMap}, }; use serde::{de::DeserializeOwned, Deserialize, Serialize}; @@ -34,7 +34,7 @@ use crate::{ generators::Generator, inputs::{Input, UsesInput}, stages::{HasCurrentStage, HasNestedStageStatus}, - Error, + Error, HasMetadata, HasNamedMetadata, }; /// The maximum size of a testcase @@ -155,149 +155,6 @@ pub trait HasScalabilityMonitor { fn scalability_monitor_mut(&mut self) -> &mut ScalabilityMonitor; } -/// Trait for elements offering metadata -pub trait HasMetadata { - /// A map, storing all metadata - fn metadata_map(&self) -> &SerdeAnyMap; - /// A map, storing all metadata (mutable) - fn metadata_map_mut(&mut self) -> &mut SerdeAnyMap; - - /// Add a metadata to the metadata map - #[inline] - fn add_metadata(&mut self, meta: M) - where - M: SerdeAny, - { - self.metadata_map_mut().insert(meta); - } - - /// Gets metadata, or inserts it using the given construction function `default` - fn metadata_or_insert_with(&mut self, default: impl FnOnce() -> M) -> &mut M - where - M: SerdeAny, - { - self.metadata_map_mut().get_or_insert_with::(default) - } - - /// Remove a metadata from the metadata map - #[inline] - fn remove_metadata(&mut self) -> Option> - where - M: SerdeAny, - { - self.metadata_map_mut().remove::() - } - - /// Check for a metadata - /// - /// # Note - /// For performance reasons, you likely want to use [`Self::metadata_or_insert_with`] instead - #[inline] - fn has_metadata(&self) -> bool - where - M: SerdeAny, - { - self.metadata_map().get::().is_some() - } - - /// To get metadata - #[inline] - fn metadata(&self) -> Result<&M, Error> - where - M: SerdeAny, - { - self.metadata_map().get::().ok_or_else(|| { - Error::key_not_found(format!("{} not found", core::any::type_name::())) - }) - } - - /// To get mutable metadata - #[inline] - fn metadata_mut(&mut self) -> Result<&mut M, Error> - where - M: SerdeAny, - { - self.metadata_map_mut().get_mut::().ok_or_else(|| { - Error::key_not_found(format!("{} not found", core::any::type_name::())) - }) - } -} - -/// Trait for elements offering named metadata -pub trait HasNamedMetadata { - /// A map, storing all metadata - fn named_metadata_map(&self) -> &NamedSerdeAnyMap; - /// A map, storing all metadata (mutable) - fn named_metadata_map_mut(&mut self) -> &mut NamedSerdeAnyMap; - - /// Add a metadata to the metadata map - #[inline] - fn add_named_metadata(&mut self, name: &str, meta: M) - where - M: SerdeAny, - { - self.named_metadata_map_mut().insert(name, meta); - } - - /// Add a metadata to the metadata map - #[inline] - fn remove_named_metadata(&mut self, name: &str) -> Option> - where - M: SerdeAny, - { - self.named_metadata_map_mut().remove::(name) - } - - /// Gets metadata, or inserts it using the given construction function `default` - fn named_metadata_or_insert_with( - &mut self, - name: &str, - default: impl FnOnce() -> M, - ) -> &mut M - where - M: SerdeAny, - { - self.named_metadata_map_mut() - .get_or_insert_with::(name, default) - } - - /// Check for a metadata - /// - /// # Note - /// You likely want to use [`Self::named_metadata_or_insert_with`] for performance reasons. - #[inline] - fn has_named_metadata(&self, name: &str) -> bool - where - M: SerdeAny, - { - self.named_metadata_map().contains::(name) - } - - /// To get named metadata - #[inline] - fn named_metadata(&self, name: &str) -> Result<&M, Error> - where - M: SerdeAny, - { - self.named_metadata_map().get::(name).ok_or_else(|| { - Error::key_not_found(format!("{} not found", core::any::type_name::())) - }) - } - - /// To get mutable named metadata - #[inline] - fn named_metadata_mut(&mut self, name: &str) -> Result<&mut M, Error> - where - M: SerdeAny, - { - self.named_metadata_map_mut() - .get_mut::(name) - .ok_or_else(|| { - Error::key_not_found(format!("{} not found", core::any::type_name::())) - }) - } -} - /// Trait for the execution counter pub trait HasExecutions { /// The executions counter diff --git a/libafl_frida/src/asan/errors.rs b/libafl_frida/src/asan/errors.rs index 95def5a33b..29197aef41 100644 --- a/libafl_frida/src/asan/errors.rs +++ b/libafl_frida/src/asan/errors.rs @@ -18,8 +18,8 @@ use libafl::{ feedbacks::Feedback, inputs::{HasTargetBytes, UsesInput}, observers::{Observer, ObserversTuple}, - state::{HasMetadata, State}, - Error, + state::State, + Error, HasMetadata, }; use libafl_bolts::{ownedref::OwnedPtr, Named, SerdeAny}; use serde::{Deserialize, Serialize}; diff --git a/libafl_libfuzzer/libafl_libfuzzer_runtime/src/feedbacks.rs b/libafl_libfuzzer/libafl_libfuzzer_runtime/src/feedbacks.rs index 704d6f1b54..98e3af8555 100644 --- a/libafl_libfuzzer/libafl_libfuzzer_runtime/src/feedbacks.rs +++ b/libafl_libfuzzer/libafl_libfuzzer_runtime/src/feedbacks.rs @@ -9,8 +9,8 @@ use libafl::{ feedbacks::{Feedback, MinMapFeedback}, inputs::{BytesInput, Input}, observers::ObserversTuple, - state::{HasMetadata, State}, - Error, + state::State, + Error, HasMetadata, }; use libafl_bolts::{impl_serdeany, Named}; use libafl_targets::OomFeedback; diff --git a/libafl_libfuzzer/libafl_libfuzzer_runtime/src/fuzz.rs b/libafl_libfuzzer/libafl_libfuzzer_runtime/src/fuzz.rs index 4d83de81e6..00564631d1 100644 --- a/libafl_libfuzzer/libafl_libfuzzer_runtime/src/fuzz.rs +++ b/libafl_libfuzzer/libafl_libfuzzer_runtime/src/fuzz.rs @@ -23,8 +23,8 @@ use libafl::{ Monitor, MultiMonitor, SimpleMonitor, }, stages::{HasCurrentStage, StagesTuple}, - state::{HasExecutions, HasLastReportTime, HasMetadata, HasSolutions, UsesState}, - Error, Fuzzer, + state::{HasExecutions, HasLastReportTime, HasSolutions, UsesState}, + Error, Fuzzer, HasMetadata, }; use libafl_bolts::{ core_affinity::Cores, diff --git a/libafl_libfuzzer/libafl_libfuzzer_runtime/src/misc.rs b/libafl_libfuzzer/libafl_libfuzzer_runtime/src/misc.rs index 7b496a8283..89e7c32999 100644 --- a/libafl_libfuzzer/libafl_libfuzzer_runtime/src/misc.rs +++ b/libafl_libfuzzer/libafl_libfuzzer_runtime/src/misc.rs @@ -3,7 +3,7 @@ use std::{ path::PathBuf, }; -use libafl::{state::HasMetadata, Error}; +use libafl::{Error, HasMetadata}; use libafl_bolts::impl_serdeany; use serde::{Deserialize, Serialize}; use utf8_chars::BufReadCharsExt; diff --git a/libafl_libfuzzer/libafl_libfuzzer_runtime/src/report.rs b/libafl_libfuzzer/libafl_libfuzzer_runtime/src/report.rs index 0384c78ebe..7e4353ee98 100644 --- a/libafl_libfuzzer/libafl_libfuzzer_runtime/src/report.rs +++ b/libafl_libfuzzer/libafl_libfuzzer_runtime/src/report.rs @@ -7,8 +7,8 @@ use libafl::{ inputs::UsesInput, monitors::SimpleMonitor, stages::{HasCurrentStage, StagesTuple}, - state::{HasExecutions, HasLastReportTime, HasMetadata, HasNamedMetadata}, - Error, Fuzzer, + state::{HasExecutions, HasLastReportTime}, + Error, Fuzzer, HasMetadata, HasNamedMetadata, }; use crate::{fuzz_with, options::LibfuzzerOptions}; diff --git a/libafl_libfuzzer/libafl_libfuzzer_runtime/src/schedulers.rs b/libafl_libfuzzer/libafl_libfuzzer_runtime/src/schedulers.rs index 30b45f0f74..8929671061 100644 --- a/libafl_libfuzzer/libafl_libfuzzer_runtime/src/schedulers.rs +++ b/libafl_libfuzzer/libafl_libfuzzer_runtime/src/schedulers.rs @@ -8,8 +8,8 @@ use libafl::{ feedbacks::MapNoveltiesMetadata, inputs::UsesInput, schedulers::{RemovableScheduler, Scheduler}, - state::{HasCorpus, HasMetadata, State, UsesState}, - Error, + state::{HasCorpus, State, UsesState}, + Error, HasMetadata, }; #[derive(Clone, Debug)] diff --git a/libafl_qemu/src/asan.rs b/libafl_qemu/src/asan.rs index 443342553e..8c95f21b08 100644 --- a/libafl_qemu/src/asan.rs +++ b/libafl_qemu/src/asan.rs @@ -8,9 +8,7 @@ use std::{ }; use addr2line::object::{Object, ObjectSection}; -use libafl::{ - executors::ExitKind, inputs::UsesInput, observers::ObserversTuple, state::HasMetadata, -}; +use libafl::{executors::ExitKind, inputs::UsesInput, observers::ObserversTuple, HasMetadata}; use libafl_qemu_sys::GuestAddr; use libc::{ c_void, MAP_ANON, MAP_FAILED, MAP_FIXED, MAP_NORESERVE, MAP_PRIVATE, PROT_READ, PROT_WRITE, diff --git a/libafl_qemu/src/cmplog.rs b/libafl_qemu/src/cmplog.rs index 102bf559ea..8c4a89904c 100644 --- a/libafl_qemu/src/cmplog.rs +++ b/libafl_qemu/src/cmplog.rs @@ -1,7 +1,7 @@ #[cfg(emulation_mode = "usermode")] use capstone::{arch::BuildsCapstone, Capstone, InsnDetail}; use hashbrown::HashMap; -use libafl::{inputs::UsesInput, state::HasMetadata}; +use libafl::{inputs::UsesInput, HasMetadata}; use libafl_qemu_sys::GuestAddr; pub use libafl_targets::{ cmps::{ diff --git a/libafl_qemu/src/drcov.rs b/libafl_qemu/src/drcov.rs index 2f35eed599..5ff2c70fef 100644 --- a/libafl_qemu/src/drcov.rs +++ b/libafl_qemu/src/drcov.rs @@ -1,9 +1,7 @@ use std::{path::PathBuf, sync::Mutex}; use hashbrown::{hash_map::Entry, HashMap}; -use libafl::{ - executors::ExitKind, inputs::UsesInput, observers::ObserversTuple, state::HasMetadata, -}; +use libafl::{executors::ExitKind, inputs::UsesInput, observers::ObserversTuple, HasMetadata}; use libafl_qemu_sys::{GuestAddr, GuestUsize}; use libafl_targets::drcov::{DrCovBasicBlock, DrCovWriter}; use rangemap::RangeMap; diff --git a/libafl_qemu/src/edges.rs b/libafl_qemu/src/edges.rs index 9e612cfc27..810258fbb3 100644 --- a/libafl_qemu/src/edges.rs +++ b/libafl_qemu/src/edges.rs @@ -1,7 +1,7 @@ use std::{cell::UnsafeCell, cmp::max}; use hashbrown::{hash_map::Entry, HashMap}; -use libafl::{inputs::UsesInput, state::HasMetadata}; +use libafl::{inputs::UsesInput, HasMetadata}; use libafl_qemu_sys::GuestAddr; #[cfg(emulation_mode = "systemmode")] use libafl_qemu_sys::GuestPhysAddr; diff --git a/libafl_qemu/src/executor/mod.rs b/libafl_qemu/src/executor/mod.rs index 169b422864..7055ff35f2 100644 --- a/libafl_qemu/src/executor/mod.rs +++ b/libafl_qemu/src/executor/mod.rs @@ -8,11 +8,7 @@ use core::{ }; #[cfg(feature = "fork")] -use libafl::{ - events::EventManager, - executors::InProcessForkExecutor, - state::{HasLastReportTime, HasMetadata}, -}; +use libafl::{events::EventManager, executors::InProcessForkExecutor, state::HasLastReportTime}; use libafl::{ events::{EventFirer, EventRestarter}, executors::{ @@ -24,7 +20,7 @@ use libafl::{ fuzzer::HasObjective, observers::{ObserversTuple, UsesObservers}, state::{HasCorpus, HasExecutions, HasSolutions, State, UsesState}, - Error, + Error, HasMetadata, }; use libafl_bolts::os::unix_signals::{siginfo_t, ucontext_t, Signal}; #[cfg(feature = "fork")] diff --git a/libafl_qemu/src/snapshot.rs b/libafl_qemu/src/snapshot.rs index 74c7008af2..994ee1831b 100644 --- a/libafl_qemu/src/snapshot.rs +++ b/libafl_qemu/src/snapshot.rs @@ -4,7 +4,7 @@ use std::{ sync::Mutex, }; -use libafl::{inputs::UsesInput, state::HasMetadata}; +use libafl::{inputs::UsesInput, HasMetadata}; use libafl_qemu_sys::{GuestAddr, MmapPerms}; use meminterval::{Interval, IntervalTree}; use thread_local::ThreadLocal; diff --git a/libafl_sugar/src/forkserver.rs b/libafl_sugar/src/forkserver.rs index e99b613ba3..70c27c24cc 100644 --- a/libafl_sugar/src/forkserver.rs +++ b/libafl_sugar/src/forkserver.rs @@ -18,8 +18,8 @@ use libafl::{ observers::{HitcountsMapObserver, StdMapObserver, TimeObserver}, schedulers::{IndexesLenTimeMinimizerScheduler, QueueScheduler}, stages::StdMutationalStage, - state::{HasCorpus, HasMetadata, StdState}, - Error, + state::{HasCorpus, StdState}, + Error, HasMetadata, }; use libafl_bolts::{ core_affinity::Cores, diff --git a/libafl_sugar/src/inmemory.rs b/libafl_sugar/src/inmemory.rs index 39ad9d50b2..05bd7d5575 100644 --- a/libafl_sugar/src/inmemory.rs +++ b/libafl_sugar/src/inmemory.rs @@ -21,8 +21,8 @@ use libafl::{ observers::{HitcountsMapObserver, TimeObserver}, schedulers::{IndexesLenTimeMinimizerScheduler, QueueScheduler}, stages::{ShadowTracingStage, StdMutationalStage}, - state::{HasCorpus, HasMetadata, StdState}, - Error, + state::{HasCorpus, StdState}, + Error, HasMetadata, }; use libafl_bolts::{ core_affinity::Cores, diff --git a/libafl_sugar/src/qemu.rs b/libafl_sugar/src/qemu.rs index ff3ae19599..5608eb7b07 100644 --- a/libafl_sugar/src/qemu.rs +++ b/libafl_sugar/src/qemu.rs @@ -24,7 +24,8 @@ use libafl::{ observers::{HitcountsMapObserver, TimeObserver, VariableMapObserver}, schedulers::{IndexesLenTimeMinimizerScheduler, QueueScheduler}, stages::{ShadowTracingStage, StdMutationalStage}, - state::{HasCorpus, HasMetadata, StdState}, + state::{HasCorpus, StdState}, + HasMetadata, }; use libafl_bolts::{ core_affinity::Cores, diff --git a/libafl_targets/src/cmps/observers/aflpp.rs b/libafl_targets/src/cmps/observers/aflpp.rs index 7dd125e2bd..d2d80dcec9 100644 --- a/libafl_targets/src/cmps/observers/aflpp.rs +++ b/libafl_targets/src/cmps/observers/aflpp.rs @@ -11,8 +11,7 @@ use libafl::{ cmp::{AFLppCmpValuesMetadata, CmpMap, CmpObserver, CmpObserverMetadata, CmpValues}, Observer, }, - state::HasMetadata, - Error, + Error, HasMetadata, }; use libafl_bolts::{ownedref::OwnedRefMut, Named}; use serde::{Deserialize, Serialize}; diff --git a/libafl_targets/src/cmps/observers/cmplog.rs b/libafl_targets/src/cmps/observers/cmplog.rs index f66cb074f8..77e3e9f26a 100644 --- a/libafl_targets/src/cmps/observers/cmplog.rs +++ b/libafl_targets/src/cmps/observers/cmplog.rs @@ -9,8 +9,7 @@ use libafl::{ executors::ExitKind, inputs::UsesInput, observers::{cmp::CmpValuesMetadata, CmpMap, CmpObserver, Observer}, - state::HasMetadata, - Error, + Error, HasMetadata, }; use libafl_bolts::{ownedref::OwnedMutPtr, Named}; diff --git a/libafl_targets/src/cmps/stages/aflpptracing.rs b/libafl_targets/src/cmps/stages/aflpptracing.rs index 3896e24bf4..961e7930d5 100644 --- a/libafl_targets/src/cmps/stages/aflpptracing.rs +++ b/libafl_targets/src/cmps/stages/aflpptracing.rs @@ -8,10 +8,8 @@ use libafl::{ inputs::{BytesInput, UsesInput}, observers::ObserversTuple, stages::{colorization::TaintMetadata, RetryRestartHelper, Stage}, - state::{ - HasCorpus, HasCurrentTestcase, HasExecutions, HasMetadata, HasNamedMetadata, UsesState, - }, - Error, + state::{HasCorpus, HasCurrentTestcase, HasExecutions, UsesState}, + Error, HasMetadata, HasNamedMetadata, }; use libafl_bolts::{tuples::MatchName, Named};