// (C) Copyright Marshall Clow 2018 // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #include // for std::distance #include // for assert #include #include // Fuzzing tests for: // // template // std::pair // minmax_element(ForwardIterator first, ForwardIterator last); // // template // std::pair // minmax_element(ForwardIterator first, ForwardIterator last, // BinaryPredicate comp); bool greater(uint8_t lhs, uint8_t rhs) { return lhs > rhs; } extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t sz) { typedef std::pair result_t; if (sz == 0) return 0; // we need at least one element { // Find the min and max result_t result = boost::minmax_element(data, data + sz); // The iterators have to be in the sequence - and not at the end! assert(std::distance(data, result.first) < sz); assert(std::distance(data, result.second) < sz); // the minimum element can't be bigger than the max element uint8_t min_value = *result.first; uint8_t max_value = *result.second; assert(min_value <= max_value); // None of the elements in the sequence can be less than the min, nor greater than the max for (size_t i = 0; i < sz; ++i) { assert(min_value <= data[i]); assert(data[i] <= max_value); } // We returned the first min element, and the first max element assert(boost::algorithm::none_of_equal(data, result.first, min_value)); assert(boost::algorithm::none_of_equal(data, result.second, max_value)); } { // Find the min and max result_t result = boost::minmax_element(data, data + sz, greater); // The iterators have to be in the sequence - and not at the end! assert(std::distance(data, result.first) < sz); assert(std::distance(data, result.second) < sz); // the minimum element can't be bigger than the max element uint8_t min_value = *result.first; uint8_t max_value = *result.second; assert (!greater(max_value, min_value)); // None of the elements in the sequence can be less than the min, nor greater than the max for (size_t i = 0; i < sz; ++i) { assert(!greater(data[i], min_value)); assert(!greater(max_value, data[i])); } // We returned the first min element, and the first max element assert(boost::algorithm::none_of_equal(data, result.first, min_value)); assert(boost::algorithm::none_of_equal(data, result.second, max_value)); } return 0; }