xref: /llvm-project/compiler-rt/test/msan/chained_origin_memcpy.cpp (revision 15805c030f31b8d112ee4a4706ff4f5725c794df)
1*15805c03SVitaly Buka // RUN: %clangxx_msan -fno-sanitize-memory-param-retval -fsanitize-memory-track-origins=2 -DOFFSET=0 -O3 %s -o %t && \
2d21b3d34SFangrui Song // RUN:     not %run %t >%t.out 2>&1
3d21b3d34SFangrui Song // RUN: FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-Z1 --check-prefix=CHECK-%short-stack < %t.out
4d21b3d34SFangrui Song 
5*15805c03SVitaly Buka // RUN: %clangxx_msan -fno-sanitize-memory-param-retval -fsanitize-memory-track-origins=2 -DOFFSET=10 -O3 %s -o %t && \
6d21b3d34SFangrui Song // RUN:     not %run %t >%t.out 2>&1
7d21b3d34SFangrui Song // RUN: FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-Z2 --check-prefix=CHECK-%short-stack < %t.out
8d21b3d34SFangrui Song 
9*15805c03SVitaly Buka // RUN: %clangxx_msan -fno-sanitize-memory-param-retval -mllvm -msan-instrumentation-with-call-threshold=0 -fsanitize-memory-track-origins=2 -DOFFSET=0 -O3 %s -o %t && \
10d21b3d34SFangrui Song // RUN:     not %run %t >%t.out 2>&1
11d21b3d34SFangrui Song // RUN: FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-Z1 --check-prefix=CHECK-%short-stack < %t.out
12d21b3d34SFangrui Song 
13*15805c03SVitaly Buka // RUN: %clangxx_msan -fno-sanitize-memory-param-retval -mllvm -msan-instrumentation-with-call-threshold=0 -fsanitize-memory-track-origins=2 -DOFFSET=10 -O3 %s -o %t && \
14d21b3d34SFangrui Song // RUN:     not %run %t >%t.out 2>&1
15d21b3d34SFangrui Song // RUN: FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-Z2 --check-prefix=CHECK-%short-stack < %t.out
16d21b3d34SFangrui Song 
17d21b3d34SFangrui Song #include <stdio.h>
18d21b3d34SFangrui Song #include <string.h>
19d21b3d34SFangrui Song 
20d21b3d34SFangrui Song int xx[10000];
21d21b3d34SFangrui Song int yy[10000];
22d21b3d34SFangrui Song volatile int idx = 30;
23d21b3d34SFangrui Song 
24d21b3d34SFangrui Song __attribute__((noinline))
fn_g(int a,int b)25d21b3d34SFangrui Song void fn_g(int a, int b) {
26d21b3d34SFangrui Song   xx[idx] = a; xx[idx + 10] = b;
27d21b3d34SFangrui Song }
28d21b3d34SFangrui Song 
29d21b3d34SFangrui Song __attribute__((noinline))
fn_f(int a,int b)30d21b3d34SFangrui Song void fn_f(int a, int b) {
31d21b3d34SFangrui Song   fn_g(a, b);
32d21b3d34SFangrui Song }
33d21b3d34SFangrui Song 
34d21b3d34SFangrui Song __attribute__((noinline))
fn_h()35d21b3d34SFangrui Song void fn_h() {
36d21b3d34SFangrui Song   memcpy(&yy, &xx, sizeof(xx));
37d21b3d34SFangrui Song }
38d21b3d34SFangrui Song 
main(int argc,char * argv[])39d21b3d34SFangrui Song int main(int argc, char *argv[]) {
40d21b3d34SFangrui Song   int volatile z1;
41d21b3d34SFangrui Song   int volatile z2;
42d21b3d34SFangrui Song   fn_f(z1, z2);
43d21b3d34SFangrui Song   fn_h();
44d21b3d34SFangrui Song   return yy[idx + OFFSET];
45d21b3d34SFangrui Song }
46d21b3d34SFangrui Song 
47d21b3d34SFangrui Song // CHECK: WARNING: MemorySanitizer: use-of-uninitialized-value
48d21b3d34SFangrui Song // CHECK: {{#0 .* in main .*chained_origin_memcpy.cpp:}}[[@LINE-4]]
49d21b3d34SFangrui Song 
50d21b3d34SFangrui Song // CHECK: Uninitialized value was stored to memory at
51d21b3d34SFangrui Song // CHECK-FULL-STACK: {{#1 .* in fn_h.*chained_origin_memcpy.cpp:}}[[@LINE-15]]
52d21b3d34SFangrui Song // CHECK-SHORT-STACK: {{#0 .* in __msan_memcpy.*msan_interceptors.cpp:}}
53d21b3d34SFangrui Song 
54d21b3d34SFangrui Song // CHECK: Uninitialized value was stored to memory at
55d21b3d34SFangrui Song // CHECK-FULL-STACK: {{#0 .* in fn_g.*chained_origin_memcpy.cpp:}}[[@LINE-29]]
56d21b3d34SFangrui Song // CHECK-FULL-STACK: {{#1 .* in fn_f.*chained_origin_memcpy.cpp:}}[[@LINE-25]]
57d21b3d34SFangrui Song // CHECK-SHORT-STACK: {{#0 .* in fn_g.*chained_origin_memcpy.cpp:}}[[@LINE-31]]
58d21b3d34SFangrui Song 
59057cabd9SKevin Athey // CHECK-Z1: Uninitialized value was created by an allocation of 'z1' in the stack frame
60057cabd9SKevin Athey // CHECK-Z2: Uninitialized value was created by an allocation of 'z2' in the stack frame
61d7a47a9bSKevin Athey // CHECK-Z1: {{#0 .* in main.*chained_origin_memcpy.cpp:}}[[@LINE-21]]
62d7a47a9bSKevin Athey // CHECK-Z2: {{#0 .* in main.*chained_origin_memcpy.cpp:}}[[@LINE-21]]
63