xref: /llvm-project/libcxx/test/libcxx/fuzzing/pop_heap.pass.cpp (revision b4bd194378851c2f421477d4147019d10f2420ac)
1*b4bd1943SLouis Dionne //===----------------------------------------------------------------------===//
2*b4bd1943SLouis Dionne //
3*b4bd1943SLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*b4bd1943SLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
5*b4bd1943SLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*b4bd1943SLouis Dionne //
7*b4bd1943SLouis Dionne //===----------------------------------------------------------------------===//
8*b4bd1943SLouis Dionne 
9*b4bd1943SLouis Dionne // UNSUPPORTED: c++03, c++11
10*b4bd1943SLouis Dionne 
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     if (size < 2)
20*b4bd1943SLouis Dionne         return 0;
21*b4bd1943SLouis Dionne     std::vector<std::uint8_t> working(data, data + size);
22*b4bd1943SLouis Dionne     std::make_heap(working.begin(), working.end());
23*b4bd1943SLouis Dionne 
24*b4bd1943SLouis Dionne     // Pop things off, one at a time
25*b4bd1943SLouis Dionne     auto iter = --working.end();
26*b4bd1943SLouis Dionne     while (iter != working.begin()) {
27*b4bd1943SLouis Dionne         std::pop_heap(working.begin(), iter);
28*b4bd1943SLouis Dionne         if (!std::is_heap(working.begin(), --iter))
29*b4bd1943SLouis Dionne             return 2;
30*b4bd1943SLouis Dionne     }
31*b4bd1943SLouis Dionne 
32*b4bd1943SLouis Dionne     return 0;
33*b4bd1943SLouis Dionne }
34