Home | History | Annotate | Download | only in Linux
      1 // RUN: %clangxx_msan -m64 -g -O0 -DTYPE=int -DFN=xdr_int %s -o %t && \
      2 // RUN:     %run %t 2>&1
      3 // RUN: %clangxx_msan -m64 -g -O0 -DTYPE=int -DFN=xdr_int -DUNINIT=1 %s -o %t && \
      4 // RUN:     not %run %t 2>&1 | FileCheck %s
      5 // RUN: %clangxx_msan -m64 -g -O0 -DTYPE=double -DFN=xdr_double %s -o %t && \
      6 // RUN:     %run %t 2>&1
      7 // RUN: %clangxx_msan -m64 -g -O0 -DTYPE=double -DFN=xdr_double -DUNINIT=1 %s -o %t && \
      8 // RUN:     not %run %t 2>&1 | FileCheck %s
      9 // RUN: %clangxx_msan -m64 -g -O0 -DTYPE=u_quad_t -DFN=xdr_u_longlong_t %s -o %t && \
     10 // RUN:     %run %t 2>&1
     11 // RUN: %clangxx_msan -m64 -g -O0 -DTYPE=u_quad_t -DFN=xdr_u_longlong_t -DUNINIT=1 %s -o %t && \
     12 // RUN:     not %run %t 2>&1 | FileCheck %s
     13 
     14 #include <assert.h>
     15 #include <rpc/xdr.h>
     16 
     17 #include <sanitizer/msan_interface.h>
     18 
     19 int main(int argc, char *argv[]) {
     20   XDR xdrs;
     21   char buf[100];
     22   xdrmem_create(&xdrs, buf, sizeof(buf), XDR_ENCODE);
     23   TYPE x;
     24 #ifndef UNINIT
     25   x = 42;
     26 #endif
     27   bool_t res = FN(&xdrs, &x);
     28   // CHECK: MemorySanitizer: use-of-uninitialized-value
     29   // CHECK: {{in main.*sunrpc.cc:}}[[@LINE-2]]
     30   assert(res == TRUE);
     31   xdr_destroy(&xdrs);
     32 
     33   xdrmem_create(&xdrs, buf, sizeof(buf), XDR_DECODE);
     34   TYPE y;
     35   res = FN(&xdrs, &y);
     36   assert(res == TRUE);
     37   assert(__msan_test_shadow(&y, sizeof(y)) == -1);
     38   xdr_destroy(&xdrs);
     39   return 0;
     40 }
     41