xref: /llvm-project/compiler-rt/test/msan/insertvalue_origin.cpp (revision 15805c030f31b8d112ee4a4706ff4f5725c794df)
1d21b3d34SFangrui Song // RUN: %clangxx_msan -fsanitize-memory-track-origins -O0 %s -o %t && not %run %t >%t.out 2>&1
2d21b3d34SFangrui Song // RUN: FileCheck %s < %t.out && FileCheck %s < %t.out
3d21b3d34SFangrui Song // RUN: %clangxx_msan -fsanitize-memory-track-origins -O3 %s -o %t && not %run %t >%t.out 2>&1
4d21b3d34SFangrui Song // RUN: FileCheck %s < %t.out && FileCheck %s < %t.out
5d21b3d34SFangrui Song 
6d21b3d34SFangrui Song // Test origin propagation through insertvalue IR instruction.
7d21b3d34SFangrui Song 
8d21b3d34SFangrui Song #include <stdio.h>
9d21b3d34SFangrui Song #include <stdint.h>
10d21b3d34SFangrui Song 
11d21b3d34SFangrui Song struct mypair {
12d21b3d34SFangrui Song  int64_t x;
13d21b3d34SFangrui Song  int y;
14d21b3d34SFangrui Song };
15d21b3d34SFangrui Song 
my_make_pair(int64_t & x,int y)16*15805c03SVitaly Buka mypair my_make_pair(int64_t &x, int y) {
17d21b3d34SFangrui Song  mypair p;
18d21b3d34SFangrui Song  p.x = x;
19d21b3d34SFangrui Song  p.y = y;
20d21b3d34SFangrui Song  return p;
21d21b3d34SFangrui Song }
22d21b3d34SFangrui Song 
main()23d21b3d34SFangrui Song int main() {
24d21b3d34SFangrui Song  int64_t * volatile p = new int64_t;
25d21b3d34SFangrui Song  mypair z = my_make_pair(*p, 0);
26d21b3d34SFangrui Song  if (z.x)
27d21b3d34SFangrui Song    printf("zzz\n");
28d21b3d34SFangrui Song  // CHECK: MemorySanitizer: use-of-uninitialized-value
29d21b3d34SFangrui Song  // CHECK: {{in main .*insertvalue_origin.cpp:}}[[@LINE-3]]
30d21b3d34SFangrui Song 
31d21b3d34SFangrui Song  // CHECK: Uninitialized value was created by a heap allocation
32d21b3d34SFangrui Song  // CHECK: {{in main .*insertvalue_origin.cpp:}}[[@LINE-8]]
33d21b3d34SFangrui Song  delete p;
34d21b3d34SFangrui Song  return 0;
35d21b3d34SFangrui Song }
36