xref: /llvm-project/compiler-rt/test/sanitizer_common/TestCases/Posix/bsearch.cpp (revision 9ab590e3ebb2f4a652b4cbdd3594848e8fb017fe)
1*9ab590e3SVitaly Buka // Check interceptor.
2*9ab590e3SVitaly Buka // RUN: %clangxx -O0 %s -o %t && %run %t 2>&1 | FileCheck %s
3*9ab590e3SVitaly Buka 
4*9ab590e3SVitaly Buka // Inlined bsearch works even without interceptors.
5*9ab590e3SVitaly Buka // RUN: %clangxx -O2 %s -o %t && %run %t 2>&1 | FileCheck %s
6*9ab590e3SVitaly Buka 
7*9ab590e3SVitaly Buka #include <stdio.h>
8*9ab590e3SVitaly Buka #include <stdlib.h>
9*9ab590e3SVitaly Buka 
10*9ab590e3SVitaly Buka static int arr1[] = {8, 7, 6, 5, 4, 3, 2, 1, 0};
11*9ab590e3SVitaly Buka static int arr2[] = {10, 1, 1, 3, 4, 6, 7, 7};
12*9ab590e3SVitaly Buka 
13*9ab590e3SVitaly Buka #define array_size(x) (sizeof(x) / sizeof(x[0]))
14*9ab590e3SVitaly Buka 
cmp_ints(const void * a,const void * b)15*9ab590e3SVitaly Buka static int cmp_ints(const void *a, const void *b) {
16*9ab590e3SVitaly Buka   return *(const int *)b - *(const int *)a;
17*9ab590e3SVitaly Buka }
18*9ab590e3SVitaly Buka 
cmp_pos(const void * a,const void * b)19*9ab590e3SVitaly Buka static int cmp_pos(const void *a, const void *b) {
20*9ab590e3SVitaly Buka   const int *ap =
21*9ab590e3SVitaly Buka       (const int *)bsearch(a, arr1, array_size(arr1), sizeof(int), &cmp_ints);
22*9ab590e3SVitaly Buka   if (!ap)
23*9ab590e3SVitaly Buka     ap = arr1 + array_size(arr1);
24*9ab590e3SVitaly Buka   const int *bp =
25*9ab590e3SVitaly Buka       (const int *)bsearch(b, arr1, array_size(arr1), sizeof(int), &cmp_ints);
26*9ab590e3SVitaly Buka   if (!bp)
27*9ab590e3SVitaly Buka     bp = arr1 + array_size(arr1);
28*9ab590e3SVitaly Buka   return bp - ap;
29*9ab590e3SVitaly Buka }
30*9ab590e3SVitaly Buka 
main()31*9ab590e3SVitaly Buka int main() {
32*9ab590e3SVitaly Buka   // Simple bsearch.
33*9ab590e3SVitaly Buka   for (int i = 0; i < 10; ++i) {
34*9ab590e3SVitaly Buka     const void *r =
35*9ab590e3SVitaly Buka         bsearch(&i, arr1, array_size(arr1), sizeof(arr1[0]), &cmp_ints);
36*9ab590e3SVitaly Buka     if (!r)
37*9ab590e3SVitaly Buka       printf(" null");
38*9ab590e3SVitaly Buka     else
39*9ab590e3SVitaly Buka       printf(" %d", *(const int *)r);
40*9ab590e3SVitaly Buka   }
41*9ab590e3SVitaly Buka   printf("\n");
42*9ab590e3SVitaly Buka   // CHECK: 0 1 2 3 4 5 6 7 8 null
43*9ab590e3SVitaly Buka 
44*9ab590e3SVitaly Buka   // Nested bsearch.
45*9ab590e3SVitaly Buka   for (int i = 0; i < 10; ++i) {
46*9ab590e3SVitaly Buka     const void *r =
47*9ab590e3SVitaly Buka         bsearch(&i, arr2, array_size(arr2), sizeof(arr2[0]), &cmp_pos);
48*9ab590e3SVitaly Buka     if (!r)
49*9ab590e3SVitaly Buka       printf(" null");
50*9ab590e3SVitaly Buka     else
51*9ab590e3SVitaly Buka       printf(" %d", *(const int *)r);
52*9ab590e3SVitaly Buka   }
53*9ab590e3SVitaly Buka   printf("\n");
54*9ab590e3SVitaly Buka   // CHECK: null 1 null 3 4 null 6 7 null 10
55*9ab590e3SVitaly Buka }
56