]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/algorithm/minmax/fuzzing/minmax_element_variants.fuzz.cpp
1 // (C) Copyright Marshall Clow 2018
2 // Use, modification and distribution are subject to the
3 // Boost Software License, Version 1.0. (See accompanying file
4 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 #include <iterator> // for std::distance
7 #include <cassert> // for assert
9 #include <boost/algorithm/minmax_element.hpp>
10 #include <boost/algorithm/cxx11/none_of.hpp>
14 // template <class ForwardIterator>
15 // std::pair<ForwardIterator,ForwardIterator>
16 // first_min_first_max_element(ForwardIterator first, ForwardIterator last);
18 // template <class ForwardIterator, class BinaryPredicate>
19 // std::pair<ForwardIterator,ForwardIterator>
20 // first_min_first_max_element(ForwardIterator first, ForwardIterator last,
21 // BinaryPredicate comp);
23 // identical signatures for:
24 // first_min_last_max_element
25 // last_min_first_max_element
26 // last_min_last_max_element
28 bool greater(uint8_t lhs
, uint8_t rhs
) { return lhs
> rhs
; }
30 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data
, size_t sz
) {
31 typedef std::pair
<const uint8_t *, const uint8_t *> result_t
;
32 const uint8_t * const dend
= data
+ sz
;
33 if (sz
== 0) return 0; // we need at least one element
36 // Find the min and max
37 result_t resultff
= boost::first_min_first_max_element(data
, dend
);
38 result_t resultfl
= boost::first_min_last_max_element (data
, dend
);
39 result_t resultlf
= boost::last_min_first_max_element (data
, dend
);
40 result_t resultll
= boost::last_min_last_max_element (data
, dend
);
42 // The iterators have to be in the sequence - and not at the end!
43 assert(std::distance(data
, resultff
.first
) < sz
);
44 assert(std::distance(data
, resultff
.second
) < sz
);
45 assert(std::distance(data
, resultfl
.first
) < sz
);
46 assert(std::distance(data
, resultfl
.second
) < sz
);
47 assert(std::distance(data
, resultlf
.first
) < sz
);
48 assert(std::distance(data
, resultlf
.second
) < sz
);
49 assert(std::distance(data
, resultll
.first
) < sz
);
50 assert(std::distance(data
, resultll
.second
) < sz
);
52 // the minimum element can't be bigger than the max element
54 // Did we find the same min value and max value?
55 uint8_t min_value
= *resultff
.first
;
56 uint8_t max_value
= *resultff
.second
;
57 assert(min_value
<= max_value
);
59 // Each variant should have found the same min/max values
60 assert(*resultff
.first
== min_value
);
61 assert(*resultfl
.first
== min_value
);
62 assert(*resultlf
.first
== min_value
);
63 assert(*resultll
.first
== min_value
);
65 assert(*resultff
.second
== max_value
);
66 assert(*resultfl
.second
== max_value
);
67 assert(*resultlf
.second
== max_value
);
68 assert(*resultll
.second
== max_value
);
70 // None of the elements in the sequence can be less than the min, nor greater than the max
71 for (size_t i
= 0; i
< sz
; ++i
) {
72 assert(min_value
<= data
[i
]);
73 assert(data
[i
] <= max_value
);
76 // Make sure we returned the "right" first and last element
77 assert(boost::algorithm::none_of_equal(data
, resultff
.first
, min_value
));
78 assert(boost::algorithm::none_of_equal(data
, resultfl
.first
, min_value
));
79 assert(boost::algorithm::none_of_equal(resultlf
.first
+ 1, dend
, min_value
));
80 assert(boost::algorithm::none_of_equal(resultll
.first
+ 1, dend
, min_value
));
82 assert(boost::algorithm::none_of_equal(data
, resultff
.second
, max_value
));
83 assert(boost::algorithm::none_of_equal(resultfl
.second
+ 1, dend
, max_value
));
84 assert(boost::algorithm::none_of_equal(data
, resultlf
.second
, max_value
));
85 assert(boost::algorithm::none_of_equal(resultll
.second
+ 1, dend
, max_value
));
89 // Find the min and max
90 result_t resultff
= boost::first_min_first_max_element(data
, dend
, greater
);
91 result_t resultfl
= boost::first_min_last_max_element (data
, dend
, greater
);
92 result_t resultlf
= boost::last_min_first_max_element (data
, dend
, greater
);
93 result_t resultll
= boost::last_min_last_max_element (data
, dend
, greater
);
95 // The iterators have to be in the sequence - and not at the end!
96 assert(std::distance(data
, resultff
.first
) < sz
);
97 assert(std::distance(data
, resultff
.second
) < sz
);
98 assert(std::distance(data
, resultfl
.first
) < sz
);
99 assert(std::distance(data
, resultfl
.second
) < sz
);
100 assert(std::distance(data
, resultlf
.first
) < sz
);
101 assert(std::distance(data
, resultlf
.second
) < sz
);
102 assert(std::distance(data
, resultll
.first
) < sz
);
103 assert(std::distance(data
, resultll
.second
) < sz
);
105 // the minimum element can't be bigger than the max element
106 uint8_t min_value
= *resultff
.first
;
107 uint8_t max_value
= *resultff
.second
;
109 assert (!greater(max_value
, min_value
));
111 // Each variant should have found the same min/max values
112 assert(*resultff
.first
== min_value
);
113 assert(*resultfl
.first
== min_value
);
114 assert(*resultlf
.first
== min_value
);
115 assert(*resultll
.first
== min_value
);
117 assert(*resultff
.second
== max_value
);
118 assert(*resultfl
.second
== max_value
);
119 assert(*resultlf
.second
== max_value
);
120 assert(*resultll
.second
== max_value
);
122 // None of the elements in the sequence can be less than the min, nor greater than the max
123 for (size_t i
= 0; i
< sz
; ++i
) {
124 assert(!greater(data
[i
], min_value
));
125 assert(!greater(max_value
, data
[i
]));
128 // We returned the first min element, and the first max element
129 assert(boost::algorithm::none_of_equal(data
, resultff
.first
, min_value
));
130 assert(boost::algorithm::none_of_equal(data
, resultfl
.first
, min_value
));
131 assert(boost::algorithm::none_of_equal(resultlf
.first
+ 1, dend
, min_value
));
132 assert(boost::algorithm::none_of_equal(resultll
.first
+ 1, dend
, min_value
));
134 assert(boost::algorithm::none_of_equal(data
, resultff
.second
, max_value
));
135 assert(boost::algorithm::none_of_equal(resultfl
.second
+ 1, dend
, max_value
));
136 assert(boost::algorithm::none_of_equal(data
, resultlf
.second
, max_value
));
137 assert(boost::algorithm::none_of_equal(resultll
.second
+ 1, dend
, max_value
));