Home | History | Annotate | Download | only in msan
      1 // ParamTLS has limited size. Everything that does not fit is considered fully
      2 // initialized.
      3 
      4 // RUN: %clangxx_msan -O0 %s -o %t && %run %t
      5 // RUN: %clangxx_msan -fsanitize-memory-track-origins -O0 %s -o %t && %run %t
      6 // RUN: %clangxx_msan -fsanitize-memory-track-origins=2 -O0 %s -o %t && %run %t
      7 //
      8 // AArch64 fails with:
      9 // void f801(S<801>): Assertion `__msan_test_shadow(&s, sizeof(s)) == -1' failed
     10 // XFAIL: aarch64
     11 
     12 #include <sanitizer/msan_interface.h>
     13 #include <assert.h>
     14 
     15 // This test assumes that ParamTLS size is 800 bytes.
     16 
     17 // This test passes poisoned values through function argument list.
     18 // In case of overflow, argument is unpoisoned.
     19 #define OVERFLOW(x) assert(__msan_test_shadow(&x, sizeof(x)) == -1)
     20 // In case of no overflow, it is still poisoned.
     21 #define NO_OVERFLOW(x) assert(__msan_test_shadow(&x, sizeof(x)) == 0)
     22 
     23 template<int N>
     24 struct S {
     25   char x[N];
     26 };
     27 
     28 void f100(S<100> s) {
     29   NO_OVERFLOW(s);
     30 }
     31 
     32 void f800(S<800> s) {
     33   NO_OVERFLOW(s);
     34 }
     35 
     36 void f801(S<801> s) {
     37   OVERFLOW(s);
     38 }
     39 
     40 void f1000(S<1000> s) {
     41   OVERFLOW(s);
     42 }
     43 
     44 void f_many(int a, double b, S<800> s, int c, double d) {
     45   NO_OVERFLOW(a);
     46   NO_OVERFLOW(b);
     47   OVERFLOW(s);
     48   OVERFLOW(c);
     49   OVERFLOW(d);
     50 }
     51 
     52 // -8 bytes for "int a", aligned by 8
     53 // -2 to make "int c" a partial fit
     54 void f_many2(int a, S<800 - 8 - 2> s, int c, double d) {
     55   NO_OVERFLOW(a);
     56   NO_OVERFLOW(s);
     57   OVERFLOW(c);
     58   OVERFLOW(d);
     59 }
     60 
     61 int main(void) {
     62   S<100> s100;
     63   S<800> s800;
     64   S<801> s801;
     65   S<1000> s1000;
     66   f100(s100);
     67   f800(s800);
     68   f801(s801);
     69   f1000(s1000);
     70 
     71   int i;
     72   double d;
     73   f_many(i, d, s800, i, d);
     74 
     75   S<800 - 8 - 2> s788;
     76   f_many2(i, s788, i, d);
     77   return 0;
     78 }
     79