| // RUN: %clangxx_msan -fsanitize-memory-track-origins=0 -O3 %s -o %t && \ |
| // RUN: not %run %t va_arg_tls >%t.out 2>&1 |
| // RUN: FileCheck %s --check-prefix=CHECK < %t.out |
| |
| // RUN: %clangxx_msan -fsanitize-memory-track-origins=0 -O3 %s -o %t && \ |
| // RUN: not %run %t overflow >%t.out 2>&1 |
| // RUN: FileCheck %s --check-prefix=CHECK < %t.out |
| |
| // RUN: %clangxx_msan -fsanitize-memory-track-origins=2 -O3 %s -o %t && \ |
| // RUN: not %run %t va_arg_tls >%t.out 2>&1 |
| // RUN: FileCheck %s --check-prefixes=CHECK,CHECK-ORIGIN < %t.out |
| |
| // RUN: %clangxx_msan -fsanitize-memory-track-origins=2 -O3 %s -o %t && \ |
| // RUN: not %run %t overflow >%t.out 2>&1 |
| // RUN: FileCheck %s --check-prefixes=CHECK,CHECK-ORIGIN < %t.out |
| |
| // Check that shadow and origin are passed through va_args. |
| |
| // Copying origins on AArch64, MIPS and PowerPC isn't supported yet. |
| // XFAIL: aarch64 |
| // XFAIL: mips |
| // XFAIL: powerpc64 |
| |
| #include <stdarg.h> |
| #include <string.h> |
| |
| __attribute__((noinline)) |
| int sum(int n, ...) { |
| va_list args; |
| int i, sum = 0, arg; |
| volatile int temp; |
| va_start(args, n); |
| for (i = 0; i < n; i++) { |
| arg = va_arg(args, int); |
| sum += arg; |
| } |
| va_end(args); |
| return sum; |
| } |
| |
| int main(int argc, char *argv[]) { |
| volatile int uninit; |
| volatile int a = 1, b = 2; |
| if (argc == 2) { |
| // Shadow/origin will be passed via va_arg_tls/va_arg_origin_tls. |
| if (strcmp(argv[1], "va_arg_tls") == 0) { |
| return sum(3, uninit, a, b); |
| } |
| // Shadow/origin of |uninit| will be passed via overflow area. |
| if (strcmp(argv[1], "overflow") == 0) { |
| return sum(7, |
| a, a, a, a, a, a, uninit |
| ); |
| } |
| } |
| return 0; |
| } |
| |
| // CHECK: WARNING: MemorySanitizer: use-of-uninitialized-value |
| // CHECK-ORIGIN: Uninitialized value was created by an allocation of 'uninit' in the stack frame of function 'main' |