[llvm] [compiler-rt] [test][msan] Precommit tests for vararg improvements (PR #72612)
Thurston Dang via llvm-commits
llvm-commits at lists.llvm.org
Fri Nov 17 11:40:24 PST 2023
================
@@ -0,0 +1,256 @@
+// Check that shadow of retrived value from va_list matches the shadow of passed value.
+
+// Without -fno-sanitize-memory-param-retval we can't even pass poisoned values.
+// RUN: %clangxx_msan -fno-sanitize-memory-param-retval -fsanitize-memory-track-origins=0 -O3 %s -o %t
+
+// Nothing works yet.
+// XFAIL: *
+
+#include <sanitizer/msan_interface.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+
+#define DEBUG_TEST 0
+
+#if DEBUG_TEST
+__attribute__((noinline, no_sanitize("memory"))) void
+printb(const void *p, size_t n, int line, int align) {
+ fprintf(stderr, "\n%p at line %d: \n", p, line);
+ for (int i = 0; i < n;) {
+ fprintf(stderr, "%p: ", (void *)(((uint8_t *)p) + i));
+ for (int j = 0; j < align; ++i, ++j)
+ fprintf(stderr, "%02x ", ((uint8_t *)p)[i]);
+ fprintf(stderr, "\n");
+ }
+}
+
+struct my_va_list {
+# ifdef __ARM_ARCH_ISA_A64
+ void *stack;
+ void *gr_top;
+ void *vr_top;
+ int gr_offs;
+ int vr_offs;
+# else
+ unsigned int gp_offset;
+ unsigned int fp_offset;
+ void *overflow_arg_area;
+ void *reg_save_area;
+# endif
+};
+
+__attribute__((noinline, no_sanitize("memory"))) void printva(const void *p,
+ int line) {
+ my_va_list *pp = (my_va_list *)p;
+# ifdef __ARM_ARCH_ISA_A64
+ fprintf(stderr,
+ "\nva %p at line %d: stack : %p\n gr_top: %p\n vr_top: %p\n gr_offs: "
+ "%d\n "
+ "vr_offs: %d\n",
+ p, line, pp->stack, pp->gr_top, pp->vr_top, pp->gr_offs, pp->vr_offs);
+
+ printb((char *)pp->gr_top + pp->gr_offs, -pp->gr_offs, __LINE__, 8);
+ printb((char *)pp->vr_top + pp->vr_offs, -pp->vr_offs, __LINE__, 16);
+ printb((char *)pp->stack, 256, __LINE__, 8);
+# else
+ fprintf(stderr,
+ "\nva %p at line %d:\n gp_offset: %u\n fp_offset: %u\n "
+ "overflow_arg_area: %p\n reg_save_area: %p\n\n",
+ p, line, pp->gp_offset, pp->fp_offset, pp->overflow_arg_area,
+ pp->reg_save_area);
+
+ printb((char *)pp->reg_save_area + pp->gp_offset,
+ pp->fp_offset - pp->gp_offset, __LINE__, 8);
+ printb((char *)pp->reg_save_area + pp->fp_offset, 128, __LINE__, 16);
+ printb((char *)pp->overflow_arg_area, 256, __LINE__, 8);
+# endif
+}
+
+__attribute__((noinline, no_sanitize("memory"))) void printtls(int line) {
+ uint8_t tmp[kMsanParamTlsSize];
+ for (int i = 0; i < kMsanParamTlsSize; ++i)
+ tmp[i] = __msan_va_arg_tls[i];
+ fprintf(stderr, "\nTLS at line %d: ", line);
+ for (int i = 0; i < kMsanParamTlsSize;) {
+ fprintf(stderr, "\n");
+ for (int j = 0; j < 16; ++i, ++j)
+ fprintf(stderr, "%02x ", tmp[i]);
+ }
+
+ fprintf(stderr, "\n");
+}
+#endif
+
+const int kMsanParamTlsSize = 800;
+extern "C" __thread uint8_t __msan_va_arg_tls[];
+
+struct IntInt {
+ int a;
+ int b;
+};
+
+struct Int64Int64 {
+ int64_t a;
+ int64_t b;
+};
+
+struct DoubleDouble {
+ double a;
+ double b;
+};
+
+struct Double4 {
+ double a[4];
+};
+
+struct DoubleFloat {
+ double a;
+ float b;
+};
+
+struct LongDouble2 {
+ long double a[2];
+};
+
+struct LongDouble4 {
+ long double a[4];
+};
+
+template <class T>
+__attribute__((noinline)) void print_shadow(va_list &args, int n,
+ const char *function) {
+ for (int i = 0; i < n; i++) {
+ // 1-based to make it different from clean shadow.
+ fprintf(stderr, "\nArgShadow fn:%s n:%d i:%02x ", function, n, i + 1);
+ T arg_int = va_arg(args, T);
+ if (__msan_test_shadow(&arg_int, sizeof(arg_int)))
+ fprintf(stderr, "fale[clean] %02x", i + 1);
----------------
thurstond wrote:
Is "fale" a typo?
https://github.com/llvm/llvm-project/pull/72612
More information about the llvm-commits
mailing list