xref: /llvm-project/compiler-rt/test/msan/bsearch.cpp (revision 15805c030f31b8d112ee4a4706ff4f5725c794df)
19ab590e3SVitaly Buka // __NO_INLINE__ is defined so bsearch needs interceptor.
2*15805c03SVitaly Buka // RUN: %clangxx_msan -fno-sanitize-memory-param-retval -O0 -g %s -o %t && %run %t
3*15805c03SVitaly Buka // RUN: %clangxx_msan -fno-sanitize-memory-param-retval -DPOISON_DATA -O0 -g %s -o %t && not %run %t 2>&1 | FileCheck %s
4*15805c03SVitaly Buka // RUN: %clangxx_msan -fno-sanitize-memory-param-retval -DPOISON_KEY -O0 -g %s -o %t && not %run %t 2>&1 | FileCheck %s
59ab590e3SVitaly Buka 
69ab590e3SVitaly Buka // __NO_INLINE__ is undefined so bsearch should be inlined and instrumented and still work as expected.
7*15805c03SVitaly Buka // RUN: %clangxx_msan -fno-sanitize-memory-param-retval -O2 -g %s -o %t && %run %t
8*15805c03SVitaly Buka // RUN: %clangxx_msan -fno-sanitize-memory-param-retval -DPOISON_DATA -O2 -g %s -o %t && not %run %t 2>&1 | FileCheck %s
9*15805c03SVitaly Buka // RUN: %clangxx_msan -fno-sanitize-memory-param-retval -DPOISON_KEY -O2 -g %s -o %t && not %run %t 2>&1 | FileCheck %s
109ab590e3SVitaly Buka 
119ab590e3SVitaly Buka #include <assert.h>
129ab590e3SVitaly Buka #include <stdlib.h>
139ab590e3SVitaly Buka 
149ab590e3SVitaly Buka #include <sanitizer/msan_interface.h>
159ab590e3SVitaly Buka 
169ab590e3SVitaly Buka long z;
179ab590e3SVitaly Buka 
189ab590e3SVitaly Buka __attribute__((noinline, optnone)) void
poison_msan_param_tls(long a,long b,long c,long d,long e,long f)199ab590e3SVitaly Buka poison_msan_param_tls(long a, long b, long c, long d, long e, long f) {
209ab590e3SVitaly Buka   z = a + b + c + d + e + f;
219ab590e3SVitaly Buka }
229ab590e3SVitaly Buka 
compar(const void * a,const void * b)239ab590e3SVitaly Buka static int compar(const void *a, const void *b) {
249ab590e3SVitaly Buka   int r = *(const long *)a - *(const long *)b;
259ab590e3SVitaly Buka   long x;
269ab590e3SVitaly Buka   __msan_poison(&x, sizeof(x));
279ab590e3SVitaly Buka   poison_msan_param_tls(x, x, x, x, x, x);
289ab590e3SVitaly Buka   return r;
299ab590e3SVitaly Buka }
309ab590e3SVitaly Buka 
main(int argc,char * argv[])319ab590e3SVitaly Buka int main(int argc, char *argv[]) {
329ab590e3SVitaly Buka   constexpr size_t SZ = 27;
339ab590e3SVitaly Buka   long p[SZ + 1];
349ab590e3SVitaly Buka   for (int i = 0; i < SZ + 1; ++i)
359ab590e3SVitaly Buka     p[i] = i;
369ab590e3SVitaly Buka   p[SZ] = SZ / 3;
379ab590e3SVitaly Buka #if defined(POISON_DATA)
389ab590e3SVitaly Buka   __msan_poison(p, sizeof(long) * SZ / 2);
399ab590e3SVitaly Buka #elif defined(POISON_KEY)
409ab590e3SVitaly Buka   __msan_poison(p + SZ, sizeof(long));
419ab590e3SVitaly Buka #endif
429ab590e3SVitaly Buka   const long *r = (const long *)bsearch(p + SZ, p, SZ, sizeof(long), compar);
439ab590e3SVitaly Buka   // CHECK: MemorySanitizer: use-of-uninitialized-value
449ab590e3SVitaly Buka 
459ab590e3SVitaly Buka   assert(r == p + SZ / 3);
469ab590e3SVitaly Buka 
479ab590e3SVitaly Buka   return 0;
489ab590e3SVitaly Buka }
49