From 0d25c6e70407a7e37cc4e12ce39bf5e3a2e78c96 Mon Sep 17 00:00:00 2001 From: Marcus Holland-Moritz Date: Tue, 18 Jul 2023 20:14:33 +0200 Subject: [PATCH] Basic categorizer fuzzer --- CMakeLists.txt | 7 +++++ test/fuzz_categorizers.cpp | 58 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 test/fuzz_categorizers.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 03a058c0..2db2ec42 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,6 +29,7 @@ include(CheckCXXSourceCompiles) option(WITH_TESTS "build with tests" OFF) option(WITH_BENCHMARKS "build with benchmarks" OFF) +option(WITH_FUZZ "build with fuzzing binaries" OFF) option(ENABLE_PERFMON "enable performance monitor in all tools" ON) if(WIN32) set(PREFER_SYSTEM_LIBFMT ON) @@ -586,6 +587,12 @@ if(WITH_BENCHMARKS) list(APPEND BINARY_TARGETS dwarfs_benchmark) endif() +if(WITH_FUZZ) + add_executable(fuzz_categorizers test/fuzz_categorizers.cpp) + target_link_libraries(fuzz_categorizers "$") + list(APPEND BINARY_TARGETS fuzz_categorizers) +endif() + if(WITH_MAN_PAGES) list(REMOVE_DUPLICATES MAN_DIRS) add_custom_target(manpages ALL DEPENDS ${MAN_PAGES}) diff --git a/test/fuzz_categorizers.cpp b/test/fuzz_categorizers.cpp new file mode 100644 index 00000000..97349326 --- /dev/null +++ b/test/fuzz_categorizers.cpp @@ -0,0 +1,58 @@ +/* vim:set ts=2 sw=2 sts=2 et: */ +/** + * \author Marcus Holland-Moritz (github@mhxnet.de) + * \copyright Copyright (c) Marcus Holland-Moritz + * + * This file is part of dwarfs. + * + * dwarfs is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * dwarfs is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with dwarfs. If not, see . + */ + +#include + +#include + +#include "dwarfs/categorizer.h" +#include "dwarfs/logger.h" +#include "dwarfs/mmap.h" + +using namespace dwarfs; + +int main(int argc, char** argv) { + if (argc < 2) { + return 1; + } + + stream_logger lgr(std::cerr); + + auto& catreg = categorizer_registry::instance(); + auto catmgr = std::make_shared(lgr); + + boost::program_options::variables_map vm; + catmgr->add(catreg.create(lgr, "pcmaudio", vm)); + +#ifdef __AFL_LOOP + while (__AFL_LOOP(10000)) +#endif + { + std::filesystem::path p(argv[1]); + auto mm = mmap(p); + auto job = catmgr->job(p); + job.set_total_size(mm.size()); + job.categorize_random_access(mm.span()); + auto res [[maybe_unused]] = job.result(); + } + + return 0; +}