| // RUN: %clangxx_msan -fsanitize-memory-track-origins -O0 %s -o %t && not %run %t >%t.out 2>&1 |
| // RUN: FileCheck %s < %t.out && FileCheck %s < %t.out |
| // RUN: %clangxx_msan -fsanitize-memory-track-origins -O3 %s -o %t && not %run %t >%t.out 2>&1 |
| // RUN: FileCheck %s < %t.out && FileCheck %s < %t.out |
| |
| // Test origin propagation through insertvalue IR instruction. |
| |
| #include <stdio.h> |
| #include <stdint.h> |
| |
| struct mypair { |
| int64_t x; |
| int y; |
| }; |
| |
| mypair my_make_pair(int64_t x, int y) { |
| mypair p; |
| p.x = x; |
| p.y = y; |
| return p; |
| } |
| |
| int main() { |
| int64_t * volatile p = new int64_t; |
| mypair z = my_make_pair(*p, 0); |
| if (z.x) |
| printf("zzz\n"); |
| // CHECK: MemorySanitizer: use-of-uninitialized-value |
| // CHECK: {{in main .*insertvalue_origin.cpp:}}[[@LINE-3]] |
| |
| // CHECK: Uninitialized value was created by a heap allocation |
| // CHECK: {{in main .*insertvalue_origin.cpp:}}[[@LINE-8]] |
| delete p; |
| return 0; |
| } |