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 Reddystatic 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 Reddyextern "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