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;
init()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 
line_flush()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 
buffered_write(const char * p,size_t sz)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 
fn1()106 void fn1() {
107   buffered_write("a\n", 2);
108 }
109 
fn2()110 void fn2() {
111   buffered_write("a\n", 2);
112 }
113 
fn3()114 void fn3() {
115   buffered_write("a\n", 2);
116 }
117 
main(void)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