1 //===-- tsan_flags_test.cc ------------------------------------------------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file is a part of ThreadSanitizer (TSan), a race detector.
11 //
12 //===----------------------------------------------------------------------===//
13 #include "tsan_flags.h"
14 #include "tsan_rtl.h"
15 #include "gtest/gtest.h"
16 #include <string>
17
18 namespace __tsan {
19
TEST(Flags,Basic)20 TEST(Flags, Basic) {
21 // At least should not crash.
22 Flags f;
23 InitializeFlags(&f, 0);
24 InitializeFlags(&f, "");
25 }
26
TEST(Flags,DefaultValues)27 TEST(Flags, DefaultValues) {
28 Flags f;
29
30 f.enable_annotations = false;
31 f.exitcode = -11;
32 InitializeFlags(&f, "");
33 EXPECT_EQ(66, f.exitcode);
34 EXPECT_EQ(true, f.enable_annotations);
35 }
36
37 static const char *options1 =
38 " enable_annotations=0"
39 " suppress_equal_stacks=0"
40 " suppress_equal_addresses=0"
41 " suppress_java=0"
42 " report_bugs=0"
43 " report_thread_leaks=0"
44 " report_destroy_locked=0"
45 " report_mutex_bugs=0"
46 " report_signal_unsafe=0"
47 " report_atomic_races=0"
48 " force_seq_cst_atomics=0"
49 " suppressions=qwerty"
50 " print_suppressions=0"
51 " print_benign=0"
52 " exitcode=111"
53 " halt_on_error=0"
54 " atexit_sleep_ms=222"
55 " profile_memory=qqq"
56 " flush_memory_ms=444"
57 " flush_symbolizer_ms=555"
58 " memory_limit_mb=666"
59 " stop_on_start=0"
60 " running_on_valgrind=0"
61 " history_size=5"
62 " io_sync=1"
63 " die_after_fork=true"
64
65 " symbolize=0"
66 " external_symbolizer_path=asdfgh"
67 " allow_addr2line=true"
68 " strip_path_prefix=zxcvb"
69 " fast_unwind_on_fatal=0"
70 " fast_unwind_on_malloc=0"
71 " handle_ioctl=0"
72 " malloc_context_size=777"
73 " log_path=aaa"
74 " verbosity=2"
75 " detect_leaks=0"
76 " leak_check_at_exit=0"
77 " allocator_may_return_null=0"
78 " print_summary=0"
79 " legacy_pthread_cond=0"
80 "";
81
82 static const char *options2 =
83 " enable_annotations=true"
84 " suppress_equal_stacks=true"
85 " suppress_equal_addresses=true"
86 " suppress_java=true"
87 " report_bugs=true"
88 " report_thread_leaks=true"
89 " report_destroy_locked=true"
90 " report_mutex_bugs=true"
91 " report_signal_unsafe=true"
92 " report_atomic_races=true"
93 " force_seq_cst_atomics=true"
94 " suppressions=aaaaa"
95 " print_suppressions=true"
96 " print_benign=true"
97 " exitcode=222"
98 " halt_on_error=true"
99 " atexit_sleep_ms=123"
100 " profile_memory=bbbbb"
101 " flush_memory_ms=234"
102 " flush_symbolizer_ms=345"
103 " memory_limit_mb=456"
104 " stop_on_start=true"
105 " running_on_valgrind=true"
106 " history_size=6"
107 " io_sync=2"
108 " die_after_fork=false"
109
110 " symbolize=true"
111 " external_symbolizer_path=cccccc"
112 " allow_addr2line=false"
113 " strip_path_prefix=ddddddd"
114 " fast_unwind_on_fatal=true"
115 " fast_unwind_on_malloc=true"
116 " handle_ioctl=true"
117 " malloc_context_size=567"
118 " log_path=eeeeeee"
119 " verbosity=0"
120 " detect_leaks=true"
121 " leak_check_at_exit=true"
122 " allocator_may_return_null=true"
123 " print_summary=true"
124 " legacy_pthread_cond=true"
125 "";
126
VerifyOptions1(Flags * f)127 void VerifyOptions1(Flags *f) {
128 EXPECT_EQ(f->enable_annotations, 0);
129 EXPECT_EQ(f->suppress_equal_stacks, 0);
130 EXPECT_EQ(f->suppress_equal_addresses, 0);
131 EXPECT_EQ(f->suppress_java, 0);
132 EXPECT_EQ(f->report_bugs, 0);
133 EXPECT_EQ(f->report_thread_leaks, 0);
134 EXPECT_EQ(f->report_destroy_locked, 0);
135 EXPECT_EQ(f->report_mutex_bugs, 0);
136 EXPECT_EQ(f->report_signal_unsafe, 0);
137 EXPECT_EQ(f->report_atomic_races, 0);
138 EXPECT_EQ(f->force_seq_cst_atomics, 0);
139 EXPECT_EQ(f->suppressions, std::string("qwerty"));
140 EXPECT_EQ(f->print_suppressions, 0);
141 EXPECT_EQ(f->print_benign, 0);
142 EXPECT_EQ(f->exitcode, 111);
143 EXPECT_EQ(f->halt_on_error, 0);
144 EXPECT_EQ(f->atexit_sleep_ms, 222);
145 EXPECT_EQ(f->profile_memory, std::string("qqq"));
146 EXPECT_EQ(f->flush_memory_ms, 444);
147 EXPECT_EQ(f->flush_symbolizer_ms, 555);
148 EXPECT_EQ(f->memory_limit_mb, 666);
149 EXPECT_EQ(f->stop_on_start, 0);
150 EXPECT_EQ(f->running_on_valgrind, 0);
151 EXPECT_EQ(f->history_size, 5);
152 EXPECT_EQ(f->io_sync, 1);
153 EXPECT_EQ(f->die_after_fork, true);
154
155 EXPECT_EQ(f->symbolize, 0);
156 EXPECT_EQ(f->external_symbolizer_path, std::string("asdfgh"));
157 EXPECT_EQ(f->allow_addr2line, true);
158 EXPECT_EQ(f->strip_path_prefix, std::string("zxcvb"));
159 EXPECT_EQ(f->fast_unwind_on_fatal, 0);
160 EXPECT_EQ(f->fast_unwind_on_malloc, 0);
161 EXPECT_EQ(f->handle_ioctl, 0);
162 EXPECT_EQ(f->malloc_context_size, 777);
163 EXPECT_EQ(f->log_path, std::string("aaa"));
164 EXPECT_EQ(f->verbosity, 2);
165 EXPECT_EQ(f->detect_leaks, 0);
166 EXPECT_EQ(f->leak_check_at_exit, 0);
167 EXPECT_EQ(f->allocator_may_return_null, 0);
168 EXPECT_EQ(f->print_summary, 0);
169 EXPECT_EQ(f->legacy_pthread_cond, false);
170 }
171
VerifyOptions2(Flags * f)172 void VerifyOptions2(Flags *f) {
173 EXPECT_EQ(f->enable_annotations, true);
174 EXPECT_EQ(f->suppress_equal_stacks, true);
175 EXPECT_EQ(f->suppress_equal_addresses, true);
176 EXPECT_EQ(f->suppress_java, true);
177 EXPECT_EQ(f->report_bugs, true);
178 EXPECT_EQ(f->report_thread_leaks, true);
179 EXPECT_EQ(f->report_destroy_locked, true);
180 EXPECT_EQ(f->report_mutex_bugs, true);
181 EXPECT_EQ(f->report_signal_unsafe, true);
182 EXPECT_EQ(f->report_atomic_races, true);
183 EXPECT_EQ(f->force_seq_cst_atomics, true);
184 EXPECT_EQ(f->suppressions, std::string("aaaaa"));
185 EXPECT_EQ(f->print_suppressions, true);
186 EXPECT_EQ(f->print_benign, true);
187 EXPECT_EQ(f->exitcode, 222);
188 EXPECT_EQ(f->halt_on_error, true);
189 EXPECT_EQ(f->atexit_sleep_ms, 123);
190 EXPECT_EQ(f->profile_memory, std::string("bbbbb"));
191 EXPECT_EQ(f->flush_memory_ms, 234);
192 EXPECT_EQ(f->flush_symbolizer_ms, 345);
193 EXPECT_EQ(f->memory_limit_mb, 456);
194 EXPECT_EQ(f->stop_on_start, true);
195 EXPECT_EQ(f->running_on_valgrind, true);
196 EXPECT_EQ(f->history_size, 6);
197 EXPECT_EQ(f->io_sync, 2);
198 EXPECT_EQ(f->die_after_fork, false);
199
200 EXPECT_EQ(f->symbolize, true);
201 EXPECT_EQ(f->external_symbolizer_path, std::string("cccccc"));
202 EXPECT_EQ(f->allow_addr2line, false);
203 EXPECT_EQ(f->strip_path_prefix, std::string("ddddddd"));
204 EXPECT_EQ(f->fast_unwind_on_fatal, true);
205 EXPECT_EQ(f->fast_unwind_on_malloc, true);
206 EXPECT_EQ(f->handle_ioctl, true);
207 EXPECT_EQ(f->malloc_context_size, 567);
208 EXPECT_EQ(f->log_path, std::string("eeeeeee"));
209 EXPECT_EQ(f->verbosity, 0);
210 EXPECT_EQ(f->detect_leaks, true);
211 EXPECT_EQ(f->leak_check_at_exit, true);
212 EXPECT_EQ(f->allocator_may_return_null, true);
213 EXPECT_EQ(f->print_summary, true);
214 EXPECT_EQ(f->legacy_pthread_cond, true);
215 }
216
217 static const char *test_default_options;
__tsan_default_options()218 extern "C" const char *__tsan_default_options() {
219 return test_default_options;
220 }
221
TEST(Flags,ParseDefaultOptions)222 TEST(Flags, ParseDefaultOptions) {
223 Flags f;
224
225 test_default_options = options1;
226 InitializeFlags(&f, "");
227 VerifyOptions1(&f);
228
229 test_default_options = options2;
230 InitializeFlags(&f, "");
231 VerifyOptions2(&f);
232 }
233
TEST(Flags,ParseEnvOptions)234 TEST(Flags, ParseEnvOptions) {
235 Flags f;
236
237 InitializeFlags(&f, options1);
238 VerifyOptions1(&f);
239
240 InitializeFlags(&f, options2);
241 VerifyOptions2(&f);
242 }
243
TEST(Flags,ParsePriority)244 TEST(Flags, ParsePriority) {
245 Flags f;
246
247 test_default_options = options2;
248 InitializeFlags(&f, options1);
249 VerifyOptions1(&f);
250
251 test_default_options = options1;
252 InitializeFlags(&f, options2);
253 VerifyOptions2(&f);
254 }
255
256 } // namespace __tsan
257