1// This test program creates a very large number of unique histories. 2 3// Heap origin. 4// RUN: %clangxx_msan -fsanitize-memory-track-origins=2 -O3 %s -o %t 5 6// RUN: MSAN_OPTIONS=origin_history_size=7 not %run %t >%t.out 2>&1 7// RUN: FileCheck %s --check-prefix=CHECK7 < %t.out 8 9// RUN: MSAN_OPTIONS=origin_history_size=2 not %run %t >%t.out 2>&1 10// RUN: FileCheck %s --check-prefix=CHECK2 < %t.out 11 12// RUN: MSAN_OPTIONS=origin_history_per_stack_limit=1 not %run %t >%t.out 2>&1 13// RUN: FileCheck %s --check-prefix=CHECK-PER-STACK < %t.out 14 15// RUN: MSAN_OPTIONS=origin_history_size=7,origin_history_per_stack_limit=0 not %run %t >%t.out 2>&1 16// RUN: FileCheck %s --check-prefix=CHECK7 < %t.out 17 18// Stack origin. 19// RUN: %clangxx_msan -DSTACK -fsanitize-memory-track-origins=2 -O3 %s -o %t 20 21// RUN: MSAN_OPTIONS=origin_history_size=7 not %run %t >%t.out 2>&1 22// RUN: FileCheck %s --check-prefix=CHECK7 < %t.out 23 24// RUN: MSAN_OPTIONS=origin_history_size=2 not %run %t >%t.out 2>&1 25// RUN: FileCheck %s --check-prefix=CHECK2 < %t.out 26 27// RUN: MSAN_OPTIONS=origin_history_per_stack_limit=1 not %run %t >%t.out 2>&1 28// RUN: FileCheck %s --check-prefix=CHECK-PER-STACK < %t.out 29 30// RUN: MSAN_OPTIONS=origin_history_size=7,origin_history_per_stack_limit=0 not %run %t >%t.out 2>&1 31// RUN: FileCheck %s --check-prefix=CHECK7 < %t.out 32 33 34// Heap origin, with calls. 35// RUN: %clangxx_msan -mllvm -msan-instrumentation-with-call-threshold=0 -fsanitize-memory-track-origins=2 -O3 %s -o %t 36 37// RUN: MSAN_OPTIONS=origin_history_size=7 not %run %t >%t.out 2>&1 38// RUN: FileCheck %s --check-prefix=CHECK7 < %t.out 39 40// RUN: MSAN_OPTIONS=origin_history_size=2 not %run %t >%t.out 2>&1 41// RUN: FileCheck %s --check-prefix=CHECK2 < %t.out 42 43// RUN: MSAN_OPTIONS=origin_history_per_stack_limit=1 not %run %t >%t.out 2>&1 44// RUN: FileCheck %s --check-prefix=CHECK-PER-STACK < %t.out 45 46// RUN: MSAN_OPTIONS=origin_history_size=7,origin_history_per_stack_limit=0 not %run %t >%t.out 2>&1 47// RUN: FileCheck %s --check-prefix=CHECK7 < %t.out 48 49 50// Stack origin, with calls. 51// RUN: %clangxx_msan -DSTACK -mllvm -msan-instrumentation-with-call-threshold=0 -fsanitize-memory-track-origins=2 -O3 %s -o %t 52 53// RUN: MSAN_OPTIONS=origin_history_size=7 not %run %t >%t.out 2>&1 54// RUN: FileCheck %s --check-prefix=CHECK7 < %t.out 55 56// RUN: MSAN_OPTIONS=origin_history_size=2 not %run %t >%t.out 2>&1 57// RUN: FileCheck %s --check-prefix=CHECK2 < %t.out 58 59// RUN: MSAN_OPTIONS=origin_history_per_stack_limit=1 not %run %t >%t.out 2>&1 60// RUN: FileCheck %s --check-prefix=CHECK-PER-STACK < %t.out 61 62// RUN: MSAN_OPTIONS=origin_history_size=7,origin_history_per_stack_limit=0 not %run %t >%t.out 2>&1 63// RUN: FileCheck %s --check-prefix=CHECK7 < %t.out 64 65#include <stdio.h> 66#include <stdlib.h> 67#include <string.h> 68#include <unistd.h> 69 70static char *buf, *cur, *end; 71void init() { 72 buf = new char[1000]; 73#ifdef STACK 74 char stackbuf[1000]; 75 char *volatile p = stackbuf; 76 memcpy(buf, p, 1000); 77#endif 78 cur = buf; 79 end = buf + 1000; 80} 81 82void line_flush() { 83 char *p; 84 for (p = cur - 1; p >= buf; --p) 85 if (*p == '\n') 86 break; 87 if (p >= buf) { 88 size_t write_sz = p - buf + 1; 89 // write(2, buf, write_sz); 90 memmove(buf, p + 1, end - p - 1); 91 cur -= write_sz; 92 } 93} 94 95void buffered_write(const char *p, size_t sz) { 96 while (sz > 0) { 97 size_t copy_sz = end - cur; 98 if (sz < copy_sz) copy_sz = sz; 99 memcpy(cur, p, copy_sz); 100 cur += copy_sz; 101 sz -= copy_sz; 102 line_flush(); 103 } 104} 105 106void fn1() { 107 buffered_write("a\n", 2); 108} 109 110void fn2() { 111 buffered_write("a\n", 2); 112} 113 114void fn3() { 115 buffered_write("a\n", 2); 116} 117 118int main(void) { 119 init(); 120 for (int i = 0; i < 2000; ++i) { 121 fn1(); 122 fn2(); 123 fn3(); 124 } 125 return buf[50]; 126} 127 128// CHECK7: WARNING: MemorySanitizer: use-of-uninitialized-value 129// CHECK7-NOT: Uninitialized value was stored to memory at 130// CHECK7: Uninitialized value was stored to memory at 131// CHECK7-NOT: Uninitialized value was stored to memory at 132// CHECK7: Uninitialized value was stored to memory at 133// CHECK7-NOT: Uninitialized value was stored to memory at 134// CHECK7: Uninitialized value was stored to memory at 135// CHECK7-NOT: Uninitialized value was stored to memory at 136// CHECK7: Uninitialized value was stored to memory at 137// CHECK7-NOT: Uninitialized value was stored to memory at 138// CHECK7: Uninitialized value was stored to memory at 139// CHECK7-NOT: Uninitialized value was stored to memory at 140// CHECK7: Uninitialized value was stored to memory at 141// CHECK7-NOT: Uninitialized value was stored to memory at 142// CHECK7: Uninitialized value was created 143 144// CHECK2: WARNING: MemorySanitizer: use-of-uninitialized-value 145// CHECK2-NOT: Uninitialized value was stored to memory at 146// CHECK2: Uninitialized value was stored to memory at 147// CHECK2-NOT: Uninitialized value was stored to memory at 148// CHECK2: Uninitialized value was created 149 150// CHECK-PER-STACK: WARNING: MemorySanitizer: use-of-uninitialized-value 151// CHECK-PER-STACK: Uninitialized value was stored to memory at 152// CHECK-PER-STACK: in fn3 153// CHECK-PER-STACK: Uninitialized value was stored to memory at 154// CHECK-PER-STACK: in fn2 155// CHECK-PER-STACK: Uninitialized value was stored to memory at 156// CHECK-PER-STACK: in fn1 157// CHECK-PER-STACK: Uninitialized value was created 158 159// CHECK-UNLIMITED: WARNING: MemorySanitizer: use-of-uninitialized-value 160// CHECK-UNLIMITED: Uninitialized value was stored to memory at 161// CHECK-UNLIMITED: Uninitialized value was stored to memory at 162// CHECK-UNLIMITED: Uninitialized value was stored to memory at 163// CHECK-UNLIMITED: Uninitialized value was stored to memory at 164// CHECK-UNLIMITED: Uninitialized value was stored to memory at 165// CHECK-UNLIMITED: Uninitialized value was stored to memory at 166// CHECK-UNLIMITED: Uninitialized value was stored to memory at 167// CHECK-UNLIMITED: Uninitialized value was stored to memory at 168// CHECK-UNLIMITED: Uninitialized value was stored to memory at 169// CHECK-UNLIMITED: Uninitialized value was stored to memory at 170// CHECK-UNLIMITED: Uninitialized value was stored to memory at 171// CHECK-UNLIMITED: Uninitialized value was stored to memory at 172// CHECK-UNLIMITED: Uninitialized value was stored to memory at 173// CHECK-UNLIMITED: Uninitialized value was stored to memory at 174// CHECK-UNLIMITED: Uninitialized value was stored to memory at 175// CHECK-UNLIMITED: Uninitialized value was stored to memory at 176// CHECK-UNLIMITED: Uninitialized value was stored to memory at 177// CHECK-UNLIMITED: Uninitialized value was stored to memory at 178// CHECK-UNLIMITED: Uninitialized value was created 179