xref: /aosp_15_r20/external/compiler-rt/test/msan/chained_origin.cc (revision 7c3d14c8b49c529e04be81a3ce6f5cc23712e4c6)
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 Robot void 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 Robot void 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 Robot void fn_h() {
35*7c3d14c8STreehugger Robot   y = x;
36*7c3d14c8STreehugger Robot }
37*7c3d14c8STreehugger Robot 
main(int argc,char * argv[])38*7c3d14c8STreehugger Robot int 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