59 lines · cpp
1// RUN: %clangxx_msan -fno-sanitize-memory-param-retval -fsanitize-memory-track-origins=2 -DOFFSET=0 -O3 %s -o %t && \2// RUN: not %run %t >%t.out 2>&13// RUN: FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-Z1 --check-prefix=CHECK-%short-stack < %t.out4 5// RUN: %clangxx_msan -fno-sanitize-memory-param-retval -fsanitize-memory-track-origins=2 -DOFFSET=10 -O3 %s -o %t && \6// RUN: not %run %t >%t.out 2>&17// RUN: FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-Z2 --check-prefix=CHECK-%short-stack < %t.out8 9// 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 && \10// RUN: not %run %t >%t.out 2>&111// RUN: FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-Z1 --check-prefix=CHECK-%short-stack < %t.out12 13// 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 && \14// RUN: not %run %t >%t.out 2>&115// RUN: FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-Z2 --check-prefix=CHECK-%short-stack < %t.out16 17#include <stdio.h>18#include <string.h>19 20int xx[10000];21volatile int idx = 30;22 23__attribute__((noinline)) void fn_g(int a, int b) {24 xx[idx + OFFSET] = OFFSET == 0 ? a : b;25}26 27__attribute__((noinline)) void fn_f(int a, int b) {28 fn_g(a, b);29}30 31__attribute__((noinline)) void fn_h() {32 memmove(&xx[25], &xx, 7500);33}34 35int main(int argc, char *argv[]) {36 int volatile z1;37 int volatile z2;38 fn_f(z1, z2);39 fn_h();40 return xx[25 + idx + OFFSET];41}42 43// CHECK: WARNING: MemorySanitizer: use-of-uninitialized-value44// CHECK: {{#0 .* in main .*chained_origin_memmove.cpp:}}[[@LINE-4]]45 46// CHECK: Uninitialized value was stored to memory at47// CHECK-FULL-STACK: {{#1 .* in fn_h.*chained_origin_memmove.cpp:}}[[@LINE-15]]48// CHECK-SHORT-STACK: {{#0 .* in __msan_memmove.*msan_interceptors.cpp:}}49 50// CHECK: Uninitialized value was stored to memory at51// CHECK-FULL-STACK: {{#0 .* in fn_g.*chained_origin_memmove.cpp:}}[[@LINE-27]]52// CHECK-FULL-STACK: {{#1 .* in fn_f.*chained_origin_memmove.cpp:}}[[@LINE-24]]53// CHECK-SHORT-STACK: {{#0 .* in fn_g.*chained_origin_memmove.cpp:}}[[@LINE-29]]54 55// CHECK-Z1: Uninitialized value was created by an allocation of 'z1' in the stack frame56// CHECK-Z2: Uninitialized value was created by an allocation of 'z2' in the stack frame57// CHECK-Z1: {{#0 .* in main.*chained_origin_memmove.cpp:}}[[@LINE-21]]58// CHECK-Z2: {{#0 .* in main.*chained_origin_memmove.cpp:}}[[@LINE-21]]59