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