1 // RUN: %clangxx_msan -fsanitize-memory-track-origins=2 -O3 %s -o %t && \
2 // RUN:     not %run %t >%t.out 2>&1
3 // RUN: FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-STACK < %t.out
4 
5 // RUN: %clangxx_msan -fsanitize-memory-track-origins=2 -DHEAP=1 -O3 %s -o %t && \
6 // RUN:     not %run %t >%t.out 2>&1
7 // RUN: FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-HEAP < %t.out
8 
9 
10 // RUN: %clangxx_msan -mllvm -msan-instrumentation-with-call-threshold=0 -fsanitize-memory-track-origins=2 -O3 %s -o %t && \
11 // RUN:     not %run %t >%t.out 2>&1
12 // RUN: FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-STACK < %t.out
13 
14 // RUN: %clangxx_msan -mllvm -msan-instrumentation-with-call-threshold=0 -fsanitize-memory-track-origins=2 -DHEAP=1 -O3 %s -o %t && \
15 // RUN:     not %run %t >%t.out 2>&1
16 // RUN: FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-HEAP < %t.out
17 
18 
19 #include <stdio.h>
20 
21 volatile int x, y;
22 
23 __attribute__((noinline))
fn_g(int a)24 void fn_g(int a) {
25   x = a;
26 }
27 
28 __attribute__((noinline))
fn_f(int a)29 void fn_f(int a) {
30   fn_g(a);
31 }
32 
33 __attribute__((noinline))
fn_h()34 void fn_h() {
35   y = x;
36 }
37 
main(int argc,char * argv[])38 int main(int argc, char *argv[]) {
39 #ifdef HEAP
40   int * volatile zz = new int;
41   int z = *zz;
42 #else
43   int volatile z;
44 #endif
45   fn_f(z);
46   fn_h();
47   return y;
48 }
49 
50 // CHECK: WARNING: MemorySanitizer: use-of-uninitialized-value
51 // CHECK: {{#0 .* in main.*chained_origin.cc:47}}
52 
53 // CHECK: Uninitialized value was stored to memory at
54 // CHECK: {{#0 .* in fn_h.*chained_origin.cc:35}}
55 // CHECK: {{#1 .* in main.*chained_origin.cc:46}}
56 
57 // CHECK: Uninitialized value was stored to memory at
58 // CHECK: {{#0 .* in fn_g.*chained_origin.cc:25}}
59 // CHECK: {{#1 .* in fn_f.*chained_origin.cc:30}}
60 // CHECK: {{#2 .* in main.*chained_origin.cc:45}}
61 
62 // CHECK-STACK: Uninitialized value was created by an allocation of 'z' in the stack frame of function 'main'
63 // CHECK-STACK: {{#0 .* in main.*chained_origin.cc:38}}
64 
65 // CHECK-HEAP: Uninitialized value was created by a heap allocation
66 // CHECK-HEAP: {{#1 .* in main.*chained_origin.cc:40}}
67