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 70 static char *buf, *cur, *end; 71 void 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 82 void 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 95 void 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 106 void fn1() { 107 buffered_write("a\n", 2); 108 } 109 110 void fn2() { 111 buffered_write("a\n", 2); 112 } 113 114 void fn3() { 115 buffered_write("a\n", 2); 116 } 117 118 int 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