1*d21b3d34SFangrui Song // RUN: %clangxx_msan -O0 %s -o %t && %run %t >%t.out 2>&1 2*d21b3d34SFangrui Song // RUN: %clangxx_msan -O1 %s -o %t && %run %t >%t.out 2>&1 3*d21b3d34SFangrui Song // RUN: %clangxx_msan -O2 %s -o %t && %run %t >%t.out 2>&1 4*d21b3d34SFangrui Song // RUN: %clangxx_msan -O3 %s -o %t && %run %t >%t.out 2>&1 5*d21b3d34SFangrui Song 6*d21b3d34SFangrui Song // RUN: %clangxx_msan -O0 %s -o %t -DCHECK_IN_F && %run %t >%t.out 2>&1 7*d21b3d34SFangrui Song // RUN: %clangxx_msan -O1 %s -o %t -DCHECK_IN_F && %run %t >%t.out 2>&1 8*d21b3d34SFangrui Song // RUN: %clangxx_msan -O2 %s -o %t -DCHECK_IN_F && %run %t >%t.out 2>&1 9*d21b3d34SFangrui Song // RUN: %clangxx_msan -O3 %s -o %t -DCHECK_IN_F && %run %t >%t.out 2>&1 10*d21b3d34SFangrui Song 11*d21b3d34SFangrui Song // Test that (no_sanitize_memory) functions 12*d21b3d34SFangrui Song // * don't check shadow values (-DCHECK_IN_F) 13*d21b3d34SFangrui Song // * treat all values loaded from memory as fully initialized (-UCHECK_IN_F) 14*d21b3d34SFangrui Song 15*d21b3d34SFangrui Song #include <stdlib.h> 16*d21b3d34SFangrui Song #include <stdio.h> 17*d21b3d34SFangrui Song 18*d21b3d34SFangrui Song __attribute__((noinline)) 19*d21b3d34SFangrui Song __attribute__((no_sanitize_memory)) f(void)20*d21b3d34SFangrui Songint f(void) { 21*d21b3d34SFangrui Song int x; 22*d21b3d34SFangrui Song int * volatile p = &x; 23*d21b3d34SFangrui Song #ifdef CHECK_IN_F 24*d21b3d34SFangrui Song if (*p) 25*d21b3d34SFangrui Song exit(0); 26*d21b3d34SFangrui Song #endif 27*d21b3d34SFangrui Song return *p; 28*d21b3d34SFangrui Song } 29*d21b3d34SFangrui Song main(void)30*d21b3d34SFangrui Songint main(void) { 31*d21b3d34SFangrui Song if (f()) 32*d21b3d34SFangrui Song exit(0); 33*d21b3d34SFangrui Song return 0; 34*d21b3d34SFangrui Song } 35