1 //===-- sanitizer_common_test.cc ------------------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file is a part of ThreadSanitizer/AddressSanitizer runtime.
12 //===----------------------------------------------------------------------===//
13 #include "sanitizer_common/sanitizer_allocator_internal.h"
14 #include "sanitizer_common/sanitizer_common.h"
15 #include "sanitizer_common/sanitizer_flags.h"
16 #include "sanitizer_common/sanitizer_libc.h"
17 #include "sanitizer_common/sanitizer_platform.h"
18 #include "gtest/gtest.h"
20 namespace __sanitizer
{
22 static bool IsSorted(const uptr
*array
, uptr n
) {
23 for (uptr i
= 1; i
< n
; i
++) {
24 if (array
[i
] < array
[i
- 1]) return false;
29 TEST(SanitizerCommon
, SortTest
) {
33 for (uptr i
= 0; i
< n
; i
++) {
37 EXPECT_TRUE(IsSorted(array
, n
));
39 for (uptr i
= 0; i
< n
; i
++) {
43 EXPECT_TRUE(IsSorted(array
, n
));
45 for (uptr i
= 0; i
< n
; i
++) {
46 array
[i
] = (i
% 2 == 0) ? i
: n
- 1 - i
;
49 EXPECT_TRUE(IsSorted(array
, n
));
51 for (uptr i
= 0; i
< n
; i
++) {
55 EXPECT_TRUE(IsSorted(array
, n
));
56 // All but one sorted.
57 for (uptr i
= 0; i
< n
- 1; i
++) {
62 EXPECT_TRUE(IsSorted(array
, n
));
63 // Minimal case - sort three elements.
67 EXPECT_TRUE(IsSorted(array
, 2));
70 TEST(SanitizerCommon
, MmapAlignedOrDie
) {
71 uptr PageSize
= GetPageSizeCached();
72 for (uptr size
= 1; size
<= 32; size
*= 2) {
73 for (uptr alignment
= 1; alignment
<= 32; alignment
*= 2) {
74 for (int iter
= 0; iter
< 100; iter
++) {
75 uptr res
= (uptr
)MmapAlignedOrDie(
76 size
* PageSize
, alignment
* PageSize
, "MmapAlignedOrDieTest");
77 EXPECT_EQ(0U, res
% (alignment
* PageSize
));
78 internal_memset((void*)res
, 1, size
* PageSize
);
79 UnmapOrDie((void*)res
, size
* PageSize
);
86 TEST(SanitizerCommon
, SanitizerSetThreadName
) {
87 const char *names
[] = {
90 "012345678901234", // Larger names will be truncated on linux.
93 for (size_t i
= 0; i
< ARRAY_SIZE(names
); i
++) {
94 EXPECT_TRUE(SanitizerSetThreadName(names
[i
]));
96 EXPECT_TRUE(SanitizerGetThreadName(buff
, sizeof(buff
) - 1));
97 EXPECT_EQ(0, internal_strcmp(buff
, names
[i
]));
102 TEST(SanitizerCommon
, InternalMmapVector
) {
103 InternalMmapVector
<uptr
> vector(1);
104 for (uptr i
= 0; i
< 100; i
++) {
105 EXPECT_EQ(i
, vector
.size());
108 for (uptr i
= 0; i
< 100; i
++) {
109 EXPECT_EQ(i
, vector
[i
]);
111 for (int i
= 99; i
>= 0; i
--) {
112 EXPECT_EQ((uptr
)i
, vector
.back());
114 EXPECT_EQ((uptr
)i
, vector
.size());
116 InternalMmapVector
<uptr
> empty_vector(0);
117 CHECK_GT(empty_vector
.capacity(), 0U);
118 CHECK_EQ(0U, empty_vector
.size());
121 void TestThreadInfo(bool main
) {
126 GetThreadStackAndTls(main
, &stk_addr
, &stk_size
, &tls_addr
, &tls_size
);
129 EXPECT_NE(stk_addr
, (uptr
)0);
130 EXPECT_NE(stk_size
, (uptr
)0);
131 EXPECT_GT((uptr
)&stack_var
, stk_addr
);
132 EXPECT_LT((uptr
)&stack_var
, stk_addr
+ stk_size
);
134 #if SANITIZER_LINUX && defined(__x86_64__)
135 static __thread
int thread_var
;
136 EXPECT_NE(tls_addr
, (uptr
)0);
137 EXPECT_NE(tls_size
, (uptr
)0);
138 EXPECT_GT((uptr
)&thread_var
, tls_addr
);
139 EXPECT_LT((uptr
)&thread_var
, tls_addr
+ tls_size
);
141 // Ensure that tls and stack do not intersect.
142 uptr tls_end
= tls_addr
+ tls_size
;
143 EXPECT_TRUE(tls_addr
< stk_addr
|| tls_addr
>= stk_addr
+ stk_size
);
144 EXPECT_TRUE(tls_end
< stk_addr
|| tls_end
>= stk_addr
+ stk_size
);
145 EXPECT_TRUE((tls_addr
< stk_addr
) == (tls_end
< stk_addr
));
149 static void *WorkerThread(void *arg
) {
150 TestThreadInfo(false);
154 TEST(SanitizerCommon
, ThreadStackTlsMain
) {
156 TestThreadInfo(true);
159 TEST(SanitizerCommon
, ThreadStackTlsWorker
) {
162 pthread_create(&t
, 0, WorkerThread
, 0);
166 bool UptrLess(uptr a
, uptr b
) {
170 TEST(SanitizerCommon
, InternalBinarySearch
) {
171 static const uptr kSize
= 5;
173 for (uptr i
= 0; i
< kSize
; i
++) arr
[i
] = i
* i
;
175 for (uptr i
= 0; i
< kSize
; i
++)
176 ASSERT_EQ(InternalBinarySearch(arr
, 0, kSize
, i
* i
, UptrLess
), i
);
178 ASSERT_EQ(InternalBinarySearch(arr
, 0, kSize
, 7, UptrLess
), kSize
+ 1);
181 #if SANITIZER_LINUX && !SANITIZER_ANDROID
182 TEST(SanitizerCommon
, FindPathToBinary
) {
183 char *true_path
= FindPathToBinary("true");
184 EXPECT_NE((char*)0, internal_strstr(true_path
, "/bin/true"));
185 InternalFree(true_path
);
186 EXPECT_EQ(0, FindPathToBinary("unexisting_binary.ergjeorj"));
190 TEST(SanitizerCommon
, StripPathPrefix
) {
191 EXPECT_EQ(0, StripPathPrefix(0, "prefix"));
192 EXPECT_STREQ("foo", StripPathPrefix("foo", 0));
193 EXPECT_STREQ("dir/file.cc",
194 StripPathPrefix("/usr/lib/dir/file.cc", "/usr/lib/"));
195 EXPECT_STREQ("/file.cc", StripPathPrefix("/usr/myroot/file.cc", "/myroot"));
196 EXPECT_STREQ("file.h", StripPathPrefix("/usr/lib/./file.h", "/usr/lib/"));
199 TEST(SanitizerCommon
, InternalScopedString
) {
200 InternalScopedString
str(10);
201 EXPECT_EQ(0U, str
.length());
202 EXPECT_STREQ("", str
.data());
205 EXPECT_EQ(3U, str
.length());
206 EXPECT_STREQ("foo", str
.data());
210 EXPECT_EQ(7U, str
.length());
211 EXPECT_STREQ("foo1234", str
.data());
214 EXPECT_EQ(9U, str
.length());
215 EXPECT_STREQ("foo123412", str
.data());
218 EXPECT_EQ(0U, str
.length());
219 EXPECT_STREQ("", str
.data());
221 str
.append("0123456789");
222 EXPECT_EQ(9U, str
.length());
223 EXPECT_STREQ("012345678", str
.data());
226 TEST(SanitizerCommon
, PrintSourceLocation
) {
227 InternalScopedString
str(128);
228 PrintSourceLocation(&str
, "/dir/file.cc", 10, 5);
229 EXPECT_STREQ("/dir/file.cc:10:5", str
.data());
232 PrintSourceLocation(&str
, "/dir/file.cc", 11, 0);
233 EXPECT_STREQ("/dir/file.cc:11", str
.data());
236 PrintSourceLocation(&str
, "/dir/file.cc", 0, 0);
237 EXPECT_STREQ("/dir/file.cc", str
.data());
239 // Check that we strip file prefix if necessary.
240 const char *old_strip_path_prefix
= common_flags()->strip_path_prefix
;
241 common_flags()->strip_path_prefix
= "/dir/";
243 PrintSourceLocation(&str
, "/dir/file.cc", 10, 5);
244 EXPECT_STREQ("file.cc:10:5", str
.data());
245 common_flags()->strip_path_prefix
= old_strip_path_prefix
;
248 TEST(SanitizerCommon
, PrintModuleAndOffset
) {
249 InternalScopedString
str(128);
250 PrintModuleAndOffset(&str
, "/dir/exe", 0x123);
251 EXPECT_STREQ("(/dir/exe+0x123)", str
.data());
253 // Check that we strip file prefix if necessary.
254 const char *old_strip_path_prefix
= common_flags()->strip_path_prefix
;
255 common_flags()->strip_path_prefix
= "/dir/";
257 PrintModuleAndOffset(&str
, "/dir/exe", 0x123);
258 EXPECT_STREQ("(exe+0x123)", str
.data());
259 common_flags()->strip_path_prefix
= old_strip_path_prefix
;
262 } // namespace __sanitizer