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