xref: /llvm-project/libcxx/test/libcxx/fuzzing/stable_sort.pass.cpp (revision b4bd194378851c2f421477d4147019d10f2420ac)
1*b4bd1943SLouis Dionne //===----------------------------------------------------------------------===//
2daacf570SEric Fiselier //
3daacf570SEric Fiselier // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4daacf570SEric Fiselier // See https://llvm.org/LICENSE.txt for license information.
5daacf570SEric Fiselier // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6daacf570SEric Fiselier //
7daacf570SEric Fiselier //===----------------------------------------------------------------------===//
8daacf570SEric Fiselier 
9*b4bd1943SLouis Dionne // UNSUPPORTED: c++03, c++11
109b540192SEric Fiselier 
11*b4bd1943SLouis Dionne #include <algorithm>
12*b4bd1943SLouis Dionne #include <cstddef>
13*b4bd1943SLouis Dionne #include <cstdint>
14*b4bd1943SLouis Dionne #include <vector>
15*b4bd1943SLouis Dionne 
16*b4bd1943SLouis Dionne #include "fuzz.h"
17*b4bd1943SLouis Dionne 
LLVMFuzzerTestOneInput(const std::uint8_t * data,std::size_t size)18*b4bd1943SLouis Dionne extern "C" int LLVMFuzzerTestOneInput(const std::uint8_t *data, std::size_t size) {
19*b4bd1943SLouis Dionne     std::vector<ByteWithPayload> input;
20*b4bd1943SLouis Dionne     for (std::size_t i = 0; i < size; ++i)
21*b4bd1943SLouis Dionne         input.push_back(ByteWithPayload(data[i], i));
22*b4bd1943SLouis Dionne 
23*b4bd1943SLouis Dionne     std::vector<ByteWithPayload> working = input;
24*b4bd1943SLouis Dionne     std::stable_sort(working.begin(), working.end(), ByteWithPayload::key_less());
25*b4bd1943SLouis Dionne 
26*b4bd1943SLouis Dionne     if (!std::is_sorted(working.begin(), working.end(), ByteWithPayload::key_less()))
27*b4bd1943SLouis Dionne         return 1;
28*b4bd1943SLouis Dionne 
29*b4bd1943SLouis Dionne     auto iter = working.begin();
30*b4bd1943SLouis Dionne     while (iter != working.end()) {
31*b4bd1943SLouis Dionne         auto range = std::equal_range(iter, working.end(), *iter, ByteWithPayload::key_less());
32*b4bd1943SLouis Dionne         if (!std::is_sorted(range.first, range.second, ByteWithPayload::total_less()))
33*b4bd1943SLouis Dionne             return 2;
34*b4bd1943SLouis Dionne         iter = range.second;
35*b4bd1943SLouis Dionne     }
36*b4bd1943SLouis Dionne     if (!fast_is_permutation(input.cbegin(), input.cend(), working.cbegin()))
37*b4bd1943SLouis Dionne         return 99;
38*b4bd1943SLouis Dionne     return 0;
39*b4bd1943SLouis Dionne }
40