1*5eb6b827SSiva Chandra Reddy //===-- qsort_fuzz.cpp ----------------------------------------------------===//
2*5eb6b827SSiva Chandra Reddy //
3*5eb6b827SSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*5eb6b827SSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information.
5*5eb6b827SSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*5eb6b827SSiva Chandra Reddy //
7*5eb6b827SSiva Chandra Reddy //===----------------------------------------------------------------------===//
8*5eb6b827SSiva Chandra Reddy ///
9*5eb6b827SSiva Chandra Reddy /// Fuzzing test for llvm-libc qsort implementation.
10*5eb6b827SSiva Chandra Reddy ///
11*5eb6b827SSiva Chandra Reddy //===----------------------------------------------------------------------===//
12*5eb6b827SSiva Chandra Reddy 
13*5eb6b827SSiva Chandra Reddy #include "src/stdlib/qsort.h"
14*5eb6b827SSiva Chandra Reddy #include <stdint.h>
15*5eb6b827SSiva Chandra Reddy 
int_compare(const void * l,const void * r)16*5eb6b827SSiva Chandra Reddy static int int_compare(const void *l, const void *r) {
17*5eb6b827SSiva Chandra Reddy   int li = *reinterpret_cast<const int *>(l);
18*5eb6b827SSiva Chandra Reddy   int ri = *reinterpret_cast<const int *>(r);
19*5eb6b827SSiva Chandra Reddy   if (li == ri)
20*5eb6b827SSiva Chandra Reddy     return 0;
21*5eb6b827SSiva Chandra Reddy   else if (li > ri)
22*5eb6b827SSiva Chandra Reddy     return 1;
23*5eb6b827SSiva Chandra Reddy   else
24*5eb6b827SSiva Chandra Reddy     return -1;
25*5eb6b827SSiva Chandra Reddy }
26*5eb6b827SSiva Chandra Reddy 
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)27*5eb6b827SSiva Chandra Reddy extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
28*5eb6b827SSiva Chandra Reddy   const size_t array_size = size / sizeof(int);
29*5eb6b827SSiva Chandra Reddy   if (array_size == 0)
30*5eb6b827SSiva Chandra Reddy     return 0;
31*5eb6b827SSiva Chandra Reddy 
32*5eb6b827SSiva Chandra Reddy   int *array = new int[array_size];
33*5eb6b827SSiva Chandra Reddy   const int *data_as_int = reinterpret_cast<const int *>(data);
34*5eb6b827SSiva Chandra Reddy   for (size_t i = 0; i < array_size; ++i)
35*5eb6b827SSiva Chandra Reddy     array[i] = data_as_int[i];
36*5eb6b827SSiva Chandra Reddy 
37*5eb6b827SSiva Chandra Reddy   __llvm_libc::qsort(array, array_size, sizeof(int), int_compare);
38*5eb6b827SSiva Chandra Reddy 
39*5eb6b827SSiva Chandra Reddy   for (size_t i = 0; i < array_size - 1; ++i) {
40*5eb6b827SSiva Chandra Reddy     if (array[i] > array[i + 1])
41*5eb6b827SSiva Chandra Reddy       __builtin_trap();
42*5eb6b827SSiva Chandra Reddy   }
43*5eb6b827SSiva Chandra Reddy 
44*5eb6b827SSiva Chandra Reddy   delete[] array;
45*5eb6b827SSiva Chandra Reddy   return 0;
46*5eb6b827SSiva Chandra Reddy }
47