// Copyright 2024 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifdef UNSAFE_BUFFERS_BUILD // TODO(crbug.com/40284755): Remove this and spanify to fix the errors. #pragma allow_unsafe_buffers #endif #include "base/logging.h" #include "base/metrics/histogram.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/persistent_histogram_allocator.h" #include "base/metrics/persistent_memory_allocator.h" struct Environment { Environment() { logging::SetMinLogLevel(logging::LOGGING_FATAL); } }; extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { static Environment env; // Copy data into a non-const vector. std::vector data_copy(data, data + size); // PersistentMemoryAllocator segments must be aligned and an acceptable size. if (!base::PersistentMemoryAllocator::IsMemoryAcceptable( data_copy.data(), data_copy.size(), /*page_size=*/0, /*readonly=*/false)) { return 0; } std::unique_ptr memory_allocator = std::make_unique( data_copy.data(), data_copy.size(), /*page_size=*/0, /*id=*/0, /*name=*/"", /*access_mode=*/ base::FilePersistentMemoryAllocator::kReadWriteExisting); std::unique_ptr histogram_allocator = std::make_unique( std::move(memory_allocator)); base::PersistentHistogramAllocator::Iterator hist_iter( histogram_allocator.get()); while (true) { std::unique_ptr histogram = hist_iter.GetNext(); if (!histogram) { break; } histogram_allocator->MergeHistogramDeltaToStatisticsRecorder( histogram.get()); } return 0; }