// This test program creates a very large number of unique histories. // Heap origin. // RUN: %clangxx_msan -fsanitize-memory-track-origins=2 -O3 %s -o %t // RUN: MSAN_OPTIONS=origin_history_size=7 not %run %t >%t.out 2>&1 // RUN: FileCheck %s --check-prefix=CHECK7 < %t.out // RUN: MSAN_OPTIONS=origin_history_size=2 not %run %t >%t.out 2>&1 // RUN: FileCheck %s --check-prefix=CHECK2 < %t.out // RUN: MSAN_OPTIONS=origin_history_per_stack_limit=1 not %run %t >%t.out 2>&1 // RUN: FileCheck %s --check-prefix=CHECK-PER-STACK < %t.out // RUN: MSAN_OPTIONS=origin_history_size=7,origin_history_per_stack_limit=0 not %run %t >%t.out 2>&1 // RUN: FileCheck %s --check-prefix=CHECK7 < %t.out // Stack origin. // RUN: %clangxx_msan -DSTACK -fsanitize-memory-track-origins=2 -O3 %s -o %t // RUN: MSAN_OPTIONS=origin_history_size=7 not %run %t >%t.out 2>&1 // RUN: FileCheck %s --check-prefix=CHECK7 < %t.out // RUN: MSAN_OPTIONS=origin_history_size=2 not %run %t >%t.out 2>&1 // RUN: FileCheck %s --check-prefix=CHECK2 < %t.out // RUN: MSAN_OPTIONS=origin_history_per_stack_limit=1 not %run %t >%t.out 2>&1 // RUN: FileCheck %s --check-prefix=CHECK-PER-STACK < %t.out // RUN: MSAN_OPTIONS=origin_history_size=7,origin_history_per_stack_limit=0 not %run %t >%t.out 2>&1 // RUN: FileCheck %s --check-prefix=CHECK7 < %t.out // Heap origin, with calls. // RUN: %clangxx_msan -mllvm -msan-instrumentation-with-call-threshold=0 -fsanitize-memory-track-origins=2 -O3 %s -o %t // RUN: MSAN_OPTIONS=origin_history_size=7 not %run %t >%t.out 2>&1 // RUN: FileCheck %s --check-prefix=CHECK7 < %t.out // RUN: MSAN_OPTIONS=origin_history_size=2 not %run %t >%t.out 2>&1 // RUN: FileCheck %s --check-prefix=CHECK2 < %t.out // RUN: MSAN_OPTIONS=origin_history_per_stack_limit=1 not %run %t >%t.out 2>&1 // RUN: FileCheck %s --check-prefix=CHECK-PER-STACK < %t.out // RUN: MSAN_OPTIONS=origin_history_size=7,origin_history_per_stack_limit=0 not %run %t >%t.out 2>&1 // RUN: FileCheck %s --check-prefix=CHECK7 < %t.out // Stack origin, with calls. // RUN: %clangxx_msan -DSTACK -mllvm -msan-instrumentation-with-call-threshold=0 -fsanitize-memory-track-origins=2 -O3 %s -o %t // RUN: MSAN_OPTIONS=origin_history_size=7 not %run %t >%t.out 2>&1 // RUN: FileCheck %s --check-prefix=CHECK7 < %t.out // RUN: MSAN_OPTIONS=origin_history_size=2 not %run %t >%t.out 2>&1 // RUN: FileCheck %s --check-prefix=CHECK2 < %t.out // RUN: MSAN_OPTIONS=origin_history_per_stack_limit=1 not %run %t >%t.out 2>&1 // RUN: FileCheck %s --check-prefix=CHECK-PER-STACK < %t.out // RUN: MSAN_OPTIONS=origin_history_size=7,origin_history_per_stack_limit=0 not %run %t >%t.out 2>&1 // RUN: FileCheck %s --check-prefix=CHECK7 < %t.out #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> static char *buf, *cur, *end; void init() { buf = new char[1000]; #ifdef STACK char stackbuf[1000]; char *volatile p = stackbuf; memcpy(buf, p, 1000); #endif cur = buf; end = buf + 1000; } void line_flush() { char *p; for (p = cur - 1; p >= buf; --p) if (*p == '\n') break; if (p >= buf) { size_t write_sz = p - buf + 1; // write(2, buf, write_sz); memmove(buf, p + 1, end - p - 1); cur -= write_sz; } } void buffered_write(const char *p, size_t sz) { while (sz > 0) { size_t copy_sz = end - cur; if (sz < copy_sz) copy_sz = sz; memcpy(cur, p, copy_sz); cur += copy_sz; sz -= copy_sz; line_flush(); } } void fn1() { buffered_write("a\n", 2); } void fn2() { buffered_write("a\n", 2); } void fn3() { buffered_write("a\n", 2); } int main(void) { init(); for (int i = 0; i < 2000; ++i) { fn1(); fn2(); fn3(); } return buf[50]; } // CHECK7: WARNING: MemorySanitizer: use-of-uninitialized-value // CHECK7-NOT: Uninitialized value was stored to memory at // CHECK7: Uninitialized value was stored to memory at // CHECK7-NOT: Uninitialized value was stored to memory at // CHECK7: Uninitialized value was stored to memory at // CHECK7-NOT: Uninitialized value was stored to memory at // CHECK7: Uninitialized value was stored to memory at // CHECK7-NOT: Uninitialized value was stored to memory at // CHECK7: Uninitialized value was stored to memory at // CHECK7-NOT: Uninitialized value was stored to memory at // CHECK7: Uninitialized value was stored to memory at // CHECK7-NOT: Uninitialized value was stored to memory at // CHECK7: Uninitialized value was stored to memory at // CHECK7-NOT: Uninitialized value was stored to memory at // CHECK7: Uninitialized value was created // CHECK2: WARNING: MemorySanitizer: use-of-uninitialized-value // CHECK2-NOT: Uninitialized value was stored to memory at // CHECK2: Uninitialized value was stored to memory at // CHECK2-NOT: Uninitialized value was stored to memory at // CHECK2: Uninitialized value was created // CHECK-PER-STACK: WARNING: MemorySanitizer: use-of-uninitialized-value // CHECK-PER-STACK: Uninitialized value was stored to memory at // CHECK-PER-STACK: in fn3 // CHECK-PER-STACK: Uninitialized value was stored to memory at // CHECK-PER-STACK: in fn2 // CHECK-PER-STACK: Uninitialized value was stored to memory at // CHECK-PER-STACK: in fn1 // CHECK-PER-STACK: Uninitialized value was created // CHECK-UNLIMITED: WARNING: MemorySanitizer: use-of-uninitialized-value // CHECK-UNLIMITED: Uninitialized value was stored to memory at // CHECK-UNLIMITED: Uninitialized value was stored to memory at // CHECK-UNLIMITED: Uninitialized value was stored to memory at // CHECK-UNLIMITED: Uninitialized value was stored to memory at // CHECK-UNLIMITED: Uninitialized value was stored to memory at // CHECK-UNLIMITED: Uninitialized value was stored to memory at // CHECK-UNLIMITED: Uninitialized value was stored to memory at // CHECK-UNLIMITED: Uninitialized value was stored to memory at // CHECK-UNLIMITED: Uninitialized value was stored to memory at // CHECK-UNLIMITED: Uninitialized value was stored to memory at // CHECK-UNLIMITED: Uninitialized value was stored to memory at // CHECK-UNLIMITED: Uninitialized value was stored to memory at // CHECK-UNLIMITED: Uninitialized value was stored to memory at // CHECK-UNLIMITED: Uninitialized value was stored to memory at // CHECK-UNLIMITED: Uninitialized value was stored to memory at // CHECK-UNLIMITED: Uninitialized value was stored to memory at // CHECK-UNLIMITED: Uninitialized value was stored to memory at // CHECK-UNLIMITED: Uninitialized value was stored to memory at // CHECK-UNLIMITED: Uninitialized value was created