Files
clang-p2996/compiler-rt/test/msan/vararg.cc
Alexander Potapenko 7f270fcf0a [MSan] store origins for variadic function parameters in __msan_va_arg_origin_tls
Add the __msan_va_arg_origin_tls TLS array to keep the origins for variadic function parameters.
Change the instrumentation pass to store parameter origins in this array.

This is a reland of r341528.

test/msan/vararg.cc doesn't work on Mips, PPC and AArch64 (because this
patch doesn't touch them), XFAIL these arches.
Also turned out Clang crashed on i80 vararg arguments because of
incorrect origin type returned by getOriginPtrForVAArgument() - fixed it
and added a test.

llvm-svn: 341554
2018-09-06 15:14:36 +00:00

61 lines
1.8 KiB
C++

// 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'