1 // RUN: %clangxx_msan -fsanitize-memory-track-origins=0 -O3 %s -o %t && \ 2 // RUN: not %run %t va_arg_tls >%t.out 2>&1 3 // RUN: FileCheck %s --check-prefix=CHECK < %t.out 4 5 // RUN: %clangxx_msan -fsanitize-memory-track-origins=0 -O3 %s -o %t && \ 6 // RUN: not %run %t overflow >%t.out 2>&1 7 // RUN: FileCheck %s --check-prefix=CHECK < %t.out 8 9 // RUN: %clangxx_msan -fsanitize-memory-track-origins=2 -O3 %s -o %t && \ 10 // RUN: not %run %t va_arg_tls >%t.out 2>&1 11 // RUN: FileCheck %s --check-prefixes=CHECK,CHECK-ORIGIN < %t.out 12 13 // RUN: %clangxx_msan -fsanitize-memory-track-origins=2 -O3 %s -o %t && \ 14 // RUN: not %run %t overflow >%t.out 2>&1 15 // RUN: FileCheck %s --check-prefixes=CHECK,CHECK-ORIGIN < %t.out 16 17 // Check that shadow and origin are passed through va_args. 18 19 // Copying origins on AArch64, MIPS and PowerPC isn't supported yet. 20 // XFAIL: aarch64 21 // XFAIL: mips 22 // XFAIL: powerpc64 23 24 #include <stdarg.h> 25 #include <string.h> 26 27 __attribute__((noinline)) 28 int sum(int n, ...) { 29 va_list args; 30 int i, sum = 0, arg; 31 volatile int temp; 32 va_start(args, n); 33 for (i = 0; i < n; i++) { 34 arg = va_arg(args, int); 35 sum += arg; 36 } 37 va_end(args); 38 return sum; 39 } 40 41 int main(int argc, char *argv[]) { 42 volatile int uninit; 43 volatile int a = 1, b = 2; 44 if (argc == 2) { 45 // Shadow/origin will be passed via va_arg_tls/va_arg_origin_tls. 46 if (strcmp(argv[1], "va_arg_tls") == 0) { 47 return sum(3, uninit, a, b); 48 } 49 // Shadow/origin of |uninit| will be passed via overflow area. 50 if (strcmp(argv[1], "overflow") == 0) { 51 return sum(7, 52 a, a, a, a, a, a, uninit 53 ); 54 } 55 } 56 return 0; 57 } 58 59 // CHECK: WARNING: MemorySanitizer: use-of-uninitialized-value 60 // CHECK-ORIGIN: Uninitialized value was created by an allocation of 'uninit' in the stack frame of function 'main' 61