1 //===-- msan_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 MemorySanitizer.
12 // MemorySanitizer unit tests.
13 //===----------------------------------------------------------------------===//
15 #ifndef MSAN_EXTERNAL_TEST_CONFIG
16 #include "msan_test_config.h"
17 #endif // MSAN_EXTERNAL_TEST_CONFIG
19 #include "sanitizer_common/tests/sanitizer_test_utils.h"
21 #include "sanitizer/allocator_interface.h"
22 #include "sanitizer/msan_interface.h"
24 #if defined(__FreeBSD__)
25 # define _KERNEL // To declare 'shminfo' structure.
29 // <sys/shm.h> doesn't declare these functions in _KERNEL mode.
30 void *shmat(int, const void *, int);
31 int shmget(key_t
, size_t, int);
32 int shmctl(int, int, struct shmid_ds
*);
33 int shmdt(const void *);
44 #include <arpa/inet.h>
52 #include <sys/types.h>
55 #include <sys/resource.h>
56 #include <sys/ioctl.h>
57 #include <sys/statvfs.h>
58 #include <sys/utsname.h>
62 #include <sys/socket.h>
68 #if !defined(__FreeBSD__)
70 # include <sys/sysinfo.h>
73 # include <netinet/ether.h>
76 # include <netinet/in.h>
77 # include <pthread_np.h>
79 # include <sys/mount.h>
80 # include <sys/sysctl.h>
81 # include <net/ethernet.h>
82 # define f_namelen f_namemax // FreeBSD names this statfs field so.
83 # define cpu_set_t cpuset_t
85 // FreeBSD's <ssp/string.h> defines mempcpy() to be a macro expanding into
86 // a __builtin___mempcpy_chk() call, but since Msan RTL defines it as an
87 // ordinary function, we can declare it here to complete the tests.
88 void *mempcpy(void *dest
, const void *src
, size_t n
);
92 #if defined(__i386__) || defined(__x86_64__)
93 # include <emmintrin.h>
94 # define MSAN_HAS_M128 1
96 # define MSAN_HAS_M128 0
100 # include <immintrin.h>
103 // On FreeBSD procfs is not enabled by default.
104 #if defined(__FreeBSD__)
105 # define FILE_TO_READ "/bin/cat"
106 # define DIR_TO_READ "/bin"
107 # define SUBFILE_TO_READ "cat"
108 # define SYMLINK_TO_READ "/usr/bin/tar"
109 # define SUPERUSER_GROUP "wheel"
111 # define FILE_TO_READ "/proc/self/stat"
112 # define DIR_TO_READ "/proc/self"
113 # define SUBFILE_TO_READ "stat"
114 # define SYMLINK_TO_READ "/proc/self/exe"
115 # define SUPERUSER_GROUP "root"
118 static uintptr_t GetPageSize() {
119 return sysconf(_SC_PAGESIZE
);
122 const size_t kMaxPathLength
= 4096;
124 typedef unsigned char U1
;
125 typedef unsigned short U2
; // NOLINT
126 typedef unsigned int U4
;
127 typedef unsigned long long U8
; // NOLINT
128 typedef signed char S1
;
129 typedef signed short S2
; // NOLINT
130 typedef signed int S4
;
131 typedef signed long long S8
; // NOLINT
132 #define NOINLINE __attribute__((noinline))
133 #define INLINE __attribute__((always_inline))
135 static bool TrackingOrigins() {
137 __msan_set_origin(&x
, sizeof(x
), 0x1234);
138 U4 origin
= __msan_get_origin(&x
);
139 __msan_set_origin(&x
, sizeof(x
), 0);
140 return __msan_origin_is_descendant_or_same(origin
, 0x1234);
143 #define EXPECT_ORIGIN(expected, origin) \
144 EXPECT_TRUE(__msan_origin_is_descendant_or_same((origin), (expected)))
146 #define EXPECT_UMR(action) \
148 __msan_set_expect_umr(1); \
150 __msan_set_expect_umr(0); \
153 #define EXPECT_UMR_O(action, origin) \
155 __msan_set_expect_umr(1); \
157 __msan_set_expect_umr(0); \
158 if (TrackingOrigins()) EXPECT_ORIGIN(origin, __msan_get_umr_origin()); \
161 #define EXPECT_POISONED(x) ExpectPoisoned(x)
164 void ExpectPoisoned(const T
& t
) {
165 EXPECT_NE(-1, __msan_test_shadow((void*)&t
, sizeof(t
)));
168 #define EXPECT_POISONED_O(x, origin) \
169 ExpectPoisonedWithOrigin(x, origin)
172 void ExpectPoisonedWithOrigin(const T
& t
, unsigned origin
) {
173 EXPECT_NE(-1, __msan_test_shadow((void*)&t
, sizeof(t
)));
174 if (TrackingOrigins()) EXPECT_ORIGIN(origin
, __msan_get_origin((void *)&t
));
177 #define EXPECT_NOT_POISONED(x) EXPECT_EQ(true, TestForNotPoisoned((x)))
180 bool TestForNotPoisoned(const T
& t
) {
181 return __msan_test_shadow((void*)&t
, sizeof(t
)) == -1;
184 static U8 poisoned_array
[100];
186 T
*GetPoisoned(int i
= 0, T val
= 0) {
187 T
*res
= (T
*)&poisoned_array
[i
];
189 __msan_poison(&poisoned_array
[i
], sizeof(T
));
194 T
*GetPoisonedO(int i
, U4 origin
, T val
= 0) {
195 T
*res
= (T
*)&poisoned_array
[i
];
197 __msan_poison(&poisoned_array
[i
], sizeof(T
));
198 __msan_set_origin(&poisoned_array
[i
], sizeof(T
), origin
);
203 T
Poisoned(T v
= 0, T s
= (T
)(-1)) {
204 __msan_partial_poison(&v
, &s
, sizeof(T
));
208 template<class T
> NOINLINE T
ReturnPoisoned() { return *GetPoisoned
<T
>(); }
210 static volatile int g_one
= 1;
211 static volatile int g_zero
= 0;
212 static volatile int g_0
= 0;
213 static volatile int g_1
= 1;
218 // Check that malloc poisons memory.
219 // A lot of tests below depend on this.
220 TEST(MemorySanitizerSanity
, PoisonInMalloc
) {
221 int *x
= (int*)malloc(sizeof(int));
226 TEST(MemorySanitizer
, NegativeTest1
) {
227 S4
*x
= GetPoisoned
<S4
>();
230 EXPECT_NOT_POISONED(*x
);
233 TEST(MemorySanitizer
, PositiveTest1
) {
235 EXPECT_POISONED(*GetPoisoned
<S1
>());
236 EXPECT_POISONED(*GetPoisoned
<S2
>());
237 EXPECT_POISONED(*GetPoisoned
<S4
>());
238 EXPECT_POISONED(*GetPoisoned
<S8
>());
241 EXPECT_POISONED(*GetPoisoned
<S1
>());
242 EXPECT_POISONED(*GetPoisoned
<S1
>());
243 EXPECT_POISONED(*GetPoisoned
<S1
>());
245 EXPECT_POISONED(*GetPoisoned
<S2
>());
246 EXPECT_POISONED(*GetPoisoned
<S2
>());
247 EXPECT_POISONED(*GetPoisoned
<S2
>());
249 EXPECT_POISONED(*GetPoisoned
<S4
>());
250 EXPECT_POISONED(*GetPoisoned
<S4
>());
251 EXPECT_POISONED(*GetPoisoned
<S4
>());
253 EXPECT_POISONED(*GetPoisoned
<S8
>());
254 EXPECT_POISONED(*GetPoisoned
<S8
>());
255 EXPECT_POISONED(*GetPoisoned
<S8
>());
258 EXPECT_POISONED(*GetPoisoned
<U1
>());
259 EXPECT_POISONED(*GetPoisoned
<U1
>());
260 EXPECT_POISONED(*GetPoisoned
<U1
>());
261 EXPECT_POISONED(*GetPoisoned
<U2
>());
262 EXPECT_POISONED(*GetPoisoned
<U2
>());
263 EXPECT_POISONED(*GetPoisoned
<U4
>());
266 EXPECT_POISONED(- *GetPoisoned
<S4
>());
268 EXPECT_UMR(a_s4
[g_zero
] = 100 / *GetPoisoned
<S4
>(0, 1));
271 a_s4
[g_zero
] = 1 - *GetPoisoned
<S4
>();
272 a_s4
[g_zero
] = 1 + *GetPoisoned
<S4
>();
275 TEST(MemorySanitizer
, Phi1
) {
278 c
= *GetPoisoned
<S4
>();
280 break_optimization(0);
286 TEST(MemorySanitizer
, Phi2
) {
287 S4 i
= *GetPoisoned
<S4
>();
289 EXPECT_UMR(for (; i
< g_one
; i
++););
293 NOINLINE
void Arg1ExpectUMR(S4 a1
) { EXPECT_POISONED(a1
); }
294 NOINLINE
void Arg2ExpectUMR(S4 a1
, S4 a2
) { EXPECT_POISONED(a2
); }
295 NOINLINE
void Arg3ExpectUMR(S1 a1
, S4 a2
, S8 a3
) { EXPECT_POISONED(a3
); }
297 TEST(MemorySanitizer
, ArgTest
) {
298 Arg1ExpectUMR(*GetPoisoned
<S4
>());
299 Arg2ExpectUMR(0, *GetPoisoned
<S4
>());
300 Arg3ExpectUMR(0, 1, *GetPoisoned
<S8
>());
304 TEST(MemorySanitizer
, CallAndRet
) {
305 ReturnPoisoned
<S1
>();
306 ReturnPoisoned
<S2
>();
307 ReturnPoisoned
<S4
>();
308 ReturnPoisoned
<S8
>();
310 EXPECT_POISONED(ReturnPoisoned
<S1
>());
311 EXPECT_POISONED(ReturnPoisoned
<S2
>());
312 EXPECT_POISONED(ReturnPoisoned
<S4
>());
313 EXPECT_POISONED(ReturnPoisoned
<S8
>());
316 // malloc() in the following test may be optimized to produce a compile-time
317 // undef value. Check that we trap on the volatile assignment anyway.
318 TEST(MemorySanitizer
, DISABLED_MallocNoIdent
) {
319 S4
*x
= (int*)malloc(sizeof(S4
));
324 TEST(MemorySanitizer
, Malloc
) {
325 S4
*x
= (int*)Ident(malloc(sizeof(S4
)));
330 TEST(MemorySanitizer
, Realloc
) {
331 S4
*x
= (int*)Ident(realloc(0, sizeof(S4
)));
332 EXPECT_POISONED(x
[0]);
334 x
= (int*)Ident(realloc(x
, 2 * sizeof(S4
)));
335 EXPECT_NOT_POISONED(x
[0]); // Ok, was inited before.
336 EXPECT_POISONED(x
[1]);
337 x
= (int*)Ident(realloc(x
, 3 * sizeof(S4
)));
338 EXPECT_NOT_POISONED(x
[0]); // Ok, was inited before.
339 EXPECT_POISONED(x
[2]);
340 EXPECT_POISONED(x
[1]);
341 x
[2] = 1; // Init this here. Check that after realloc it is poisoned again.
342 x
= (int*)Ident(realloc(x
, 2 * sizeof(S4
)));
343 EXPECT_NOT_POISONED(x
[0]); // Ok, was inited before.
344 EXPECT_POISONED(x
[1]);
345 x
= (int*)Ident(realloc(x
, 3 * sizeof(S4
)));
346 EXPECT_POISONED(x
[1]);
347 EXPECT_POISONED(x
[2]);
351 TEST(MemorySanitizer
, Calloc
) {
352 S4
*x
= (int*)Ident(calloc(1, sizeof(S4
)));
353 EXPECT_NOT_POISONED(*x
); // Should not be poisoned.
358 TEST(MemorySanitizer
, CallocReturnsZeroMem
) {
359 size_t sizes
[] = {16, 1000, 10000, 100000, 2100000};
360 for (size_t s
= 0; s
< sizeof(sizes
)/sizeof(sizes
[0]); s
++) {
361 size_t size
= sizes
[s
];
362 for (size_t iter
= 0; iter
< 5; iter
++) {
363 char *x
= Ident((char*)calloc(1, size
));
365 EXPECT_EQ(x
[size
- 1], 0);
366 EXPECT_EQ(x
[size
/ 2], 0);
367 EXPECT_EQ(x
[size
/ 3], 0);
368 EXPECT_EQ(x
[size
/ 4], 0);
369 memset(x
, 0x42, size
);
375 TEST(MemorySanitizer
, AndOr
) {
376 U4
*p
= GetPoisoned
<U4
>();
377 // We poison two bytes in the midle of a 4-byte word to make the test
378 // correct regardless of endianness.
381 EXPECT_NOT_POISONED(*p
& 0x00ffff00);
382 EXPECT_NOT_POISONED(*p
& 0x00ff0000);
383 EXPECT_NOT_POISONED(*p
& 0x0000ff00);
384 EXPECT_POISONED(*p
& 0xff000000);
385 EXPECT_POISONED(*p
& 0x000000ff);
386 EXPECT_POISONED(*p
& 0x0000ffff);
387 EXPECT_POISONED(*p
& 0xffff0000);
389 EXPECT_NOT_POISONED(*p
| 0xff0000ff);
390 EXPECT_NOT_POISONED(*p
| 0xff00ffff);
391 EXPECT_NOT_POISONED(*p
| 0xffff00ff);
392 EXPECT_POISONED(*p
| 0xff000000);
393 EXPECT_POISONED(*p
| 0x000000ff);
394 EXPECT_POISONED(*p
| 0x0000ffff);
395 EXPECT_POISONED(*p
| 0xffff0000);
397 EXPECT_POISONED(*GetPoisoned
<bool>() & *GetPoisoned
<bool>());
401 static bool applyNot(T value
, T shadow
) {
402 __msan_partial_poison(&value
, &shadow
, sizeof(T
));
406 TEST(MemorySanitizer
, Not
) {
407 EXPECT_NOT_POISONED(applyNot
<U4
>(0x0, 0x0));
408 EXPECT_NOT_POISONED(applyNot
<U4
>(0xFFFFFFFF, 0x0));
409 EXPECT_POISONED(applyNot
<U4
>(0xFFFFFFFF, 0xFFFFFFFF));
410 EXPECT_NOT_POISONED(applyNot
<U4
>(0xFF000000, 0x0FFFFFFF));
411 EXPECT_NOT_POISONED(applyNot
<U4
>(0xFF000000, 0x00FFFFFF));
412 EXPECT_NOT_POISONED(applyNot
<U4
>(0xFF000000, 0x0000FFFF));
413 EXPECT_NOT_POISONED(applyNot
<U4
>(0xFF000000, 0x00000000));
414 EXPECT_POISONED(applyNot
<U4
>(0xFF000000, 0xFF000000));
415 EXPECT_NOT_POISONED(applyNot
<U4
>(0xFF800000, 0xFF000000));
416 EXPECT_POISONED(applyNot
<U4
>(0x00008000, 0x00008000));
418 EXPECT_NOT_POISONED(applyNot
<U1
>(0x0, 0x0));
419 EXPECT_NOT_POISONED(applyNot
<U1
>(0xFF, 0xFE));
420 EXPECT_NOT_POISONED(applyNot
<U1
>(0xFF, 0x0));
421 EXPECT_POISONED(applyNot
<U1
>(0xFF, 0xFF));
423 EXPECT_POISONED(applyNot
<void*>((void*)0xFFFFFF, (void*)(-1)));
424 EXPECT_NOT_POISONED(applyNot
<void*>((void*)0xFFFFFF, (void*)(-2)));
427 TEST(MemorySanitizer
, Shift
) {
428 U4
*up
= GetPoisoned
<U4
>();
431 EXPECT_NOT_POISONED(*up
>> 30);
432 EXPECT_NOT_POISONED(*up
>> 24);
433 EXPECT_POISONED(*up
>> 23);
434 EXPECT_POISONED(*up
>> 10);
436 EXPECT_NOT_POISONED(*up
<< 30);
437 EXPECT_NOT_POISONED(*up
<< 24);
438 EXPECT_POISONED(*up
<< 23);
439 EXPECT_POISONED(*up
<< 10);
442 EXPECT_NOT_POISONED(*sp
>> 30);
443 EXPECT_NOT_POISONED(*sp
>> 24);
444 EXPECT_POISONED(*sp
>> 23);
445 EXPECT_POISONED(*sp
>> 10);
447 sp
= GetPoisoned
<S4
>();
450 EXPECT_POISONED(*sp
>> 31);
452 EXPECT_POISONED(100 >> *GetPoisoned
<S4
>());
453 EXPECT_POISONED(100U >> *GetPoisoned
<S4
>());
456 NOINLINE
static int GetPoisonedZero() {
459 __msan_poison(zero
, sizeof(*zero
));
465 TEST(MemorySanitizer
, LoadFromDirtyAddress
) {
468 EXPECT_UMR(break_optimization((void*)(U8
)a
[GetPoisonedZero()]));
472 TEST(MemorySanitizer
, StoreToDirtyAddress
) {
474 EXPECT_UMR(a
[GetPoisonedZero()] = 0);
475 break_optimization(a
);
480 NOINLINE
void StackTestFunc() {
487 break_optimization(&p4
);
488 break_optimization(&ok4
);
489 break_optimization(&p2
);
490 break_optimization(&ok2
);
491 break_optimization(&p1
);
492 break_optimization(&ok1
);
497 EXPECT_NOT_POISONED(ok1
);
498 EXPECT_NOT_POISONED(ok2
);
499 EXPECT_NOT_POISONED(ok4
);
502 TEST(MemorySanitizer
, StackTest
) {
506 NOINLINE
void StackStressFunc() {
508 break_optimization(foo
);
511 TEST(MemorySanitizer
, DISABLED_StackStressTest
) {
512 for (int i
= 0; i
< 1000000; i
++)
517 void TestFloatingPoint() {
520 break_optimization(&g
);
521 T
*x
= GetPoisoned
<T
>();
522 T
*y
= GetPoisoned
<T
>(1);
524 EXPECT_POISONED((long long)*x
);
525 EXPECT_POISONED((int)*x
);
532 TEST(MemorySanitizer
, FloatingPointTest
) {
533 TestFloatingPoint
<float>();
534 TestFloatingPoint
<double>();
537 TEST(MemorySanitizer
, DynMem
) {
539 S4
*y
= GetPoisoned
<S4
>();
540 memcpy(y
, &x
, g_one
* sizeof(S4
));
541 EXPECT_NOT_POISONED(*y
);
544 static char *DynRetTestStr
;
546 TEST(MemorySanitizer
, DynRet
) {
547 ReturnPoisoned
<S8
>();
548 EXPECT_NOT_POISONED(atoi("0"));
551 TEST(MemorySanitizer
, DynRet1
) {
552 ReturnPoisoned
<S8
>();
560 LargeStruct
LargeRetTest() {
562 res
.x
[0] = *GetPoisoned
<S4
>();
563 res
.x
[1] = *GetPoisoned
<S4
>();
564 res
.x
[2] = *GetPoisoned
<S4
>();
565 res
.x
[3] = *GetPoisoned
<S4
>();
566 res
.x
[4] = *GetPoisoned
<S4
>();
567 res
.x
[5] = *GetPoisoned
<S4
>();
568 res
.x
[6] = *GetPoisoned
<S4
>();
569 res
.x
[7] = *GetPoisoned
<S4
>();
570 res
.x
[8] = *GetPoisoned
<S4
>();
571 res
.x
[9] = *GetPoisoned
<S4
>();
575 TEST(MemorySanitizer
, strcmp
) {
578 strncpy(s1
, "foo", 10);
581 EXPECT_GT(strcmp(s1
, s2
), 0);
584 EXPECT_UMR(res
= strcmp(s1
, s2
));
585 EXPECT_NOT_POISONED(res
);
586 EXPECT_EQ(strncmp(s1
, s2
, 1), 0);
589 TEST(MemorySanitizer
, LargeRet
) {
590 LargeStruct a
= LargeRetTest();
591 EXPECT_POISONED(a
.x
[0]);
592 EXPECT_POISONED(a
.x
[9]);
595 TEST(MemorySanitizer
, strerror
) {
596 char *buf
= strerror(EINVAL
);
597 EXPECT_NOT_POISONED(strlen(buf
));
598 buf
= strerror(123456);
599 EXPECT_NOT_POISONED(strlen(buf
));
602 TEST(MemorySanitizer
, strerror_r
) {
605 char *res
= (char*) (size_t) strerror_r(EINVAL
, buf
, sizeof(buf
));
607 if (!res
) res
= buf
; // POSIX version success.
608 EXPECT_NOT_POISONED(strlen(res
));
611 TEST(MemorySanitizer
, fread
) {
612 char *x
= new char[32];
613 FILE *f
= fopen(FILE_TO_READ
, "r");
614 ASSERT_TRUE(f
!= NULL
);
616 EXPECT_NOT_POISONED(x
[0]);
617 EXPECT_NOT_POISONED(x
[16]);
618 EXPECT_NOT_POISONED(x
[31]);
623 TEST(MemorySanitizer
, read
) {
624 char *x
= new char[32];
625 int fd
= open(FILE_TO_READ
, O_RDONLY
);
627 int sz
= read(fd
, x
, 32);
629 EXPECT_NOT_POISONED(x
[0]);
630 EXPECT_NOT_POISONED(x
[16]);
631 EXPECT_NOT_POISONED(x
[31]);
636 TEST(MemorySanitizer
, pread
) {
637 char *x
= new char[32];
638 int fd
= open(FILE_TO_READ
, O_RDONLY
);
640 int sz
= pread(fd
, x
, 32, 0);
642 EXPECT_NOT_POISONED(x
[0]);
643 EXPECT_NOT_POISONED(x
[16]);
644 EXPECT_NOT_POISONED(x
[31]);
649 TEST(MemorySanitizer
, readv
) {
652 iov
[0].iov_base
= buf
+ 1;
654 iov
[1].iov_base
= buf
+ 10;
655 iov
[1].iov_len
= 2000;
656 int fd
= open(FILE_TO_READ
, O_RDONLY
);
658 int sz
= readv(fd
, iov
, 2);
660 ASSERT_LE(sz
, 5 + 2000);
661 ASSERT_GT((size_t)sz
, iov
[0].iov_len
);
662 EXPECT_POISONED(buf
[0]);
663 EXPECT_NOT_POISONED(buf
[1]);
664 EXPECT_NOT_POISONED(buf
[5]);
665 EXPECT_POISONED(buf
[6]);
666 EXPECT_POISONED(buf
[9]);
667 EXPECT_NOT_POISONED(buf
[10]);
668 EXPECT_NOT_POISONED(buf
[10 + (sz
- 1) - 5]);
669 EXPECT_POISONED(buf
[11 + (sz
- 1) - 5]);
673 TEST(MemorySanitizer
, preadv
) {
676 iov
[0].iov_base
= buf
+ 1;
678 iov
[1].iov_base
= buf
+ 10;
679 iov
[1].iov_len
= 2000;
680 int fd
= open(FILE_TO_READ
, O_RDONLY
);
682 int sz
= preadv(fd
, iov
, 2, 3);
684 ASSERT_LE(sz
, 5 + 2000);
685 ASSERT_GT((size_t)sz
, iov
[0].iov_len
);
686 EXPECT_POISONED(buf
[0]);
687 EXPECT_NOT_POISONED(buf
[1]);
688 EXPECT_NOT_POISONED(buf
[5]);
689 EXPECT_POISONED(buf
[6]);
690 EXPECT_POISONED(buf
[9]);
691 EXPECT_NOT_POISONED(buf
[10]);
692 EXPECT_NOT_POISONED(buf
[10 + (sz
- 1) - 5]);
693 EXPECT_POISONED(buf
[11 + (sz
- 1) - 5]);
698 TEST(MemorySanitizer
, DISABLED_ioctl
) {
700 EXPECT_EQ(ioctl(2, TIOCGWINSZ
, &ws
), 0);
701 EXPECT_NOT_POISONED(ws
.ws_col
);
704 TEST(MemorySanitizer
, readlink
) {
705 char *x
= new char[1000];
706 readlink(SYMLINK_TO_READ
, x
, 1000);
707 EXPECT_NOT_POISONED(x
[0]);
711 TEST(MemorySanitizer
, stat
) {
712 struct stat
* st
= new struct stat
;
713 int res
= stat(FILE_TO_READ
, st
);
715 EXPECT_NOT_POISONED(st
->st_dev
);
716 EXPECT_NOT_POISONED(st
->st_mode
);
717 EXPECT_NOT_POISONED(st
->st_size
);
720 TEST(MemorySanitizer
, fstatat
) {
721 struct stat
* st
= new struct stat
;
722 int dirfd
= open(DIR_TO_READ
, O_RDONLY
);
724 int res
= fstatat(dirfd
, SUBFILE_TO_READ
, st
, 0);
726 EXPECT_NOT_POISONED(st
->st_dev
);
727 EXPECT_NOT_POISONED(st
->st_mode
);
728 EXPECT_NOT_POISONED(st
->st_size
);
732 TEST(MemorySanitizer
, statfs
) {
734 int res
= statfs("/", &st
);
736 EXPECT_NOT_POISONED(st
.f_type
);
737 EXPECT_NOT_POISONED(st
.f_bfree
);
738 EXPECT_NOT_POISONED(st
.f_namelen
);
741 TEST(MemorySanitizer
, statvfs
) {
743 int res
= statvfs("/", &st
);
745 EXPECT_NOT_POISONED(st
.f_bsize
);
746 EXPECT_NOT_POISONED(st
.f_blocks
);
747 EXPECT_NOT_POISONED(st
.f_bfree
);
748 EXPECT_NOT_POISONED(st
.f_namemax
);
751 TEST(MemorySanitizer
, fstatvfs
) {
753 int fd
= open("/", O_RDONLY
| O_DIRECTORY
);
754 int res
= fstatvfs(fd
, &st
);
756 EXPECT_NOT_POISONED(st
.f_bsize
);
757 EXPECT_NOT_POISONED(st
.f_blocks
);
758 EXPECT_NOT_POISONED(st
.f_bfree
);
759 EXPECT_NOT_POISONED(st
.f_namemax
);
763 TEST(MemorySanitizer
, pipe
) {
764 int* pipefd
= new int[2];
765 int res
= pipe(pipefd
);
767 EXPECT_NOT_POISONED(pipefd
[0]);
768 EXPECT_NOT_POISONED(pipefd
[1]);
773 TEST(MemorySanitizer
, pipe2
) {
774 int* pipefd
= new int[2];
775 int res
= pipe2(pipefd
, O_NONBLOCK
);
777 EXPECT_NOT_POISONED(pipefd
[0]);
778 EXPECT_NOT_POISONED(pipefd
[1]);
783 TEST(MemorySanitizer
, socketpair
) {
785 int res
= socketpair(AF_UNIX
, SOCK_STREAM
, 0, sv
);
787 EXPECT_NOT_POISONED(sv
[0]);
788 EXPECT_NOT_POISONED(sv
[1]);
793 TEST(MemorySanitizer
, poll
) {
794 int* pipefd
= new int[2];
795 int res
= pipe(pipefd
);
799 res
= write(pipefd
[1], &data
, 1);
803 fds
[0].fd
= pipefd
[0];
804 fds
[0].events
= POLLIN
;
805 fds
[1].fd
= pipefd
[1];
806 fds
[1].events
= POLLIN
;
807 res
= poll(fds
, 2, 500);
809 EXPECT_NOT_POISONED(fds
[0].revents
);
810 EXPECT_NOT_POISONED(fds
[1].revents
);
816 // There is no ppoll() on FreeBSD.
817 #if !defined (__FreeBSD__)
818 TEST(MemorySanitizer
, ppoll
) {
819 int* pipefd
= new int[2];
820 int res
= pipe(pipefd
);
824 res
= write(pipefd
[1], &data
, 1);
828 fds
[0].fd
= pipefd
[0];
829 fds
[0].events
= POLLIN
;
830 fds
[1].fd
= pipefd
[1];
831 fds
[1].events
= POLLIN
;
834 res
= ppoll(fds
, 2, NULL
, &ss
);
836 EXPECT_NOT_POISONED(fds
[0].revents
);
837 EXPECT_NOT_POISONED(fds
[1].revents
);
844 TEST(MemorySanitizer
, poll_positive
) {
845 int* pipefd
= new int[2];
846 int res
= pipe(pipefd
);
850 fds
[0].fd
= pipefd
[0];
851 fds
[0].events
= POLLIN
;
852 // fds[1].fd uninitialized
853 fds
[1].events
= POLLIN
;
854 EXPECT_UMR(poll(fds
, 2, 0));
860 TEST(MemorySanitizer
, bind_getsockname
) {
861 int sock
= socket(AF_UNIX
, SOCK_STREAM
, 0);
863 struct sockaddr_in sai
;
864 memset(&sai
, 0, sizeof(sai
));
865 sai
.sin_family
= AF_UNIX
;
866 int res
= bind(sock
, (struct sockaddr
*)&sai
, sizeof(sai
));
871 EXPECT_UMR(getsockname(sock
, (struct sockaddr
*)&buf
, &addrlen
));
873 addrlen
= sizeof(buf
);
874 res
= getsockname(sock
, (struct sockaddr
*)&buf
, &addrlen
);
875 EXPECT_NOT_POISONED(addrlen
);
876 EXPECT_NOT_POISONED(buf
[0]);
877 EXPECT_NOT_POISONED(buf
[addrlen
- 1]);
878 EXPECT_POISONED(buf
[addrlen
]);
882 TEST(MemorySanitizer
, accept
) {
883 int listen_socket
= socket(AF_INET
, SOCK_STREAM
, 0);
884 ASSERT_LT(0, listen_socket
);
886 struct sockaddr_in sai
;
887 memset(&sai
, 0, sizeof(sai
));
888 sai
.sin_family
= AF_INET
;
890 sai
.sin_addr
.s_addr
= htonl(INADDR_LOOPBACK
);
891 int res
= bind(listen_socket
, (struct sockaddr
*)&sai
, sizeof(sai
));
894 res
= listen(listen_socket
, 1);
897 socklen_t sz
= sizeof(sai
);
898 res
= getsockname(listen_socket
, (struct sockaddr
*)&sai
, &sz
);
900 ASSERT_EQ(sizeof(sai
), sz
);
902 int connect_socket
= socket(AF_INET
, SOCK_STREAM
, 0);
903 ASSERT_LT(0, connect_socket
);
904 res
= fcntl(connect_socket
, F_SETFL
, O_NONBLOCK
);
906 res
= connect(connect_socket
, (struct sockaddr
*)&sai
, sizeof(sai
));
907 // On FreeBSD this connection completes immediately.
910 ASSERT_EQ(EINPROGRESS
, errno
);
913 __msan_poison(&sai
, sizeof(sai
));
914 int new_sock
= accept(listen_socket
, (struct sockaddr
*)&sai
, &sz
);
915 ASSERT_LT(0, new_sock
);
916 ASSERT_EQ(sizeof(sai
), sz
);
917 EXPECT_NOT_POISONED(sai
);
919 __msan_poison(&sai
, sizeof(sai
));
920 res
= getpeername(new_sock
, (struct sockaddr
*)&sai
, &sz
);
922 ASSERT_EQ(sizeof(sai
), sz
);
923 EXPECT_NOT_POISONED(sai
);
926 close(connect_socket
);
927 close(listen_socket
);
930 TEST(MemorySanitizer
, getaddrinfo
) {
932 struct addrinfo hints
;
933 memset(&hints
, 0, sizeof(hints
));
934 hints
.ai_family
= AF_INET
;
935 int res
= getaddrinfo("localhost", NULL
, &hints
, &ai
);
937 EXPECT_NOT_POISONED(*ai
);
938 ASSERT_EQ(sizeof(sockaddr_in
), ai
->ai_addrlen
);
939 EXPECT_NOT_POISONED(*(sockaddr_in
*)ai
->ai_addr
);
942 TEST(MemorySanitizer
, getnameinfo
) {
943 struct sockaddr_in sai
;
944 memset(&sai
, 0, sizeof(sai
));
945 sai
.sin_family
= AF_INET
;
947 sai
.sin_addr
.s_addr
= htonl(INADDR_LOOPBACK
);
950 int res
= getnameinfo((struct sockaddr
*)&sai
, sizeof(sai
), host
,
951 sizeof(host
), serv
, sizeof(serv
), 0);
953 EXPECT_NOT_POISONED(host
[0]);
954 EXPECT_POISONED(host
[sizeof(host
) - 1]);
956 ASSERT_NE(0U, strlen(host
));
957 EXPECT_NOT_POISONED(serv
[0]);
958 EXPECT_POISONED(serv
[sizeof(serv
) - 1]);
959 ASSERT_NE(0U, strlen(serv
));
962 #define EXPECT_HOSTENT_NOT_POISONED(he) \
964 EXPECT_NOT_POISONED(*(he)); \
965 ASSERT_NE((void *) 0, (he)->h_name); \
966 ASSERT_NE((void *) 0, (he)->h_aliases); \
967 ASSERT_NE((void *) 0, (he)->h_addr_list); \
968 EXPECT_NOT_POISONED(strlen((he)->h_name)); \
969 char **p = (he)->h_aliases; \
971 EXPECT_NOT_POISONED(strlen(*p)); \
974 char **q = (he)->h_addr_list; \
976 EXPECT_NOT_POISONED(*q[0]); \
979 EXPECT_NOT_POISONED(*q); \
982 TEST(MemorySanitizer
, gethostent
) {
983 struct hostent
*he
= gethostent();
984 ASSERT_NE((void *)NULL
, he
);
985 EXPECT_HOSTENT_NOT_POISONED(he
);
988 #ifndef MSAN_TEST_DISABLE_GETHOSTBYNAME
990 TEST(MemorySanitizer
, gethostbyname
) {
991 struct hostent
*he
= gethostbyname("localhost");
992 ASSERT_NE((void *)NULL
, he
);
993 EXPECT_HOSTENT_NOT_POISONED(he
);
996 #endif // MSAN_TEST_DISABLE_GETHOSTBYNAME
998 TEST(MemorySanitizer
, recvmsg
) {
999 int server_socket
= socket(AF_INET
, SOCK_DGRAM
, 0);
1000 ASSERT_LT(0, server_socket
);
1002 struct sockaddr_in sai
;
1003 memset(&sai
, 0, sizeof(sai
));
1004 sai
.sin_family
= AF_INET
;
1006 sai
.sin_addr
.s_addr
= htonl(INADDR_LOOPBACK
);
1007 int res
= bind(server_socket
, (struct sockaddr
*)&sai
, sizeof(sai
));
1010 socklen_t sz
= sizeof(sai
);
1011 res
= getsockname(server_socket
, (struct sockaddr
*)&sai
, &sz
);
1013 ASSERT_EQ(sizeof(sai
), sz
);
1016 int client_socket
= socket(AF_INET
, SOCK_DGRAM
, 0);
1017 ASSERT_LT(0, client_socket
);
1019 struct sockaddr_in client_sai
;
1020 memset(&client_sai
, 0, sizeof(client_sai
));
1021 client_sai
.sin_family
= AF_INET
;
1022 client_sai
.sin_port
= 0;
1023 client_sai
.sin_addr
.s_addr
= htonl(INADDR_LOOPBACK
);
1024 res
= bind(client_socket
, (struct sockaddr
*)&client_sai
, sizeof(client_sai
));
1027 sz
= sizeof(client_sai
);
1028 res
= getsockname(client_socket
, (struct sockaddr
*)&client_sai
, &sz
);
1030 ASSERT_EQ(sizeof(client_sai
), sz
);
1032 const char *s
= "message text";
1034 iov
.iov_base
= (void *)s
;
1035 iov
.iov_len
= strlen(s
) + 1;
1037 memset(&msg
, 0, sizeof(msg
));
1038 msg
.msg_name
= &sai
;
1039 msg
.msg_namelen
= sizeof(sai
);
1042 res
= sendmsg(client_socket
, &msg
, 0);
1047 struct iovec recv_iov
;
1048 recv_iov
.iov_base
= (void *)&buf
;
1049 recv_iov
.iov_len
= sizeof(buf
);
1050 struct sockaddr_in recv_sai
;
1051 struct msghdr recv_msg
;
1052 memset(&recv_msg
, 0, sizeof(recv_msg
));
1053 recv_msg
.msg_name
= &recv_sai
;
1054 recv_msg
.msg_namelen
= sizeof(recv_sai
);
1055 recv_msg
.msg_iov
= &recv_iov
;
1056 recv_msg
.msg_iovlen
= 1;
1057 res
= recvmsg(server_socket
, &recv_msg
, 0);
1060 ASSERT_EQ(sizeof(recv_sai
), recv_msg
.msg_namelen
);
1061 EXPECT_NOT_POISONED(*(struct sockaddr_in
*)recv_msg
.msg_name
);
1062 EXPECT_STREQ(s
, buf
);
1064 close(server_socket
);
1065 close(client_socket
);
1068 TEST(MemorySanitizer
, gethostbyname2
) {
1069 struct hostent
*he
= gethostbyname2("localhost", AF_INET
);
1070 ASSERT_NE((void *)NULL
, he
);
1071 EXPECT_HOSTENT_NOT_POISONED(he
);
1074 TEST(MemorySanitizer
, gethostbyaddr
) {
1075 in_addr_t addr
= inet_addr("127.0.0.1");
1076 EXPECT_NOT_POISONED(addr
);
1077 struct hostent
*he
= gethostbyaddr(&addr
, sizeof(addr
), AF_INET
);
1078 ASSERT_NE((void *)NULL
, he
);
1079 EXPECT_HOSTENT_NOT_POISONED(he
);
1082 TEST(MemorySanitizer
, gethostent_r
) {
1085 struct hostent
*result
;
1087 int res
= gethostent_r(&he
, buf
, sizeof(buf
), &result
, &err
);
1089 EXPECT_NOT_POISONED(result
);
1090 ASSERT_NE((void *)NULL
, result
);
1091 EXPECT_HOSTENT_NOT_POISONED(result
);
1092 EXPECT_NOT_POISONED(err
);
1095 TEST(MemorySanitizer
, gethostbyname_r
) {
1098 struct hostent
*result
;
1100 int res
= gethostbyname_r("localhost", &he
, buf
, sizeof(buf
), &result
, &err
);
1102 EXPECT_NOT_POISONED(result
);
1103 ASSERT_NE((void *)NULL
, result
);
1104 EXPECT_HOSTENT_NOT_POISONED(result
);
1105 EXPECT_NOT_POISONED(err
);
1108 TEST(MemorySanitizer
, gethostbyname_r_bad_host_name
) {
1111 struct hostent
*result
;
1113 int res
= gethostbyname_r("bad-host-name", &he
, buf
, sizeof(buf
), &result
, &err
);
1114 ASSERT_EQ((struct hostent
*)0, result
);
1115 EXPECT_NOT_POISONED(err
);
1118 TEST(MemorySanitizer
, gethostbyname_r_erange
) {
1121 struct hostent
*result
;
1123 gethostbyname_r("localhost", &he
, buf
, sizeof(buf
), &result
, &err
);
1124 ASSERT_EQ(ERANGE
, errno
);
1125 EXPECT_NOT_POISONED(err
);
1128 TEST(MemorySanitizer
, gethostbyname2_r
) {
1131 struct hostent
*result
;
1133 int res
= gethostbyname2_r("localhost", AF_INET
, &he
, buf
, sizeof(buf
),
1136 EXPECT_NOT_POISONED(result
);
1137 ASSERT_NE((void *)NULL
, result
);
1138 EXPECT_HOSTENT_NOT_POISONED(result
);
1139 EXPECT_NOT_POISONED(err
);
1142 TEST(MemorySanitizer
, gethostbyaddr_r
) {
1145 struct hostent
*result
;
1147 in_addr_t addr
= inet_addr("127.0.0.1");
1148 EXPECT_NOT_POISONED(addr
);
1149 int res
= gethostbyaddr_r(&addr
, sizeof(addr
), AF_INET
, &he
, buf
, sizeof(buf
),
1152 EXPECT_NOT_POISONED(result
);
1153 ASSERT_NE((void *)NULL
, result
);
1154 EXPECT_HOSTENT_NOT_POISONED(result
);
1155 EXPECT_NOT_POISONED(err
);
1158 TEST(MemorySanitizer
, getsockopt
) {
1159 int sock
= socket(AF_UNIX
, SOCK_STREAM
, 0);
1161 socklen_t sz
= sizeof(l
[0]);
1162 int res
= getsockopt(sock
, SOL_SOCKET
, SO_LINGER
, &l
[0], &sz
);
1164 ASSERT_EQ(sizeof(l
[0]), sz
);
1165 EXPECT_NOT_POISONED(l
[0]);
1166 EXPECT_POISONED(*(char *)(l
+ 1));
1169 TEST(MemorySanitizer
, getcwd
) {
1170 char path
[PATH_MAX
+ 1];
1171 char* res
= getcwd(path
, sizeof(path
));
1172 ASSERT_TRUE(res
!= NULL
);
1173 EXPECT_NOT_POISONED(path
[0]);
1176 TEST(MemorySanitizer
, getcwd_gnu
) {
1177 char* res
= getcwd(NULL
, 0);
1178 ASSERT_TRUE(res
!= NULL
);
1179 EXPECT_NOT_POISONED(res
[0]);
1183 // There's no get_current_dir_name() on FreeBSD.
1184 #if !defined(__FreeBSD__)
1185 TEST(MemorySanitizer
, get_current_dir_name
) {
1186 char* res
= get_current_dir_name();
1187 ASSERT_TRUE(res
!= NULL
);
1188 EXPECT_NOT_POISONED(res
[0]);
1193 TEST(MemorySanitizer
, shmctl
) {
1194 int id
= shmget(IPC_PRIVATE
, 4096, 0644 | IPC_CREAT
);
1198 int res
= shmctl(id
, IPC_STAT
, &ds
);
1200 EXPECT_NOT_POISONED(ds
);
1202 // FreeBSD does not support shmctl(IPC_INFO) and shmctl(SHM_INFO).
1203 #if !defined(__FreeBSD__)
1205 res
= shmctl(id
, IPC_INFO
, (struct shmid_ds
*)&si
);
1207 EXPECT_NOT_POISONED(si
);
1209 struct shm_info s_i
;
1210 res
= shmctl(id
, SHM_INFO
, (struct shmid_ds
*)&s_i
);
1212 EXPECT_NOT_POISONED(s_i
);
1215 res
= shmctl(id
, IPC_RMID
, 0);
1219 TEST(MemorySanitizer
, shmat
) {
1220 const int kShmSize
= 4096;
1221 void *mapping_start
= mmap(NULL
, kShmSize
+ SHMLBA
, PROT_READ
| PROT_WRITE
,
1222 MAP_PRIVATE
| MAP_ANONYMOUS
, -1, 0);
1223 ASSERT_NE(MAP_FAILED
, mapping_start
);
1225 void *p
= (void *)(((unsigned long)mapping_start
+ SHMLBA
- 1) / SHMLBA
* SHMLBA
);
1226 // p is now SHMLBA-aligned;
1228 ((char *)p
)[10] = *GetPoisoned
<U1
>();
1229 ((char *)p
)[kShmSize
- 1] = *GetPoisoned
<U1
>();
1231 int res
= munmap(mapping_start
, kShmSize
+ SHMLBA
);
1234 int id
= shmget(IPC_PRIVATE
, kShmSize
, 0644 | IPC_CREAT
);
1237 void *q
= shmat(id
, p
, 0);
1240 EXPECT_NOT_POISONED(((char *)q
)[0]);
1241 EXPECT_NOT_POISONED(((char *)q
)[10]);
1242 EXPECT_NOT_POISONED(((char *)q
)[kShmSize
- 1]);
1247 res
= shmctl(id
, IPC_RMID
, 0);
1251 // There's no random_r() on FreeBSD.
1252 #if !defined(__FreeBSD__)
1253 TEST(MemorySanitizer
, random_r
) {
1256 memset(z
, 0, sizeof(z
));
1258 struct random_data buf
;
1259 memset(&buf
, 0, sizeof(buf
));
1261 int res
= initstate_r(0, z
, sizeof(z
), &buf
);
1264 res
= random_r(&buf
, &x
);
1266 EXPECT_NOT_POISONED(x
);
1270 TEST(MemorySanitizer
, confstr
) {
1272 size_t res
= confstr(_CS_PATH
, buf
, sizeof(buf
));
1273 ASSERT_GT(res
, sizeof(buf
));
1274 EXPECT_NOT_POISONED(buf
[0]);
1275 EXPECT_NOT_POISONED(buf
[sizeof(buf
) - 1]);
1278 res
= confstr(_CS_PATH
, buf2
, sizeof(buf2
));
1279 ASSERT_LT(res
, sizeof(buf2
));
1280 EXPECT_NOT_POISONED(buf2
[0]);
1281 EXPECT_NOT_POISONED(buf2
[res
- 1]);
1282 EXPECT_POISONED(buf2
[res
]);
1283 ASSERT_EQ(res
, strlen(buf2
) + 1);
1286 TEST(MemorySanitizer
, opendir
) {
1287 DIR *dir
= opendir(".");
1290 char name
[10] = ".";
1291 __msan_poison(name
, sizeof(name
));
1292 EXPECT_UMR(dir
= opendir(name
));
1296 TEST(MemorySanitizer
, readdir
) {
1297 DIR *dir
= opendir(".");
1298 struct dirent
*d
= readdir(dir
);
1299 ASSERT_TRUE(d
!= NULL
);
1300 EXPECT_NOT_POISONED(d
->d_name
[0]);
1304 TEST(MemorySanitizer
, readdir_r
) {
1305 DIR *dir
= opendir(".");
1308 int res
= readdir_r(dir
, &d
, &pd
);
1310 EXPECT_NOT_POISONED(pd
);
1311 EXPECT_NOT_POISONED(d
.d_name
[0]);
1315 TEST(MemorySanitizer
, realpath
) {
1316 const char* relpath
= ".";
1317 char path
[PATH_MAX
+ 1];
1318 char* res
= realpath(relpath
, path
);
1319 ASSERT_TRUE(res
!= NULL
);
1320 EXPECT_NOT_POISONED(path
[0]);
1323 TEST(MemorySanitizer
, realpath_null
) {
1324 const char* relpath
= ".";
1325 char* res
= realpath(relpath
, NULL
);
1326 printf("%d, %s\n", errno
, strerror(errno
));
1327 ASSERT_TRUE(res
!= NULL
);
1328 EXPECT_NOT_POISONED(res
[0]);
1332 // There's no canonicalize_file_name() on FreeBSD.
1333 #if !defined(__FreeBSD__)
1334 TEST(MemorySanitizer
, canonicalize_file_name
) {
1335 const char* relpath
= ".";
1336 char* res
= canonicalize_file_name(relpath
);
1337 ASSERT_TRUE(res
!= NULL
);
1338 EXPECT_NOT_POISONED(res
[0]);
1343 extern char **environ
;
1345 TEST(MemorySanitizer
, setenv
) {
1346 setenv("AAA", "BBB", 1);
1347 for (char **envp
= environ
; *envp
; ++envp
) {
1348 EXPECT_NOT_POISONED(*envp
);
1349 EXPECT_NOT_POISONED(*envp
[0]);
1353 TEST(MemorySanitizer
, putenv
) {
1354 char s
[] = "AAA=BBB";
1356 for (char **envp
= environ
; *envp
; ++envp
) {
1357 EXPECT_NOT_POISONED(*envp
);
1358 EXPECT_NOT_POISONED(*envp
[0]);
1362 TEST(MemorySanitizer
, memcpy
) {
1363 char* x
= new char[2];
1364 char* y
= new char[2];
1366 x
[1] = *GetPoisoned
<char>();
1368 EXPECT_NOT_POISONED(y
[0]);
1369 EXPECT_POISONED(y
[1]);
1372 void TestUnalignedMemcpy(unsigned left
, unsigned right
, bool src_is_aligned
,
1373 bool src_is_poisoned
, bool dst_is_poisoned
) {
1374 fprintf(stderr
, "%s(%d, %d, %d, %d, %d)\n", __func__
, left
, right
,
1375 src_is_aligned
, src_is_poisoned
, dst_is_poisoned
);
1377 const unsigned sz
= 20;
1378 U4 dst_origin
, src_origin
;
1379 char *dst
= (char *)malloc(sz
);
1380 if (dst_is_poisoned
)
1381 dst_origin
= __msan_get_origin(dst
);
1385 char *src
= (char *)malloc(sz
);
1386 if (src_is_poisoned
)
1387 src_origin
= __msan_get_origin(src
);
1391 memcpy(dst
+ left
, src_is_aligned
? src
+ left
: src
, sz
- left
- right
);
1393 for (unsigned i
= 0; i
< (left
& (~3U)); ++i
)
1394 if (dst_is_poisoned
)
1395 EXPECT_POISONED_O(dst
[i
], dst_origin
);
1397 EXPECT_NOT_POISONED(dst
[i
]);
1399 for (unsigned i
= 0; i
< (right
& (~3U)); ++i
)
1400 if (dst_is_poisoned
)
1401 EXPECT_POISONED_O(dst
[sz
- i
- 1], dst_origin
);
1403 EXPECT_NOT_POISONED(dst
[sz
- i
- 1]);
1405 for (unsigned i
= left
; i
< sz
- right
; ++i
)
1406 if (src_is_poisoned
)
1407 EXPECT_POISONED_O(dst
[i
], src_origin
);
1409 EXPECT_NOT_POISONED(dst
[i
]);
1415 TEST(MemorySanitizer
, memcpy_unaligned
) {
1416 for (int i
= 0; i
< 10; ++i
)
1417 for (int j
= 0; j
< 10; ++j
)
1418 for (int aligned
= 0; aligned
< 2; ++aligned
)
1419 for (int srcp
= 0; srcp
< 2; ++srcp
)
1420 for (int dstp
= 0; dstp
< 2; ++dstp
)
1421 TestUnalignedMemcpy(i
, j
, aligned
, srcp
, dstp
);
1424 TEST(MemorySanitizer
, memmove
) {
1425 char* x
= new char[2];
1426 char* y
= new char[2];
1428 x
[1] = *GetPoisoned
<char>();
1430 EXPECT_NOT_POISONED(y
[0]);
1431 EXPECT_POISONED(y
[1]);
1434 TEST(MemorySanitizer
, memccpy_nomatch
) {
1435 char* x
= new char[5];
1436 char* y
= new char[5];
1438 memccpy(y
, x
, 'd', 4);
1439 EXPECT_NOT_POISONED(y
[0]);
1440 EXPECT_NOT_POISONED(y
[1]);
1441 EXPECT_NOT_POISONED(y
[2]);
1442 EXPECT_NOT_POISONED(y
[3]);
1443 EXPECT_POISONED(y
[4]);
1448 TEST(MemorySanitizer
, memccpy_match
) {
1449 char* x
= new char[5];
1450 char* y
= new char[5];
1452 memccpy(y
, x
, 'b', 4);
1453 EXPECT_NOT_POISONED(y
[0]);
1454 EXPECT_NOT_POISONED(y
[1]);
1455 EXPECT_POISONED(y
[2]);
1456 EXPECT_POISONED(y
[3]);
1457 EXPECT_POISONED(y
[4]);
1462 TEST(MemorySanitizer
, memccpy_nomatch_positive
) {
1463 char* x
= new char[5];
1464 char* y
= new char[5];
1466 EXPECT_UMR(memccpy(y
, x
, 'd', 5));
1471 TEST(MemorySanitizer
, memccpy_match_positive
) {
1472 char* x
= new char[5];
1473 char* y
= new char[5];
1476 EXPECT_UMR(memccpy(y
, x
, 'b', 5));
1481 TEST(MemorySanitizer
, bcopy
) {
1482 char* x
= new char[2];
1483 char* y
= new char[2];
1485 x
[1] = *GetPoisoned
<char>();
1487 EXPECT_NOT_POISONED(y
[0]);
1488 EXPECT_POISONED(y
[1]);
1491 TEST(MemorySanitizer
, strdup
) {
1492 char buf
[4] = "abc";
1493 __msan_poison(buf
+ 2, sizeof(*buf
));
1494 char *x
= strdup(buf
);
1495 EXPECT_NOT_POISONED(x
[0]);
1496 EXPECT_NOT_POISONED(x
[1]);
1497 EXPECT_POISONED(x
[2]);
1498 EXPECT_NOT_POISONED(x
[3]);
1502 TEST(MemorySanitizer
, strndup
) {
1503 char buf
[4] = "abc";
1504 __msan_poison(buf
+ 2, sizeof(*buf
));
1505 char *x
= strndup(buf
, 3);
1506 EXPECT_NOT_POISONED(x
[0]);
1507 EXPECT_NOT_POISONED(x
[1]);
1508 EXPECT_POISONED(x
[2]);
1509 EXPECT_NOT_POISONED(x
[3]);
1513 TEST(MemorySanitizer
, strndup_short
) {
1514 char buf
[4] = "abc";
1515 __msan_poison(buf
+ 1, sizeof(*buf
));
1516 __msan_poison(buf
+ 2, sizeof(*buf
));
1517 char *x
= strndup(buf
, 2);
1518 EXPECT_NOT_POISONED(x
[0]);
1519 EXPECT_POISONED(x
[1]);
1520 EXPECT_NOT_POISONED(x
[2]);
1525 template<class T
, int size
>
1526 void TestOverlapMemmove() {
1530 memmove(x
, x
+ 1, (size
- 1) * sizeof(T
));
1531 EXPECT_NOT_POISONED(x
[1]);
1532 EXPECT_POISONED(x
[0]);
1533 EXPECT_POISONED(x
[2]);
1537 TEST(MemorySanitizer
, overlap_memmove
) {
1538 TestOverlapMemmove
<U1
, 10>();
1539 TestOverlapMemmove
<U1
, 1000>();
1540 TestOverlapMemmove
<U8
, 4>();
1541 TestOverlapMemmove
<U8
, 1000>();
1544 TEST(MemorySanitizer
, strcpy
) { // NOLINT
1545 char* x
= new char[3];
1546 char* y
= new char[3];
1548 x
[1] = *GetPoisoned
<char>(1, 1);
1550 strcpy(y
, x
); // NOLINT
1551 EXPECT_NOT_POISONED(y
[0]);
1552 EXPECT_POISONED(y
[1]);
1553 EXPECT_NOT_POISONED(y
[2]);
1556 TEST(MemorySanitizer
, strncpy
) { // NOLINT
1557 char* x
= new char[3];
1558 char* y
= new char[5];
1560 x
[1] = *GetPoisoned
<char>(1, 1);
1562 strncpy(y
, x
, 4); // NOLINT
1563 EXPECT_NOT_POISONED(y
[0]);
1564 EXPECT_POISONED(y
[1]);
1565 EXPECT_NOT_POISONED(y
[2]);
1566 EXPECT_NOT_POISONED(y
[3]);
1567 EXPECT_POISONED(y
[4]);
1570 TEST(MemorySanitizer
, stpcpy
) { // NOLINT
1571 char* x
= new char[3];
1572 char* y
= new char[3];
1574 x
[1] = *GetPoisoned
<char>(1, 1);
1576 char *res
= stpcpy(y
, x
); // NOLINT
1577 ASSERT_EQ(res
, y
+ 2);
1578 EXPECT_NOT_POISONED(y
[0]);
1579 EXPECT_POISONED(y
[1]);
1580 EXPECT_NOT_POISONED(y
[2]);
1583 TEST(MemorySanitizer
, strcat
) { // NOLINT
1587 __msan_poison(b
+ 1, 1);
1589 EXPECT_NOT_POISONED(a
[3]);
1590 EXPECT_POISONED(a
[4]);
1591 EXPECT_NOT_POISONED(a
[5]);
1592 EXPECT_NOT_POISONED(a
[6]);
1593 EXPECT_POISONED(a
[7]);
1596 TEST(MemorySanitizer
, strncat
) { // NOLINT
1600 __msan_poison(b
+ 1, 1);
1602 EXPECT_NOT_POISONED(a
[3]);
1603 EXPECT_POISONED(a
[4]);
1604 EXPECT_NOT_POISONED(a
[5]);
1605 EXPECT_NOT_POISONED(a
[6]);
1606 EXPECT_POISONED(a
[7]);
1609 TEST(MemorySanitizer
, strncat_overflow
) { // NOLINT
1613 __msan_poison(b
+ 1, 1);
1615 EXPECT_NOT_POISONED(a
[3]);
1616 EXPECT_POISONED(a
[4]);
1617 EXPECT_NOT_POISONED(a
[5]);
1618 EXPECT_POISONED(a
[6]);
1619 EXPECT_POISONED(a
[7]);
1622 #define TEST_STRTO_INT(func_name, char_type, str_prefix) \
1623 TEST(MemorySanitizer, func_name) { \
1625 EXPECT_EQ(1U, func_name(str_prefix##"1", &e, 10)); \
1626 EXPECT_NOT_POISONED((S8)e); \
1629 #define TEST_STRTO_FLOAT(func_name, char_type, str_prefix) \
1630 TEST(MemorySanitizer, func_name) { \
1632 EXPECT_NE(0, func_name(str_prefix##"1.5", &e)); \
1633 EXPECT_NOT_POISONED((S8)e); \
1636 #define TEST_STRTO_FLOAT_LOC(func_name, char_type, str_prefix) \
1637 TEST(MemorySanitizer, func_name) { \
1638 locale_t loc = newlocale(LC_NUMERIC_MASK, "C", (locale_t)0); \
1640 EXPECT_NE(0, func_name(str_prefix##"1.5", &e, loc)); \
1641 EXPECT_NOT_POISONED((S8)e); \
1645 #define TEST_STRTO_INT_LOC(func_name, char_type, str_prefix) \
1646 TEST(MemorySanitizer, func_name) { \
1647 locale_t loc = newlocale(LC_NUMERIC_MASK, "C", (locale_t)0); \
1649 ASSERT_EQ(1U, func_name(str_prefix##"1", &e, 10, loc)); \
1650 EXPECT_NOT_POISONED((S8)e); \
1654 TEST_STRTO_INT(strtol
, char, )
1655 TEST_STRTO_INT(strtoll
, char, )
1656 TEST_STRTO_INT(strtoul
, char, )
1657 TEST_STRTO_INT(strtoull
, char, )
1659 TEST_STRTO_FLOAT(strtof
, char, )
1660 TEST_STRTO_FLOAT(strtod
, char, )
1661 TEST_STRTO_FLOAT(strtold
, char, )
1663 TEST_STRTO_FLOAT_LOC(strtof_l
, char, )
1664 TEST_STRTO_FLOAT_LOC(strtod_l
, char, )
1665 TEST_STRTO_FLOAT_LOC(strtold_l
, char, )
1667 TEST_STRTO_INT_LOC(strtol_l
, char, )
1668 TEST_STRTO_INT_LOC(strtoll_l
, char, )
1669 TEST_STRTO_INT_LOC(strtoul_l
, char, )
1670 TEST_STRTO_INT_LOC(strtoull_l
, char, )
1672 TEST_STRTO_INT(wcstol
, wchar_t, L
)
1673 TEST_STRTO_INT(wcstoll
, wchar_t, L
)
1674 TEST_STRTO_INT(wcstoul
, wchar_t, L
)
1675 TEST_STRTO_INT(wcstoull
, wchar_t, L
)
1677 TEST_STRTO_FLOAT(wcstof
, wchar_t, L
)
1678 TEST_STRTO_FLOAT(wcstod
, wchar_t, L
)
1679 TEST_STRTO_FLOAT(wcstold
, wchar_t, L
)
1681 TEST_STRTO_FLOAT_LOC(wcstof_l
, wchar_t, L
)
1682 TEST_STRTO_FLOAT_LOC(wcstod_l
, wchar_t, L
)
1683 TEST_STRTO_FLOAT_LOC(wcstold_l
, wchar_t, L
)
1685 TEST_STRTO_INT_LOC(wcstol_l
, wchar_t, L
)
1686 TEST_STRTO_INT_LOC(wcstoll_l
, wchar_t, L
)
1687 TEST_STRTO_INT_LOC(wcstoul_l
, wchar_t, L
)
1688 TEST_STRTO_INT_LOC(wcstoull_l
, wchar_t, L
)
1691 TEST(MemorySanitizer
, strtoimax
) {
1693 ASSERT_EQ(1, strtoimax("1", &e
, 10));
1694 EXPECT_NOT_POISONED((S8
) e
);
1697 TEST(MemorySanitizer
, strtoumax
) {
1699 ASSERT_EQ(1U, strtoumax("1", &e
, 10));
1700 EXPECT_NOT_POISONED((S8
) e
);
1704 extern "C" float __strtof_l(const char *nptr
, char **endptr
, locale_t loc
);
1705 TEST_STRTO_FLOAT_LOC(__strtof_l
, char, )
1706 extern "C" double __strtod_l(const char *nptr
, char **endptr
, locale_t loc
);
1707 TEST_STRTO_FLOAT_LOC(__strtod_l
, char, )
1708 extern "C" long double __strtold_l(const char *nptr
, char **endptr
,
1710 TEST_STRTO_FLOAT_LOC(__strtold_l
, char, )
1712 extern "C" float __wcstof_l(const wchar_t *nptr
, wchar_t **endptr
, locale_t loc
);
1713 TEST_STRTO_FLOAT_LOC(__wcstof_l
, wchar_t, L
)
1714 extern "C" double __wcstod_l(const wchar_t *nptr
, wchar_t **endptr
, locale_t loc
);
1715 TEST_STRTO_FLOAT_LOC(__wcstod_l
, wchar_t, L
)
1716 extern "C" long double __wcstold_l(const wchar_t *nptr
, wchar_t **endptr
,
1718 TEST_STRTO_FLOAT_LOC(__wcstold_l
, wchar_t, L
)
1721 TEST(MemorySanitizer
, modf
) {
1724 EXPECT_NOT_POISONED(y
);
1727 TEST(MemorySanitizer
, modff
) {
1730 EXPECT_NOT_POISONED(y
);
1733 TEST(MemorySanitizer
, modfl
) {
1736 EXPECT_NOT_POISONED(y
);
1739 // There's no sincos() on FreeBSD.
1740 #if !defined(__FreeBSD__)
1741 TEST(MemorySanitizer
, sincos
) {
1743 sincos(0.2, &s
, &c
);
1744 EXPECT_NOT_POISONED(s
);
1745 EXPECT_NOT_POISONED(c
);
1749 // There's no sincosf() on FreeBSD.
1750 #if !defined(__FreeBSD__)
1751 TEST(MemorySanitizer
, sincosf
) {
1753 sincosf(0.2, &s
, &c
);
1754 EXPECT_NOT_POISONED(s
);
1755 EXPECT_NOT_POISONED(c
);
1759 // There's no sincosl() on FreeBSD.
1760 #if !defined(__FreeBSD__)
1761 TEST(MemorySanitizer
, sincosl
) {
1763 sincosl(0.2, &s
, &c
);
1764 EXPECT_NOT_POISONED(s
);
1765 EXPECT_NOT_POISONED(c
);
1769 TEST(MemorySanitizer
, remquo
) {
1771 double res
= remquo(29.0, 3.0, &quo
);
1772 ASSERT_NE(0.0, res
);
1773 EXPECT_NOT_POISONED(quo
);
1776 TEST(MemorySanitizer
, remquof
) {
1778 float res
= remquof(29.0, 3.0, &quo
);
1779 ASSERT_NE(0.0, res
);
1780 EXPECT_NOT_POISONED(quo
);
1783 TEST(MemorySanitizer
, remquol
) {
1785 long double res
= remquof(29.0, 3.0, &quo
);
1786 ASSERT_NE(0.0, res
);
1787 EXPECT_NOT_POISONED(quo
);
1790 TEST(MemorySanitizer
, lgamma
) {
1791 double res
= lgamma(1.1);
1792 ASSERT_NE(0.0, res
);
1793 EXPECT_NOT_POISONED(signgam
);
1796 TEST(MemorySanitizer
, lgammaf
) {
1797 float res
= lgammaf(1.1);
1798 ASSERT_NE(0.0, res
);
1799 EXPECT_NOT_POISONED(signgam
);
1802 TEST(MemorySanitizer
, lgammal
) {
1803 long double res
= lgammal(1.1);
1804 ASSERT_NE(0.0, res
);
1805 EXPECT_NOT_POISONED(signgam
);
1808 TEST(MemorySanitizer
, lgamma_r
) {
1810 double res
= lgamma_r(1.1, &sgn
);
1811 ASSERT_NE(0.0, res
);
1812 EXPECT_NOT_POISONED(sgn
);
1815 TEST(MemorySanitizer
, lgammaf_r
) {
1817 float res
= lgammaf_r(1.1, &sgn
);
1818 ASSERT_NE(0.0, res
);
1819 EXPECT_NOT_POISONED(sgn
);
1822 // There's no lgammal_r() on FreeBSD.
1823 #if !defined(__FreeBSD__)
1824 TEST(MemorySanitizer
, lgammal_r
) {
1826 long double res
= lgammal_r(1.1, &sgn
);
1827 ASSERT_NE(0.0, res
);
1828 EXPECT_NOT_POISONED(sgn
);
1832 // There's no drand48_r() on FreeBSD.
1833 #if !defined(__FreeBSD__)
1834 TEST(MemorySanitizer
, drand48_r
) {
1835 struct drand48_data buf
;
1838 drand48_r(&buf
, &d
);
1839 EXPECT_NOT_POISONED(d
);
1843 // There's no lrand48_r() on FreeBSD.
1844 #if !defined(__FreeBSD__)
1845 TEST(MemorySanitizer
, lrand48_r
) {
1846 struct drand48_data buf
;
1849 lrand48_r(&buf
, &d
);
1850 EXPECT_NOT_POISONED(d
);
1854 TEST(MemorySanitizer
, sprintf
) { // NOLINT
1856 break_optimization(buff
);
1857 EXPECT_POISONED(buff
[0]);
1858 int res
= sprintf(buff
, "%d", 1234567); // NOLINT
1860 ASSERT_EQ(buff
[0], '1');
1861 ASSERT_EQ(buff
[1], '2');
1862 ASSERT_EQ(buff
[2], '3');
1863 ASSERT_EQ(buff
[6], '7');
1864 ASSERT_EQ(buff
[7], 0);
1865 EXPECT_POISONED(buff
[8]);
1868 TEST(MemorySanitizer
, snprintf
) {
1870 break_optimization(buff
);
1871 EXPECT_POISONED(buff
[0]);
1872 int res
= snprintf(buff
, sizeof(buff
), "%d", 1234567);
1874 ASSERT_EQ(buff
[0], '1');
1875 ASSERT_EQ(buff
[1], '2');
1876 ASSERT_EQ(buff
[2], '3');
1877 ASSERT_EQ(buff
[6], '7');
1878 ASSERT_EQ(buff
[7], 0);
1879 EXPECT_POISONED(buff
[8]);
1882 TEST(MemorySanitizer
, swprintf
) {
1884 ASSERT_EQ(4U, sizeof(wchar_t));
1885 break_optimization(buff
);
1886 EXPECT_POISONED(buff
[0]);
1887 int res
= swprintf(buff
, 9, L
"%d", 1234567);
1889 ASSERT_EQ(buff
[0], '1');
1890 ASSERT_EQ(buff
[1], '2');
1891 ASSERT_EQ(buff
[2], '3');
1892 ASSERT_EQ(buff
[6], '7');
1893 ASSERT_EQ(buff
[7], L
'\0');
1894 EXPECT_POISONED(buff
[8]);
1897 TEST(MemorySanitizer
, asprintf
) { // NOLINT
1899 EXPECT_POISONED(pbuf
);
1900 int res
= asprintf(&pbuf
, "%d", 1234567); // NOLINT
1902 EXPECT_NOT_POISONED(pbuf
);
1903 ASSERT_EQ(pbuf
[0], '1');
1904 ASSERT_EQ(pbuf
[1], '2');
1905 ASSERT_EQ(pbuf
[2], '3');
1906 ASSERT_EQ(pbuf
[6], '7');
1907 ASSERT_EQ(pbuf
[7], 0);
1911 TEST(MemorySanitizer
, mbstowcs
) {
1912 const char *x
= "abc";
1914 int res
= mbstowcs(buff
, x
, 2);
1916 EXPECT_EQ(L
'a', buff
[0]);
1917 EXPECT_EQ(L
'b', buff
[1]);
1918 EXPECT_POISONED(buff
[2]);
1919 res
= mbstowcs(buff
, x
, 10);
1921 EXPECT_NOT_POISONED(buff
[3]);
1924 TEST(MemorySanitizer
, wcstombs
) {
1925 const wchar_t *x
= L
"abc";
1927 int res
= wcstombs(buff
, x
, 4);
1929 EXPECT_EQ(buff
[0], 'a');
1930 EXPECT_EQ(buff
[1], 'b');
1931 EXPECT_EQ(buff
[2], 'c');
1934 TEST(MemorySanitizer
, wcsrtombs
) {
1935 const wchar_t *x
= L
"abc";
1936 const wchar_t *p
= x
;
1939 memset(&mbs
, 0, sizeof(mbs
));
1940 int res
= wcsrtombs(buff
, &p
, 4, &mbs
);
1942 EXPECT_EQ(buff
[0], 'a');
1943 EXPECT_EQ(buff
[1], 'b');
1944 EXPECT_EQ(buff
[2], 'c');
1945 EXPECT_EQ(buff
[3], '\0');
1946 EXPECT_POISONED(buff
[4]);
1949 TEST(MemorySanitizer
, wcsnrtombs
) {
1950 const wchar_t *x
= L
"abc";
1951 const wchar_t *p
= x
;
1954 memset(&mbs
, 0, sizeof(mbs
));
1955 int res
= wcsnrtombs(buff
, &p
, 2, 4, &mbs
);
1957 EXPECT_EQ(buff
[0], 'a');
1958 EXPECT_EQ(buff
[1], 'b');
1959 EXPECT_POISONED(buff
[2]);
1962 TEST(MemorySanitizer
, wcrtomb
) {
1966 memset(&mbs
, 0, sizeof(mbs
));
1967 size_t res
= wcrtomb(buff
, x
, &mbs
);
1968 EXPECT_EQ(res
, (size_t)1);
1969 EXPECT_EQ(buff
[0], 'a');
1972 TEST(MemorySanitizer
, wmemset
) {
1974 break_optimization(x
);
1975 EXPECT_POISONED(x
[0]);
1976 wmemset(x
, L
'A', 10);
1977 EXPECT_EQ(x
[0], L
'A');
1978 EXPECT_EQ(x
[9], L
'A');
1979 EXPECT_POISONED(x
[10]);
1982 TEST(MemorySanitizer
, mbtowc
) {
1983 const char *x
= "abc";
1985 int res
= mbtowc(&wx
, x
, 3);
1987 EXPECT_NOT_POISONED(wx
);
1990 TEST(MemorySanitizer
, mbrtowc
) {
1991 const char *x
= "abc";
1994 memset(&mbs
, 0, sizeof(mbs
));
1995 int res
= mbrtowc(&wx
, x
, 3, &mbs
);
1997 EXPECT_NOT_POISONED(wx
);
2000 TEST(MemorySanitizer
, wcsftime
) {
2002 time_t t
= time(NULL
);
2004 struct tm
*tmres
= localtime_r(&t
, &tms
);
2005 ASSERT_NE((void *)0, tmres
);
2006 size_t res
= wcsftime(x
, sizeof(x
) / sizeof(x
[0]), L
"%Y-%m-%d", tmres
);
2007 EXPECT_GT(res
, 0UL);
2008 EXPECT_EQ(res
, wcslen(x
));
2011 TEST(MemorySanitizer
, gettimeofday
) {
2014 break_optimization(&tv
);
2015 break_optimization(&tz
);
2016 ASSERT_EQ(16U, sizeof(tv
));
2017 ASSERT_EQ(8U, sizeof(tz
));
2018 EXPECT_POISONED(tv
.tv_sec
);
2019 EXPECT_POISONED(tv
.tv_usec
);
2020 EXPECT_POISONED(tz
.tz_minuteswest
);
2021 EXPECT_POISONED(tz
.tz_dsttime
);
2022 ASSERT_EQ(0, gettimeofday(&tv
, &tz
));
2023 EXPECT_NOT_POISONED(tv
.tv_sec
);
2024 EXPECT_NOT_POISONED(tv
.tv_usec
);
2025 EXPECT_NOT_POISONED(tz
.tz_minuteswest
);
2026 EXPECT_NOT_POISONED(tz
.tz_dsttime
);
2029 TEST(MemorySanitizer
, clock_gettime
) {
2031 EXPECT_POISONED(tp
.tv_sec
);
2032 EXPECT_POISONED(tp
.tv_nsec
);
2033 ASSERT_EQ(0, clock_gettime(CLOCK_REALTIME
, &tp
));
2034 EXPECT_NOT_POISONED(tp
.tv_sec
);
2035 EXPECT_NOT_POISONED(tp
.tv_nsec
);
2038 TEST(MemorySanitizer
, clock_getres
) {
2040 EXPECT_POISONED(tp
.tv_sec
);
2041 EXPECT_POISONED(tp
.tv_nsec
);
2042 ASSERT_EQ(0, clock_getres(CLOCK_REALTIME
, 0));
2043 EXPECT_POISONED(tp
.tv_sec
);
2044 EXPECT_POISONED(tp
.tv_nsec
);
2045 ASSERT_EQ(0, clock_getres(CLOCK_REALTIME
, &tp
));
2046 EXPECT_NOT_POISONED(tp
.tv_sec
);
2047 EXPECT_NOT_POISONED(tp
.tv_nsec
);
2050 TEST(MemorySanitizer
, getitimer
) {
2051 struct itimerval it1
, it2
;
2053 EXPECT_POISONED(it1
.it_interval
.tv_sec
);
2054 EXPECT_POISONED(it1
.it_interval
.tv_usec
);
2055 EXPECT_POISONED(it1
.it_value
.tv_sec
);
2056 EXPECT_POISONED(it1
.it_value
.tv_usec
);
2057 res
= getitimer(ITIMER_VIRTUAL
, &it1
);
2059 EXPECT_NOT_POISONED(it1
.it_interval
.tv_sec
);
2060 EXPECT_NOT_POISONED(it1
.it_interval
.tv_usec
);
2061 EXPECT_NOT_POISONED(it1
.it_value
.tv_sec
);
2062 EXPECT_NOT_POISONED(it1
.it_value
.tv_usec
);
2064 it1
.it_interval
.tv_sec
= it1
.it_value
.tv_sec
= 10000;
2065 it1
.it_interval
.tv_usec
= it1
.it_value
.tv_usec
= 0;
2067 res
= setitimer(ITIMER_VIRTUAL
, &it1
, &it2
);
2069 EXPECT_NOT_POISONED(it2
.it_interval
.tv_sec
);
2070 EXPECT_NOT_POISONED(it2
.it_interval
.tv_usec
);
2071 EXPECT_NOT_POISONED(it2
.it_value
.tv_sec
);
2072 EXPECT_NOT_POISONED(it2
.it_value
.tv_usec
);
2074 // Check that old_value can be 0, and disable the timer.
2075 memset(&it1
, 0, sizeof(it1
));
2076 res
= setitimer(ITIMER_VIRTUAL
, &it1
, 0);
2080 TEST(MemorySanitizer
, setitimer_null
) {
2081 setitimer(ITIMER_VIRTUAL
, 0, 0);
2082 // Not testing the return value, since it the behaviour seems to differ
2083 // between libc implementations and POSIX.
2084 // Should never crash, though.
2087 TEST(MemorySanitizer
, time
) {
2090 time_t t2
= time(&t
);
2091 ASSERT_NE(t2
, (time_t)-1);
2092 EXPECT_NOT_POISONED(t
);
2095 TEST(MemorySanitizer
, strptime
) {
2097 char *p
= strptime("11/1/2013-05:39", "%m/%d/%Y-%H:%M", &time
);
2098 ASSERT_TRUE(p
!= NULL
);
2099 EXPECT_NOT_POISONED(time
.tm_sec
);
2100 EXPECT_NOT_POISONED(time
.tm_hour
);
2101 EXPECT_NOT_POISONED(time
.tm_year
);
2104 TEST(MemorySanitizer
, localtime
) {
2106 struct tm
*time
= localtime(&t
);
2107 ASSERT_TRUE(time
!= NULL
);
2108 EXPECT_NOT_POISONED(time
->tm_sec
);
2109 EXPECT_NOT_POISONED(time
->tm_hour
);
2110 EXPECT_NOT_POISONED(time
->tm_year
);
2111 EXPECT_NOT_POISONED(time
->tm_isdst
);
2112 EXPECT_NE(0U, strlen(time
->tm_zone
));
2115 TEST(MemorySanitizer
, localtime_r
) {
2118 struct tm
*res
= localtime_r(&t
, &time
);
2119 ASSERT_TRUE(res
!= NULL
);
2120 EXPECT_NOT_POISONED(time
.tm_sec
);
2121 EXPECT_NOT_POISONED(time
.tm_hour
);
2122 EXPECT_NOT_POISONED(time
.tm_year
);
2123 EXPECT_NOT_POISONED(time
.tm_isdst
);
2124 EXPECT_NE(0U, strlen(time
.tm_zone
));
2127 // There's no getmntent() on FreeBSD.
2128 #if !defined(__FreeBSD__)
2129 TEST(MemorySanitizer
, getmntent
) {
2130 FILE *fp
= setmntent("/etc/fstab", "r");
2131 struct mntent
*mnt
= getmntent(fp
);
2132 ASSERT_TRUE(mnt
!= NULL
);
2133 ASSERT_NE(0U, strlen(mnt
->mnt_fsname
));
2134 ASSERT_NE(0U, strlen(mnt
->mnt_dir
));
2135 ASSERT_NE(0U, strlen(mnt
->mnt_type
));
2136 ASSERT_NE(0U, strlen(mnt
->mnt_opts
));
2137 EXPECT_NOT_POISONED(mnt
->mnt_freq
);
2138 EXPECT_NOT_POISONED(mnt
->mnt_passno
);
2143 // There's no getmntent_r() on FreeBSD.
2144 #if !defined(__FreeBSD__)
2145 TEST(MemorySanitizer
, getmntent_r
) {
2146 FILE *fp
= setmntent("/etc/fstab", "r");
2147 struct mntent mntbuf
;
2149 struct mntent
*mnt
= getmntent_r(fp
, &mntbuf
, buf
, sizeof(buf
));
2150 ASSERT_TRUE(mnt
!= NULL
);
2151 ASSERT_NE(0U, strlen(mnt
->mnt_fsname
));
2152 ASSERT_NE(0U, strlen(mnt
->mnt_dir
));
2153 ASSERT_NE(0U, strlen(mnt
->mnt_type
));
2154 ASSERT_NE(0U, strlen(mnt
->mnt_opts
));
2155 EXPECT_NOT_POISONED(mnt
->mnt_freq
);
2156 EXPECT_NOT_POISONED(mnt
->mnt_passno
);
2161 TEST(MemorySanitizer
, ether
) {
2162 const char *asc
= "11:22:33:44:55:66";
2163 struct ether_addr
*paddr
= ether_aton(asc
);
2164 EXPECT_NOT_POISONED(*paddr
);
2166 struct ether_addr addr
;
2167 paddr
= ether_aton_r(asc
, &addr
);
2168 ASSERT_EQ(paddr
, &addr
);
2169 EXPECT_NOT_POISONED(addr
);
2171 char *s
= ether_ntoa(&addr
);
2172 ASSERT_NE(0U, strlen(s
));
2175 s
= ether_ntoa_r(&addr
, buf
);
2177 ASSERT_NE(0U, strlen(buf
));
2180 TEST(MemorySanitizer
, mmap
) {
2181 const int size
= 4096;
2183 p1
= mmap(0, size
, PROT_READ
|PROT_WRITE
, MAP_PRIVATE
|MAP_ANON
, -1, 0);
2184 __msan_poison(p1
, size
);
2186 for (int i
= 0; i
< 1000; i
++) {
2187 p2
= mmap(0, size
, PROT_READ
|PROT_WRITE
, MAP_PRIVATE
|MAP_ANON
, -1, 0);
2194 EXPECT_NOT_POISONED(*(char*)p2
);
2199 // There's no fcvt() on FreeBSD.
2200 #if !defined(__FreeBSD__)
2201 // FIXME: enable and add ecvt.
2202 // FIXME: check why msandr does nt handle fcvt.
2203 TEST(MemorySanitizer
, fcvt
) {
2205 break_optimization(&a
);
2206 break_optimization(&b
);
2209 char *str
= fcvt(12345.6789, 10, &a
, &b
);
2210 EXPECT_NOT_POISONED(a
);
2211 EXPECT_NOT_POISONED(b
);
2212 ASSERT_NE(nullptr, str
);
2213 EXPECT_NOT_POISONED(str
[0]);
2214 ASSERT_NE(0U, strlen(str
));
2218 // There's no fcvt_long() on FreeBSD.
2219 #if !defined(__FreeBSD__)
2220 TEST(MemorySanitizer
, fcvt_long
) {
2222 break_optimization(&a
);
2223 break_optimization(&b
);
2226 char *str
= fcvt(111111112345.6789, 10, &a
, &b
);
2227 EXPECT_NOT_POISONED(a
);
2228 EXPECT_NOT_POISONED(b
);
2229 ASSERT_NE(nullptr, str
);
2230 EXPECT_NOT_POISONED(str
[0]);
2231 ASSERT_NE(0U, strlen(str
));
2235 TEST(MemorySanitizer
, memchr
) {
2237 break_optimization(x
);
2238 EXPECT_POISONED(x
[0]);
2241 EXPECT_UMR(res
= memchr(x
, '2', 10));
2242 EXPECT_NOT_POISONED(res
);
2245 res
= memchr(x
, '2', 10);
2246 EXPECT_EQ(&x
[2], res
);
2247 EXPECT_UMR(res
= memchr(x
, '3', 10));
2248 EXPECT_NOT_POISONED(res
);
2251 TEST(MemorySanitizer
, memrchr
) {
2253 break_optimization(x
);
2254 EXPECT_POISONED(x
[0]);
2257 EXPECT_UMR(res
= memrchr(x
, '9', 10));
2258 EXPECT_NOT_POISONED(res
);
2261 res
= memrchr(x
, '0', 2);
2262 EXPECT_EQ(&x
[0], res
);
2263 EXPECT_UMR(res
= memrchr(x
, '7', 10));
2264 EXPECT_NOT_POISONED(res
);
2267 TEST(MemorySanitizer
, frexp
) {
2269 x
= *GetPoisoned
<int>();
2270 double r
= frexp(1.1, &x
);
2271 EXPECT_NOT_POISONED(r
);
2272 EXPECT_NOT_POISONED(x
);
2274 x
= *GetPoisoned
<int>();
2275 float rf
= frexpf(1.1, &x
);
2276 EXPECT_NOT_POISONED(rf
);
2277 EXPECT_NOT_POISONED(x
);
2279 x
= *GetPoisoned
<int>();
2280 double rl
= frexpl(1.1, &x
);
2281 EXPECT_NOT_POISONED(rl
);
2282 EXPECT_NOT_POISONED(x
);
2289 void SigactionHandler(int signo
, siginfo_t
* si
, void* uc
) {
2290 ASSERT_EQ(signo
, SIGPROF
);
2291 ASSERT_TRUE(si
!= NULL
);
2292 EXPECT_NOT_POISONED(si
->si_errno
);
2293 EXPECT_NOT_POISONED(si
->si_pid
);
2295 # if defined(__x86_64__)
2296 EXPECT_NOT_POISONED(((ucontext_t
*)uc
)->uc_mcontext
.gregs
[REG_RIP
]);
2297 # elif defined(__i386__)
2298 EXPECT_NOT_POISONED(((ucontext_t
*)uc
)->uc_mcontext
.gregs
[REG_EIP
]);
2304 TEST(MemorySanitizer
, sigaction
) {
2305 struct sigaction act
= {};
2306 struct sigaction oldact
= {};
2307 struct sigaction origact
= {};
2309 sigaction(SIGPROF
, 0, &origact
);
2311 act
.sa_flags
|= SA_SIGINFO
;
2312 act
.sa_sigaction
= &SigactionHandler
;
2313 sigaction(SIGPROF
, &act
, 0);
2315 kill(getpid(), SIGPROF
);
2317 act
.sa_flags
&= ~SA_SIGINFO
;
2318 act
.sa_handler
= SIG_DFL
;
2319 sigaction(SIGPROF
, &act
, 0);
2321 act
.sa_flags
&= ~SA_SIGINFO
;
2322 act
.sa_handler
= SIG_IGN
;
2323 sigaction(SIGPROF
, &act
, &oldact
);
2324 EXPECT_FALSE(oldact
.sa_flags
& SA_SIGINFO
);
2325 EXPECT_EQ(SIG_DFL
, oldact
.sa_handler
);
2326 kill(getpid(), SIGPROF
);
2328 act
.sa_flags
|= SA_SIGINFO
;
2329 act
.sa_sigaction
= &SigactionHandler
;
2330 sigaction(SIGPROF
, &act
, &oldact
);
2331 EXPECT_FALSE(oldact
.sa_flags
& SA_SIGINFO
);
2332 EXPECT_EQ(SIG_IGN
, oldact
.sa_handler
);
2333 kill(getpid(), SIGPROF
);
2335 act
.sa_flags
&= ~SA_SIGINFO
;
2336 act
.sa_handler
= SIG_DFL
;
2337 sigaction(SIGPROF
, &act
, &oldact
);
2338 EXPECT_TRUE(oldact
.sa_flags
& SA_SIGINFO
);
2339 EXPECT_EQ(&SigactionHandler
, oldact
.sa_sigaction
);
2342 sigaction(SIGPROF
, &origact
, 0);
2348 TEST(MemorySanitizer
, sigemptyset
) {
2351 int res
= sigemptyset(&s
);
2353 EXPECT_NOT_POISONED(s
);
2356 TEST(MemorySanitizer
, sigfillset
) {
2359 int res
= sigfillset(&s
);
2361 EXPECT_NOT_POISONED(s
);
2364 TEST(MemorySanitizer
, sigpending
) {
2367 int res
= sigpending(&s
);
2369 EXPECT_NOT_POISONED(s
);
2372 TEST(MemorySanitizer
, sigprocmask
) {
2375 int res
= sigprocmask(SIG_BLOCK
, 0, &s
);
2377 EXPECT_NOT_POISONED(s
);
2380 struct StructWithDtor
{
2384 NOINLINE
StructWithDtor::~StructWithDtor() {
2385 break_optimization(0);
2388 TEST(MemorySanitizer
, Invoke
) {
2389 StructWithDtor s
; // Will cause the calls to become invokes.
2390 EXPECT_NOT_POISONED(0);
2391 EXPECT_POISONED(*GetPoisoned
<int>());
2392 EXPECT_NOT_POISONED(0);
2393 EXPECT_POISONED(*GetPoisoned
<int>());
2394 EXPECT_POISONED(ReturnPoisoned
<S4
>());
2397 TEST(MemorySanitizer
, ptrtoint
) {
2398 // Test that shadow is propagated through pointer-to-integer conversion.
2399 unsigned char c
= 0;
2400 __msan_poison(&c
, 1);
2401 uintptr_t u
= (uintptr_t)c
<< 8;
2402 EXPECT_NOT_POISONED(u
& 0xFF00FF);
2403 EXPECT_POISONED(u
& 0xFF00);
2405 break_optimization(&u
);
2408 break_optimization(&p
);
2410 EXPECT_NOT_POISONED(((uintptr_t)p
) & 0xFF00FF);
2411 EXPECT_POISONED(((uintptr_t)p
) & 0xFF00);
2414 static void vaargsfn2(int guard
, ...) {
2416 va_start(vl
, guard
);
2417 EXPECT_NOT_POISONED(va_arg(vl
, int));
2418 EXPECT_NOT_POISONED(va_arg(vl
, int));
2419 EXPECT_NOT_POISONED(va_arg(vl
, int));
2420 EXPECT_POISONED(va_arg(vl
, double));
2424 static void vaargsfn(int guard
, ...) {
2426 va_start(vl
, guard
);
2427 EXPECT_NOT_POISONED(va_arg(vl
, int));
2428 EXPECT_POISONED(va_arg(vl
, int));
2429 // The following call will overwrite __msan_param_tls.
2430 // Checks after it test that arg shadow was somehow saved across the call.
2431 vaargsfn2(1, 2, 3, 4, *GetPoisoned
<double>());
2432 EXPECT_NOT_POISONED(va_arg(vl
, int));
2433 EXPECT_POISONED(va_arg(vl
, int));
2437 TEST(MemorySanitizer
, VAArgTest
) {
2438 int* x
= GetPoisoned
<int>();
2439 int* y
= GetPoisoned
<int>(4);
2440 vaargsfn(1, 13, *x
, 42, *y
);
2443 static void vaargsfn_many(int guard
, ...) {
2445 va_start(vl
, guard
);
2446 EXPECT_NOT_POISONED(va_arg(vl
, int));
2447 EXPECT_POISONED(va_arg(vl
, int));
2448 EXPECT_NOT_POISONED(va_arg(vl
, int));
2449 EXPECT_NOT_POISONED(va_arg(vl
, int));
2450 EXPECT_NOT_POISONED(va_arg(vl
, int));
2451 EXPECT_NOT_POISONED(va_arg(vl
, int));
2452 EXPECT_NOT_POISONED(va_arg(vl
, int));
2453 EXPECT_NOT_POISONED(va_arg(vl
, int));
2454 EXPECT_NOT_POISONED(va_arg(vl
, int));
2455 EXPECT_POISONED(va_arg(vl
, int));
2459 TEST(MemorySanitizer
, VAArgManyTest
) {
2460 int* x
= GetPoisoned
<int>();
2461 int* y
= GetPoisoned
<int>(4);
2462 vaargsfn_many(1, 2, *x
, 3, 4, 5, 6, 7, 8, 9, *y
);
2465 static void vaargsfn_manyfix(int g1
, int g2
, int g3
, int g4
, int g5
, int g6
, int g7
, int g8
, int g9
, ...) {
2468 EXPECT_NOT_POISONED(va_arg(vl
, int));
2469 EXPECT_POISONED(va_arg(vl
, int));
2473 TEST(MemorySanitizer
, VAArgManyFixTest
) {
2474 int* x
= GetPoisoned
<int>();
2475 int* y
= GetPoisoned
<int>();
2476 vaargsfn_manyfix(1, *x
, 3, 4, 5, 6, 7, 8, 9, 10, *y
);
2479 static void vaargsfn_pass2(va_list vl
) {
2480 EXPECT_NOT_POISONED(va_arg(vl
, int));
2481 EXPECT_NOT_POISONED(va_arg(vl
, int));
2482 EXPECT_POISONED(va_arg(vl
, int));
2485 static void vaargsfn_pass(int guard
, ...) {
2487 va_start(vl
, guard
);
2488 EXPECT_POISONED(va_arg(vl
, int));
2493 TEST(MemorySanitizer
, VAArgPass
) {
2494 int* x
= GetPoisoned
<int>();
2495 int* y
= GetPoisoned
<int>(4);
2496 vaargsfn_pass(1, *x
, 2, 3, *y
);
2499 static void vaargsfn_copy2(va_list vl
) {
2500 EXPECT_NOT_POISONED(va_arg(vl
, int));
2501 EXPECT_POISONED(va_arg(vl
, int));
2504 static void vaargsfn_copy(int guard
, ...) {
2506 va_start(vl
, guard
);
2507 EXPECT_NOT_POISONED(va_arg(vl
, int));
2508 EXPECT_POISONED(va_arg(vl
, int));
2511 vaargsfn_copy2(vl2
);
2512 EXPECT_NOT_POISONED(va_arg(vl
, int));
2513 EXPECT_POISONED(va_arg(vl
, int));
2517 TEST(MemorySanitizer
, VAArgCopy
) {
2518 int* x
= GetPoisoned
<int>();
2519 int* y
= GetPoisoned
<int>(4);
2520 vaargsfn_copy(1, 2, *x
, 3, *y
);
2523 static void vaargsfn_ptr(int guard
, ...) {
2525 va_start(vl
, guard
);
2526 EXPECT_NOT_POISONED(va_arg(vl
, int*));
2527 EXPECT_POISONED(va_arg(vl
, int*));
2528 EXPECT_NOT_POISONED(va_arg(vl
, int*));
2529 EXPECT_POISONED(va_arg(vl
, double*));
2533 TEST(MemorySanitizer
, VAArgPtr
) {
2534 int** x
= GetPoisoned
<int*>();
2535 double** y
= GetPoisoned
<double*>(8);
2537 vaargsfn_ptr(1, &z
, *x
, &z
, *y
);
2540 static void vaargsfn_overflow(int guard
, ...) {
2542 va_start(vl
, guard
);
2543 EXPECT_NOT_POISONED(va_arg(vl
, int));
2544 EXPECT_NOT_POISONED(va_arg(vl
, int));
2545 EXPECT_POISONED(va_arg(vl
, int));
2546 EXPECT_NOT_POISONED(va_arg(vl
, int));
2547 EXPECT_NOT_POISONED(va_arg(vl
, int));
2548 EXPECT_NOT_POISONED(va_arg(vl
, int));
2550 EXPECT_NOT_POISONED(va_arg(vl
, double));
2551 EXPECT_NOT_POISONED(va_arg(vl
, double));
2552 EXPECT_NOT_POISONED(va_arg(vl
, double));
2553 EXPECT_POISONED(va_arg(vl
, double));
2554 EXPECT_NOT_POISONED(va_arg(vl
, double));
2555 EXPECT_POISONED(va_arg(vl
, int*));
2556 EXPECT_NOT_POISONED(va_arg(vl
, double));
2557 EXPECT_NOT_POISONED(va_arg(vl
, double));
2559 EXPECT_POISONED(va_arg(vl
, int));
2560 EXPECT_POISONED(va_arg(vl
, double));
2561 EXPECT_POISONED(va_arg(vl
, int*));
2563 EXPECT_NOT_POISONED(va_arg(vl
, int));
2564 EXPECT_NOT_POISONED(va_arg(vl
, double));
2565 EXPECT_NOT_POISONED(va_arg(vl
, int*));
2567 EXPECT_POISONED(va_arg(vl
, int));
2568 EXPECT_POISONED(va_arg(vl
, double));
2569 EXPECT_POISONED(va_arg(vl
, int*));
2574 TEST(MemorySanitizer
, VAArgOverflow
) {
2575 int* x
= GetPoisoned
<int>();
2576 double* y
= GetPoisoned
<double>(8);
2577 int** p
= GetPoisoned
<int*>(16);
2579 vaargsfn_overflow(1,
2581 1.1, 2.2, 3.3, *y
, 5.5, *p
, 7.7, 8.8,
2582 // the following args will overflow for sure
2588 static void vaargsfn_tlsoverwrite2(int guard
, ...) {
2590 va_start(vl
, guard
);
2591 for (int i
= 0; i
< 20; ++i
)
2592 EXPECT_NOT_POISONED(va_arg(vl
, int));
2596 static void vaargsfn_tlsoverwrite(int guard
, ...) {
2597 // This call will overwrite TLS contents unless it's backed up somewhere.
2598 vaargsfn_tlsoverwrite2(2,
2602 42, 42, 42, 42, 42); // 20x
2604 va_start(vl
, guard
);
2605 for (int i
= 0; i
< 20; ++i
)
2606 EXPECT_POISONED(va_arg(vl
, int));
2610 TEST(MemorySanitizer
, VAArgTLSOverwrite
) {
2611 int* x
= GetPoisoned
<int>();
2612 vaargsfn_tlsoverwrite(1,
2616 *x
, *x
, *x
, *x
, *x
); // 20x
2620 struct StructByVal
{
2621 int a
, b
, c
, d
, e
, f
;
2624 static void vaargsfn_structbyval(int guard
, ...) {
2626 va_start(vl
, guard
);
2628 StructByVal s
= va_arg(vl
, StructByVal
);
2629 EXPECT_NOT_POISONED(s
.a
);
2630 EXPECT_POISONED(s
.b
);
2631 EXPECT_NOT_POISONED(s
.c
);
2632 EXPECT_POISONED(s
.d
);
2633 EXPECT_NOT_POISONED(s
.e
);
2634 EXPECT_POISONED(s
.f
);
2637 StructByVal s
= va_arg(vl
, StructByVal
);
2638 EXPECT_NOT_POISONED(s
.a
);
2639 EXPECT_POISONED(s
.b
);
2640 EXPECT_NOT_POISONED(s
.c
);
2641 EXPECT_POISONED(s
.d
);
2642 EXPECT_NOT_POISONED(s
.e
);
2643 EXPECT_POISONED(s
.f
);
2648 TEST(MemorySanitizer
, VAArgStructByVal
) {
2651 s
.b
= *GetPoisoned
<int>();
2653 s
.d
= *GetPoisoned
<int>();
2655 s
.f
= *GetPoisoned
<int>();
2656 vaargsfn_structbyval(0, s
, s
);
2659 NOINLINE
void StructByValTestFunc(struct StructByVal s
) {
2660 EXPECT_NOT_POISONED(s
.a
);
2661 EXPECT_POISONED(s
.b
);
2662 EXPECT_NOT_POISONED(s
.c
);
2663 EXPECT_POISONED(s
.d
);
2664 EXPECT_NOT_POISONED(s
.e
);
2665 EXPECT_POISONED(s
.f
);
2668 NOINLINE
void StructByValTestFunc1(struct StructByVal s
) {
2669 StructByValTestFunc(s
);
2672 NOINLINE
void StructByValTestFunc2(int z
, struct StructByVal s
) {
2673 StructByValTestFunc(s
);
2676 TEST(MemorySanitizer
, StructByVal
) {
2677 // Large aggregates are passed as "byval" pointer argument in LLVM.
2678 struct StructByVal s
;
2680 s
.b
= *GetPoisoned
<int>();
2682 s
.d
= *GetPoisoned
<int>();
2684 s
.f
= *GetPoisoned
<int>();
2685 StructByValTestFunc(s
);
2686 StructByValTestFunc1(s
);
2687 StructByValTestFunc2(0, s
);
2692 NOINLINE __m128i
m128Eq(__m128i
*a
, __m128i
*b
) { return _mm_cmpeq_epi16(*a
, *b
); }
2693 NOINLINE __m128i
m128Lt(__m128i
*a
, __m128i
*b
) { return _mm_cmplt_epi16(*a
, *b
); }
2694 TEST(MemorySanitizer
, m128
) {
2695 __m128i a
= _mm_set1_epi16(0x1234);
2696 __m128i b
= _mm_set1_epi16(0x7890);
2697 EXPECT_NOT_POISONED(m128Eq(&a
, &b
));
2698 EXPECT_NOT_POISONED(m128Lt(&a
, &b
));
2700 // FIXME: add more tests for __m128i.
2701 #endif // MSAN_HAS_M128
2703 // We should not complain when copying this poisoned hole.
2704 struct StructWithHole
{
2710 NOINLINE StructWithHole
ReturnStructWithHole() {
2712 __msan_poison(&res
, sizeof(res
));
2718 TEST(MemorySanitizer
, StructWithHole
) {
2719 StructWithHole a
= ReturnStructWithHole();
2720 break_optimization(&a
);
2724 NOINLINE T
ReturnStruct() {
2726 __msan_poison(&res
, sizeof(res
));
2732 NOINLINE
void TestReturnStruct() {
2733 T s1
= ReturnStruct
<T
>();
2734 EXPECT_NOT_POISONED(s1
.a
);
2735 EXPECT_POISONED(s1
.b
);
2768 TEST(MemorySanitizer
, IntStruct3
) {
2769 TestReturnStruct
<SSS1
>();
2770 TestReturnStruct
<SSS2
>();
2771 TestReturnStruct
<SSS3
>();
2772 TestReturnStruct
<SSS4
>();
2773 TestReturnStruct
<SSS5
>();
2774 TestReturnStruct
<SSS6
>();
2775 TestReturnStruct
<SSS7
>();
2776 TestReturnStruct
<SSS8
>();
2786 NOINLINE LongStruct
ReturnLongStruct1() {
2788 __msan_poison(&res
, sizeof(res
));
2789 res
.a1
= res
.a2
= res
.a4
= res
.a8
= 111;
2790 // leaves b1, .., b8 poisoned.
2794 NOINLINE LongStruct
ReturnLongStruct2() {
2796 __msan_poison(&res
, sizeof(res
));
2797 res
.b1
= res
.b2
= res
.b4
= res
.b8
= 111;
2798 // leaves a1, .., a8 poisoned.
2802 TEST(MemorySanitizer
, LongStruct
) {
2803 LongStruct s1
= ReturnLongStruct1();
2804 __msan_print_shadow(&s1
, sizeof(s1
));
2805 EXPECT_NOT_POISONED(s1
.a1
);
2806 EXPECT_NOT_POISONED(s1
.a2
);
2807 EXPECT_NOT_POISONED(s1
.a4
);
2808 EXPECT_NOT_POISONED(s1
.a8
);
2810 EXPECT_POISONED(s1
.b1
);
2811 EXPECT_POISONED(s1
.b2
);
2812 EXPECT_POISONED(s1
.b4
);
2813 EXPECT_POISONED(s1
.b8
);
2815 LongStruct s2
= ReturnLongStruct2();
2816 __msan_print_shadow(&s2
, sizeof(s2
));
2817 EXPECT_NOT_POISONED(s2
.b1
);
2818 EXPECT_NOT_POISONED(s2
.b2
);
2819 EXPECT_NOT_POISONED(s2
.b4
);
2820 EXPECT_NOT_POISONED(s2
.b8
);
2822 EXPECT_POISONED(s2
.a1
);
2823 EXPECT_POISONED(s2
.a2
);
2824 EXPECT_POISONED(s2
.a4
);
2825 EXPECT_POISONED(s2
.a8
);
2829 #define MSAN_TEST_PRLIMIT __GLIBC_PREREQ(2, 13)
2831 #define MSAN_TEST_PRLIMIT 1
2834 TEST(MemorySanitizer
, getrlimit
) {
2835 struct rlimit limit
;
2836 __msan_poison(&limit
, sizeof(limit
));
2837 int result
= getrlimit(RLIMIT_DATA
, &limit
);
2838 ASSERT_EQ(result
, 0);
2839 EXPECT_NOT_POISONED(limit
.rlim_cur
);
2840 EXPECT_NOT_POISONED(limit
.rlim_max
);
2842 #if MSAN_TEST_PRLIMIT
2843 struct rlimit limit2
;
2844 __msan_poison(&limit2
, sizeof(limit2
));
2845 result
= prlimit(getpid(), RLIMIT_DATA
, &limit
, &limit2
);
2846 ASSERT_EQ(result
, 0);
2847 EXPECT_NOT_POISONED(limit2
.rlim_cur
);
2848 EXPECT_NOT_POISONED(limit2
.rlim_max
);
2850 __msan_poison(&limit
, sizeof(limit
));
2851 result
= prlimit(getpid(), RLIMIT_DATA
, nullptr, &limit
);
2852 ASSERT_EQ(result
, 0);
2853 EXPECT_NOT_POISONED(limit
.rlim_cur
);
2854 EXPECT_NOT_POISONED(limit
.rlim_max
);
2856 result
= prlimit(getpid(), RLIMIT_DATA
, &limit
, nullptr);
2857 ASSERT_EQ(result
, 0);
2861 TEST(MemorySanitizer
, getrusage
) {
2862 struct rusage usage
;
2863 __msan_poison(&usage
, sizeof(usage
));
2864 int result
= getrusage(RUSAGE_SELF
, &usage
);
2865 ASSERT_EQ(result
, 0);
2866 EXPECT_NOT_POISONED(usage
.ru_utime
.tv_sec
);
2867 EXPECT_NOT_POISONED(usage
.ru_utime
.tv_usec
);
2868 EXPECT_NOT_POISONED(usage
.ru_stime
.tv_sec
);
2869 EXPECT_NOT_POISONED(usage
.ru_stime
.tv_usec
);
2870 EXPECT_NOT_POISONED(usage
.ru_maxrss
);
2871 EXPECT_NOT_POISONED(usage
.ru_minflt
);
2872 EXPECT_NOT_POISONED(usage
.ru_majflt
);
2873 EXPECT_NOT_POISONED(usage
.ru_inblock
);
2874 EXPECT_NOT_POISONED(usage
.ru_oublock
);
2875 EXPECT_NOT_POISONED(usage
.ru_nvcsw
);
2876 EXPECT_NOT_POISONED(usage
.ru_nivcsw
);
2879 #if defined(__FreeBSD__)
2880 static void GetProgramPath(char *buf
, size_t sz
) {
2881 int mib
[4] = { CTL_KERN
, KERN_PROC
, KERN_PROC_PATHNAME
, -1 };
2882 int res
= sysctl(mib
, 4, buf
, &sz
, NULL
, 0);
2885 #elif defined(__GLIBC__)
2886 static void GetProgramPath(char *buf
, size_t sz
) {
2887 extern char *program_invocation_name
;
2888 int res
= snprintf(buf
, sz
, "%s", program_invocation_name
);
2890 ASSERT_LT((size_t)res
, sz
);
2893 # error "TODO: port this"
2896 static void dladdr_testfn() {}
2898 TEST(MemorySanitizer
, dladdr
) {
2900 __msan_poison(&info
, sizeof(info
));
2901 int result
= dladdr((const void*)dladdr_testfn
, &info
);
2902 ASSERT_NE(result
, 0);
2903 EXPECT_NOT_POISONED((unsigned long)info
.dli_fname
);
2905 EXPECT_NOT_POISONED(strlen(info
.dli_fname
));
2906 EXPECT_NOT_POISONED((unsigned long)info
.dli_fbase
);
2907 EXPECT_NOT_POISONED((unsigned long)info
.dli_sname
);
2909 EXPECT_NOT_POISONED(strlen(info
.dli_sname
));
2910 EXPECT_NOT_POISONED((unsigned long)info
.dli_saddr
);
2913 #ifndef MSAN_TEST_DISABLE_DLOPEN
2915 static int dl_phdr_callback(struct dl_phdr_info
*info
, size_t size
, void *data
) {
2917 EXPECT_NOT_POISONED(info
->dlpi_addr
);
2918 EXPECT_NOT_POISONED(strlen(info
->dlpi_name
));
2919 EXPECT_NOT_POISONED(info
->dlpi_phnum
);
2920 for (int i
= 0; i
< info
->dlpi_phnum
; ++i
)
2921 EXPECT_NOT_POISONED(info
->dlpi_phdr
[i
]);
2925 // Compute the path to our loadable DSO. We assume it's in the same
2926 // directory. Only use string routines that we intercept so far to do this.
2927 static void GetPathToLoadable(char *buf
, size_t sz
) {
2928 char program_path
[kMaxPathLength
];
2929 GetProgramPath(program_path
, sizeof(program_path
));
2931 const char *last_slash
= strrchr(program_path
, '/');
2932 ASSERT_NE(nullptr, last_slash
);
2933 size_t dir_len
= (size_t)(last_slash
- program_path
);
2934 #if defined(__x86_64__)
2935 static const char basename
[] = "libmsan_loadable.x86_64.so";
2936 #elif defined(__MIPSEB__) || defined(MIPSEB)
2937 static const char basename
[] = "libmsan_loadable.mips64.so";
2938 #elif defined(__mips64)
2939 static const char basename
[] = "libmsan_loadable.mips64el.so";
2940 #elif defined(__aarch64__)
2941 static const char basename
[] = "libmsan_loadable.aarch64.so";
2942 #elif defined(__powerpc64__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
2943 static const char basename
[] = "libmsan_loadable.powerpc64.so";
2944 #elif defined(__powerpc64__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
2945 static const char basename
[] = "libmsan_loadable.powerpc64le.so";
2947 int res
= snprintf(buf
, sz
, "%.*s/%s",
2948 (int)dir_len
, program_path
, basename
);
2950 ASSERT_LT((size_t)res
, sz
);
2953 TEST(MemorySanitizer
, dl_iterate_phdr
) {
2954 char path
[kMaxPathLength
];
2955 GetPathToLoadable(path
, sizeof(path
));
2957 // Having at least one dlopen'ed library in the process makes this more
2959 void *lib
= dlopen(path
, RTLD_LAZY
);
2960 ASSERT_NE((void*)0, lib
);
2963 int result
= dl_iterate_phdr(dl_phdr_callback
, &count
);
2964 ASSERT_GT(count
, 0);
2969 TEST(MemorySanitizer
, dlopen
) {
2970 char path
[kMaxPathLength
];
2971 GetPathToLoadable(path
, sizeof(path
));
2973 // We need to clear shadow for globals when doing dlopen. In order to test
2974 // this, we have to poison the shadow for the DSO before we load it. In
2975 // general this is difficult, but the loader tends to reload things in the
2976 // same place, so we open, close, and then reopen. The global should always
2977 // start out clean after dlopen.
2978 for (int i
= 0; i
< 2; i
++) {
2979 void *lib
= dlopen(path
, RTLD_LAZY
);
2981 printf("dlerror: %s\n", dlerror());
2982 ASSERT_TRUE(lib
!= NULL
);
2984 void **(*get_dso_global
)() = (void **(*)())dlsym(lib
, "get_dso_global");
2985 ASSERT_TRUE(get_dso_global
!= NULL
);
2986 void **dso_global
= get_dso_global();
2987 EXPECT_NOT_POISONED(*dso_global
);
2988 __msan_poison(dso_global
, sizeof(*dso_global
));
2989 EXPECT_POISONED(*dso_global
);
2994 // Regression test for a crash in dlopen() interceptor.
2995 TEST(MemorySanitizer
, dlopenFailed
) {
2996 const char *path
= "/libmsan_loadable_does_not_exist.so";
2997 void *lib
= dlopen(path
, RTLD_LAZY
);
2998 ASSERT_TRUE(lib
== NULL
);
3001 #endif // MSAN_TEST_DISABLE_DLOPEN
3003 // There's no sched_getaffinity() on FreeBSD.
3004 #if !defined(__FreeBSD__)
3005 TEST(MemorySanitizer
, sched_getaffinity
) {
3007 int res
= sched_getaffinity(getpid(), sizeof(mask
), &mask
);
3009 EXPECT_NOT_POISONED(mask
);
3013 TEST(MemorySanitizer
, scanf
) {
3014 const char *input
= "42 hello";
3016 char* s
= new char[7];
3017 int res
= sscanf(input
, "%d %5s", d
, s
);
3018 printf("res %d\n", res
);
3020 EXPECT_NOT_POISONED(*d
);
3021 EXPECT_NOT_POISONED(s
[0]);
3022 EXPECT_NOT_POISONED(s
[1]);
3023 EXPECT_NOT_POISONED(s
[2]);
3024 EXPECT_NOT_POISONED(s
[3]);
3025 EXPECT_NOT_POISONED(s
[4]);
3026 EXPECT_NOT_POISONED(s
[5]);
3027 EXPECT_POISONED(s
[6]);
3032 static void *SimpleThread_threadfn(void* data
) {
3036 TEST(MemorySanitizer
, SimpleThread
) {
3039 int res
= pthread_create(&t
, NULL
, SimpleThread_threadfn
, NULL
);
3041 EXPECT_NOT_POISONED(t
);
3042 res
= pthread_join(t
, &p
);
3044 EXPECT_NOT_POISONED(p
);
3048 static void *SmallStackThread_threadfn(void* data
) {
3052 #ifdef PTHREAD_STACK_MIN
3053 # define SMALLSTACKSIZE PTHREAD_STACK_MIN
3054 # define SMALLPRESTACKSIZE PTHREAD_STACK_MIN
3056 # define SMALLSTACKSIZE 64 * 1024
3057 # define SMALLPRESTACKSIZE 16 * 1024
3060 TEST(MemorySanitizer
, SmallStackThread
) {
3061 pthread_attr_t attr
;
3065 res
= pthread_attr_init(&attr
);
3067 res
= pthread_attr_setstacksize(&attr
, SMALLSTACKSIZE
);
3069 res
= pthread_create(&t
, &attr
, SmallStackThread_threadfn
, NULL
);
3071 res
= pthread_join(t
, &p
);
3073 res
= pthread_attr_destroy(&attr
);
3077 TEST(MemorySanitizer
, SmallPreAllocatedStackThread
) {
3078 pthread_attr_t attr
;
3081 res
= pthread_attr_init(&attr
);
3084 const size_t kStackSize
= SMALLPRESTACKSIZE
;
3085 res
= posix_memalign(&stack
, 4096, kStackSize
);
3087 res
= pthread_attr_setstack(&attr
, stack
, kStackSize
);
3089 res
= pthread_create(&t
, &attr
, SmallStackThread_threadfn
, NULL
);
3091 res
= pthread_join(t
, NULL
);
3093 res
= pthread_attr_destroy(&attr
);
3097 TEST(MemorySanitizer
, pthread_attr_get
) {
3098 pthread_attr_t attr
;
3100 res
= pthread_attr_init(&attr
);
3104 res
= pthread_attr_getdetachstate(&attr
, &v
);
3106 EXPECT_NOT_POISONED(v
);
3110 res
= pthread_attr_getguardsize(&attr
, &v
);
3112 EXPECT_NOT_POISONED(v
);
3115 struct sched_param v
;
3116 res
= pthread_attr_getschedparam(&attr
, &v
);
3118 EXPECT_NOT_POISONED(v
);
3122 res
= pthread_attr_getschedpolicy(&attr
, &v
);
3124 EXPECT_NOT_POISONED(v
);
3128 res
= pthread_attr_getinheritsched(&attr
, &v
);
3130 EXPECT_NOT_POISONED(v
);
3134 res
= pthread_attr_getscope(&attr
, &v
);
3136 EXPECT_NOT_POISONED(v
);
3140 res
= pthread_attr_getstacksize(&attr
, &v
);
3142 EXPECT_NOT_POISONED(v
);
3147 res
= pthread_attr_getstack(&attr
, &v
, &w
);
3149 EXPECT_NOT_POISONED(v
);
3150 EXPECT_NOT_POISONED(w
);
3154 res
= pthread_attr_getaffinity_np(&attr
, sizeof(v
), &v
);
3156 EXPECT_NOT_POISONED(v
);
3158 res
= pthread_attr_destroy(&attr
);
3162 TEST(MemorySanitizer
, pthread_getschedparam
) {
3164 struct sched_param param
;
3165 int res
= pthread_getschedparam(pthread_self(), &policy
, ¶m
);
3167 EXPECT_NOT_POISONED(policy
);
3168 EXPECT_NOT_POISONED(param
.sched_priority
);
3171 TEST(MemorySanitizer
, pthread_key_create
) {
3173 int res
= pthread_key_create(&key
, NULL
);
3175 EXPECT_NOT_POISONED(key
);
3176 res
= pthread_key_delete(key
);
3181 struct SignalCondArg
{
3182 pthread_cond_t
* cond
;
3183 pthread_mutex_t
* mu
;
3187 void *SignalCond(void *param
) {
3188 SignalCondArg
*arg
= reinterpret_cast<SignalCondArg
*>(param
);
3189 pthread_mutex_lock(arg
->mu
);
3191 pthread_cond_broadcast(arg
->cond
);
3193 pthread_cond_signal(arg
->cond
);
3194 pthread_mutex_unlock(arg
->mu
);
3199 TEST(MemorySanitizer
, pthread_cond_wait
) {
3200 pthread_cond_t cond
;
3202 SignalCondArg args
= {&cond
, &mu
, false};
3203 pthread_cond_init(&cond
, 0);
3204 pthread_mutex_init(&mu
, 0);
3205 pthread_mutex_lock(&mu
);
3209 pthread_create(&thr
, 0, SignalCond
, &args
);
3210 int res
= pthread_cond_wait(&cond
, &mu
);
3212 pthread_join(thr
, 0);
3215 args
.broadcast
= true;
3216 pthread_create(&thr
, 0, SignalCond
, &args
);
3217 res
= pthread_cond_wait(&cond
, &mu
);
3219 pthread_join(thr
, 0);
3221 pthread_mutex_unlock(&mu
);
3222 pthread_mutex_destroy(&mu
);
3223 pthread_cond_destroy(&cond
);
3226 TEST(MemorySanitizer
, tmpnam
) {
3228 char *res
= tmpnam(s
);
3230 EXPECT_NOT_POISONED(strlen(res
));
3233 TEST(MemorySanitizer
, tempnam
) {
3234 char *res
= tempnam(NULL
, "zzz");
3235 EXPECT_NOT_POISONED(strlen(res
));
3239 TEST(MemorySanitizer
, posix_memalign
) {
3242 int res
= posix_memalign(&p
, 4096, 13);
3244 EXPECT_NOT_POISONED(p
);
3245 EXPECT_EQ(0U, (uintptr_t)p
% 4096);
3249 // There's no memalign() on FreeBSD.
3250 #if !defined(__FreeBSD__)
3251 TEST(MemorySanitizer
, memalign
) {
3252 void *p
= memalign(4096, 13);
3253 EXPECT_EQ(0U, (uintptr_t)p
% 4096);
3258 TEST(MemorySanitizer
, valloc
) {
3259 void *a
= valloc(100);
3260 uintptr_t PageSize
= GetPageSize();
3261 EXPECT_EQ(0U, (uintptr_t)a
% PageSize
);
3265 // There's no pvalloc() on FreeBSD.
3266 #if !defined(__FreeBSD__)
3267 TEST(MemorySanitizer
, pvalloc
) {
3268 uintptr_t PageSize
= GetPageSize();
3269 void *p
= pvalloc(PageSize
+ 100);
3270 EXPECT_EQ(0U, (uintptr_t)p
% PageSize
);
3271 EXPECT_EQ(2 * PageSize
, __sanitizer_get_allocated_size(p
));
3274 p
= pvalloc(0); // pvalloc(0) should allocate at least one page.
3275 EXPECT_EQ(0U, (uintptr_t)p
% PageSize
);
3276 EXPECT_EQ(PageSize
, __sanitizer_get_allocated_size(p
));
3281 TEST(MemorySanitizer
, inet_pton
) {
3282 const char *s
= "1:0:0:0:0:0:0:8";
3283 unsigned char buf
[sizeof(struct in6_addr
)];
3284 int res
= inet_pton(AF_INET6
, s
, buf
);
3286 EXPECT_NOT_POISONED(buf
[0]);
3287 EXPECT_NOT_POISONED(buf
[sizeof(struct in6_addr
) - 1]);
3289 char s_out
[INET6_ADDRSTRLEN
];
3290 EXPECT_POISONED(s_out
[3]);
3291 const char *q
= inet_ntop(AF_INET6
, buf
, s_out
, INET6_ADDRSTRLEN
);
3292 ASSERT_NE((void*)0, q
);
3293 EXPECT_NOT_POISONED(s_out
[3]);
3296 TEST(MemorySanitizer
, inet_aton
) {
3297 const char *s
= "127.0.0.1";
3298 struct in_addr in
[2];
3299 int res
= inet_aton(s
, in
);
3301 EXPECT_NOT_POISONED(in
[0]);
3302 EXPECT_POISONED(*(char *)(in
+ 1));
3305 TEST(MemorySanitizer
, uname
) {
3307 int res
= uname(&u
);
3309 EXPECT_NOT_POISONED(strlen(u
.sysname
));
3310 EXPECT_NOT_POISONED(strlen(u
.nodename
));
3311 EXPECT_NOT_POISONED(strlen(u
.release
));
3312 EXPECT_NOT_POISONED(strlen(u
.version
));
3313 EXPECT_NOT_POISONED(strlen(u
.machine
));
3316 TEST(MemorySanitizer
, gethostname
) {
3318 int res
= gethostname(buf
, 100);
3320 EXPECT_NOT_POISONED(strlen(buf
));
3323 // There's no sysinfo() on FreeBSD.
3324 #if !defined(__FreeBSD__)
3325 TEST(MemorySanitizer
, sysinfo
) {
3326 struct sysinfo info
;
3327 int res
= sysinfo(&info
);
3329 EXPECT_NOT_POISONED(info
);
3333 TEST(MemorySanitizer
, getpwuid
) {
3334 struct passwd
*p
= getpwuid(0); // root
3335 ASSERT_TRUE(p
!= NULL
);
3336 EXPECT_NOT_POISONED(p
->pw_name
);
3337 ASSERT_TRUE(p
->pw_name
!= NULL
);
3338 EXPECT_NOT_POISONED(p
->pw_name
[0]);
3339 EXPECT_NOT_POISONED(p
->pw_uid
);
3340 ASSERT_EQ(0U, p
->pw_uid
);
3343 TEST(MemorySanitizer
, getpwuid_r
) {
3345 struct passwd
*pwdres
;
3347 int res
= getpwuid_r(0, &pwd
, buf
, sizeof(buf
), &pwdres
);
3349 EXPECT_NOT_POISONED(pwd
.pw_name
);
3350 ASSERT_TRUE(pwd
.pw_name
!= NULL
);
3351 EXPECT_NOT_POISONED(pwd
.pw_name
[0]);
3352 EXPECT_NOT_POISONED(pwd
.pw_uid
);
3353 ASSERT_EQ(0U, pwd
.pw_uid
);
3354 EXPECT_NOT_POISONED(pwdres
);
3357 TEST(MemorySanitizer
, getpwnam_r
) {
3359 struct passwd
*pwdres
;
3361 int res
= getpwnam_r("root", &pwd
, buf
, sizeof(buf
), &pwdres
);
3363 EXPECT_NOT_POISONED(pwd
.pw_name
);
3364 ASSERT_TRUE(pwd
.pw_name
!= NULL
);
3365 EXPECT_NOT_POISONED(pwd
.pw_name
[0]);
3366 EXPECT_NOT_POISONED(pwd
.pw_uid
);
3367 ASSERT_EQ(0U, pwd
.pw_uid
);
3368 EXPECT_NOT_POISONED(pwdres
);
3371 TEST(MemorySanitizer
, getpwnam_r_positive
) {
3373 struct passwd
*pwdres
;
3375 strncpy(s
, "abcd", 5);
3376 __msan_poison(s
, 5);
3379 EXPECT_UMR(res
= getpwnam_r(s
, &pwd
, buf
, sizeof(buf
), &pwdres
));
3382 TEST(MemorySanitizer
, getgrnam_r
) {
3384 struct group
*grpres
;
3386 int res
= getgrnam_r(SUPERUSER_GROUP
, &grp
, buf
, sizeof(buf
), &grpres
);
3388 // Note that getgrnam_r() returns 0 if the matching group is not found.
3389 ASSERT_NE(nullptr, grpres
);
3390 EXPECT_NOT_POISONED(grp
.gr_name
);
3391 ASSERT_TRUE(grp
.gr_name
!= NULL
);
3392 EXPECT_NOT_POISONED(grp
.gr_name
[0]);
3393 EXPECT_NOT_POISONED(grp
.gr_gid
);
3394 EXPECT_NOT_POISONED(grpres
);
3397 TEST(MemorySanitizer
, getpwent
) {
3399 struct passwd
*p
= getpwent();
3400 ASSERT_TRUE(p
!= NULL
);
3401 EXPECT_NOT_POISONED(p
->pw_name
);
3402 ASSERT_TRUE(p
->pw_name
!= NULL
);
3403 EXPECT_NOT_POISONED(p
->pw_name
[0]);
3404 EXPECT_NOT_POISONED(p
->pw_uid
);
3407 TEST(MemorySanitizer
, getpwent_r
) {
3409 struct passwd
*pwdres
;
3412 int res
= getpwent_r(&pwd
, buf
, sizeof(buf
), &pwdres
);
3414 EXPECT_NOT_POISONED(pwd
.pw_name
);
3415 ASSERT_TRUE(pwd
.pw_name
!= NULL
);
3416 EXPECT_NOT_POISONED(pwd
.pw_name
[0]);
3417 EXPECT_NOT_POISONED(pwd
.pw_uid
);
3418 EXPECT_NOT_POISONED(pwdres
);
3421 // There's no fgetpwent() on FreeBSD.
3422 #if !defined(__FreeBSD__)
3423 TEST(MemorySanitizer
, fgetpwent
) {
3424 FILE *fp
= fopen("/etc/passwd", "r");
3425 struct passwd
*p
= fgetpwent(fp
);
3426 ASSERT_TRUE(p
!= NULL
);
3427 EXPECT_NOT_POISONED(p
->pw_name
);
3428 ASSERT_TRUE(p
->pw_name
!= NULL
);
3429 EXPECT_NOT_POISONED(p
->pw_name
[0]);
3430 EXPECT_NOT_POISONED(p
->pw_uid
);
3435 TEST(MemorySanitizer
, getgrent
) {
3437 struct group
*p
= getgrent();
3438 ASSERT_TRUE(p
!= NULL
);
3439 EXPECT_NOT_POISONED(p
->gr_name
);
3440 ASSERT_TRUE(p
->gr_name
!= NULL
);
3441 EXPECT_NOT_POISONED(p
->gr_name
[0]);
3442 EXPECT_NOT_POISONED(p
->gr_gid
);
3445 // There's no fgetgrent() on FreeBSD.
3446 #if !defined(__FreeBSD__)
3447 TEST(MemorySanitizer
, fgetgrent
) {
3448 FILE *fp
= fopen("/etc/group", "r");
3449 struct group
*grp
= fgetgrent(fp
);
3450 ASSERT_TRUE(grp
!= NULL
);
3451 EXPECT_NOT_POISONED(grp
->gr_name
);
3452 ASSERT_TRUE(grp
->gr_name
!= NULL
);
3453 EXPECT_NOT_POISONED(grp
->gr_name
[0]);
3454 EXPECT_NOT_POISONED(grp
->gr_gid
);
3455 for (char **p
= grp
->gr_mem
; *p
; ++p
) {
3456 EXPECT_NOT_POISONED((*p
)[0]);
3457 EXPECT_TRUE(strlen(*p
) > 0);
3463 TEST(MemorySanitizer
, getgrent_r
) {
3465 struct group
*grpres
;
3468 int res
= getgrent_r(&grp
, buf
, sizeof(buf
), &grpres
);
3470 EXPECT_NOT_POISONED(grp
.gr_name
);
3471 ASSERT_TRUE(grp
.gr_name
!= NULL
);
3472 EXPECT_NOT_POISONED(grp
.gr_name
[0]);
3473 EXPECT_NOT_POISONED(grp
.gr_gid
);
3474 EXPECT_NOT_POISONED(grpres
);
3477 // There's no fgetgrent_r() on FreeBSD.
3478 #if !defined(__FreeBSD__)
3479 TEST(MemorySanitizer
, fgetgrent_r
) {
3480 FILE *fp
= fopen("/etc/group", "r");
3482 struct group
*grpres
;
3485 int res
= fgetgrent_r(fp
, &grp
, buf
, sizeof(buf
), &grpres
);
3487 EXPECT_NOT_POISONED(grp
.gr_name
);
3488 ASSERT_TRUE(grp
.gr_name
!= NULL
);
3489 EXPECT_NOT_POISONED(grp
.gr_name
[0]);
3490 EXPECT_NOT_POISONED(grp
.gr_gid
);
3491 EXPECT_NOT_POISONED(grpres
);
3496 TEST(MemorySanitizer
, getgroups
) {
3497 int n
= getgroups(0, 0);
3498 gid_t
*gids
= new gid_t
[n
];
3499 int res
= getgroups(n
, gids
);
3501 for (int i
= 0; i
< n
; ++i
)
3502 EXPECT_NOT_POISONED(gids
[i
]);
3505 TEST(MemorySanitizer
, wordexp
) {
3507 int res
= wordexp("a b c", &w
, 0);
3509 ASSERT_EQ(3U, w
.we_wordc
);
3510 ASSERT_STREQ("a", w
.we_wordv
[0]);
3511 ASSERT_STREQ("b", w
.we_wordv
[1]);
3512 ASSERT_STREQ("c", w
.we_wordv
[2]);
3516 static bool applySlt(T value
, T shadow
) {
3517 __msan_partial_poison(&value
, &shadow
, sizeof(T
));
3518 volatile bool zzz
= true;
3519 // This "|| zzz" trick somehow makes LLVM emit "icmp slt" instead of
3520 // a shift-and-trunc to get at the highest bit.
3521 volatile bool v
= value
< 0 || zzz
;
3525 TEST(MemorySanitizer
, SignedCompareWithZero
) {
3526 EXPECT_NOT_POISONED(applySlt
<S4
>(0xF, 0xF));
3527 EXPECT_NOT_POISONED(applySlt
<S4
>(0xF, 0xFF));
3528 EXPECT_NOT_POISONED(applySlt
<S4
>(0xF, 0xFFFFFF));
3529 EXPECT_NOT_POISONED(applySlt
<S4
>(0xF, 0x7FFFFFF));
3530 EXPECT_UMR(applySlt
<S4
>(0xF, 0x80FFFFFF));
3531 EXPECT_UMR(applySlt
<S4
>(0xF, 0xFFFFFFFF));
3534 template <class T
, class S
>
3535 static T
poisoned(T Va
, S Sa
) {
3536 char SIZE_CHECK1
[(ssize_t
)sizeof(T
) - (ssize_t
)sizeof(S
)];
3537 char SIZE_CHECK2
[(ssize_t
)sizeof(S
) - (ssize_t
)sizeof(T
)];
3540 __msan_partial_poison(&a
, &Sa
, sizeof(T
));
3544 TEST(MemorySanitizer
, ICmpRelational
) {
3545 EXPECT_NOT_POISONED(poisoned(0, 0) < poisoned(0, 0));
3546 EXPECT_NOT_POISONED(poisoned(0U, 0) < poisoned(0U, 0));
3547 EXPECT_NOT_POISONED(poisoned(0LL, 0LLU) < poisoned(0LL, 0LLU));
3548 EXPECT_NOT_POISONED(poisoned(0LLU, 0LLU) < poisoned(0LLU, 0LLU));
3549 EXPECT_POISONED(poisoned(0xFF, 0xFF) < poisoned(0xFF, 0xFF));
3550 EXPECT_POISONED(poisoned(0xFFFFFFFFU
, 0xFFFFFFFFU
) <
3551 poisoned(0xFFFFFFFFU
, 0xFFFFFFFFU
));
3552 EXPECT_POISONED(poisoned(-1, 0xFFFFFFFFU
) <
3553 poisoned(-1, 0xFFFFFFFFU
));
3555 EXPECT_NOT_POISONED(poisoned(0, 0) <= poisoned(0, 0));
3556 EXPECT_NOT_POISONED(poisoned(0U, 0) <= poisoned(0U, 0));
3557 EXPECT_NOT_POISONED(poisoned(0LL, 0LLU) <= poisoned(0LL, 0LLU));
3558 EXPECT_NOT_POISONED(poisoned(0LLU, 0LLU) <= poisoned(0LLU, 0LLU));
3559 EXPECT_POISONED(poisoned(0xFF, 0xFF) <= poisoned(0xFF, 0xFF));
3560 EXPECT_POISONED(poisoned(0xFFFFFFFFU
, 0xFFFFFFFFU
) <=
3561 poisoned(0xFFFFFFFFU
, 0xFFFFFFFFU
));
3562 EXPECT_POISONED(poisoned(-1, 0xFFFFFFFFU
) <=
3563 poisoned(-1, 0xFFFFFFFFU
));
3565 EXPECT_NOT_POISONED(poisoned(0, 0) > poisoned(0, 0));
3566 EXPECT_NOT_POISONED(poisoned(0U, 0) > poisoned(0U, 0));
3567 EXPECT_NOT_POISONED(poisoned(0LL, 0LLU) > poisoned(0LL, 0LLU));
3568 EXPECT_NOT_POISONED(poisoned(0LLU, 0LLU) > poisoned(0LLU, 0LLU));
3569 EXPECT_POISONED(poisoned(0xFF, 0xFF) > poisoned(0xFF, 0xFF));
3570 EXPECT_POISONED(poisoned(0xFFFFFFFFU
, 0xFFFFFFFFU
) >
3571 poisoned(0xFFFFFFFFU
, 0xFFFFFFFFU
));
3572 EXPECT_POISONED(poisoned(-1, 0xFFFFFFFFU
) >
3573 poisoned(-1, 0xFFFFFFFFU
));
3575 EXPECT_NOT_POISONED(poisoned(0, 0) >= poisoned(0, 0));
3576 EXPECT_NOT_POISONED(poisoned(0U, 0) >= poisoned(0U, 0));
3577 EXPECT_NOT_POISONED(poisoned(0LL, 0LLU) >= poisoned(0LL, 0LLU));
3578 EXPECT_NOT_POISONED(poisoned(0LLU, 0LLU) >= poisoned(0LLU, 0LLU));
3579 EXPECT_POISONED(poisoned(0xFF, 0xFF) >= poisoned(0xFF, 0xFF));
3580 EXPECT_POISONED(poisoned(0xFFFFFFFFU
, 0xFFFFFFFFU
) >=
3581 poisoned(0xFFFFFFFFU
, 0xFFFFFFFFU
));
3582 EXPECT_POISONED(poisoned(-1, 0xFFFFFFFFU
) >=
3583 poisoned(-1, 0xFFFFFFFFU
));
3585 EXPECT_POISONED(poisoned(6, 0xF) > poisoned(7, 0));
3586 EXPECT_POISONED(poisoned(0xF, 0xF) > poisoned(7, 0));
3588 EXPECT_NOT_POISONED(poisoned(-1, 0x80000000U
) >= poisoned(-1, 0U));
3592 TEST(MemorySanitizer
, ICmpVectorRelational
) {
3593 EXPECT_NOT_POISONED(
3594 _mm_cmplt_epi16(poisoned(_mm_set1_epi16(0), _mm_set1_epi16(0)),
3595 poisoned(_mm_set1_epi16(0), _mm_set1_epi16(0))));
3596 EXPECT_NOT_POISONED(
3597 _mm_cmplt_epi16(poisoned(_mm_set1_epi32(0), _mm_set1_epi32(0)),
3598 poisoned(_mm_set1_epi32(0), _mm_set1_epi32(0))));
3600 _mm_cmplt_epi16(poisoned(_mm_set1_epi16(0), _mm_set1_epi16(0xFFFF)),
3601 poisoned(_mm_set1_epi16(0), _mm_set1_epi16(0xFFFF))));
3602 EXPECT_POISONED(_mm_cmpgt_epi16(poisoned(_mm_set1_epi16(6), _mm_set1_epi16(0xF)),
3603 poisoned(_mm_set1_epi16(7), _mm_set1_epi16(0))));
3607 // Volatile bitfield store is implemented as load-mask-store
3608 // Test that we don't warn on the store of (uninitialized) padding.
3609 struct VolatileBitfieldStruct
{
3610 volatile unsigned x
: 1;
3614 TEST(MemorySanitizer
, VolatileBitfield
) {
3615 VolatileBitfieldStruct
*S
= new VolatileBitfieldStruct
;
3617 EXPECT_NOT_POISONED((unsigned)S
->x
);
3618 EXPECT_POISONED((unsigned)S
->y
);
3621 TEST(MemorySanitizer
, UnalignedLoad
) {
3622 char x
[32] __attribute__((aligned(8)));
3623 U4 origin
= __LINE__
;
3624 for (unsigned i
= 0; i
< sizeof(x
) / 4; ++i
)
3625 __msan_set_origin(x
+ 4 * i
, 4, origin
+ i
);
3627 memset(x
+ 8, 0, 16);
3628 EXPECT_POISONED_O(__sanitizer_unaligned_load16(x
+ 6), origin
+ 1);
3629 EXPECT_POISONED_O(__sanitizer_unaligned_load16(x
+ 7), origin
+ 1);
3630 EXPECT_NOT_POISONED(__sanitizer_unaligned_load16(x
+ 8));
3631 EXPECT_NOT_POISONED(__sanitizer_unaligned_load16(x
+ 9));
3632 EXPECT_NOT_POISONED(__sanitizer_unaligned_load16(x
+ 22));
3633 EXPECT_POISONED_O(__sanitizer_unaligned_load16(x
+ 23), origin
+ 6);
3634 EXPECT_POISONED_O(__sanitizer_unaligned_load16(x
+ 24), origin
+ 6);
3636 EXPECT_POISONED_O(__sanitizer_unaligned_load32(x
+ 4), origin
+ 1);
3637 EXPECT_POISONED_O(__sanitizer_unaligned_load32(x
+ 7), origin
+ 1);
3638 EXPECT_NOT_POISONED(__sanitizer_unaligned_load32(x
+ 8));
3639 EXPECT_NOT_POISONED(__sanitizer_unaligned_load32(x
+ 9));
3640 EXPECT_NOT_POISONED(__sanitizer_unaligned_load32(x
+ 20));
3641 EXPECT_POISONED_O(__sanitizer_unaligned_load32(x
+ 21), origin
+ 6);
3642 EXPECT_POISONED_O(__sanitizer_unaligned_load32(x
+ 24), origin
+ 6);
3644 EXPECT_POISONED_O(__sanitizer_unaligned_load64(x
), origin
);
3645 EXPECT_POISONED_O(__sanitizer_unaligned_load64(x
+ 1), origin
);
3646 EXPECT_POISONED_O(__sanitizer_unaligned_load64(x
+ 7), origin
+ 1);
3647 EXPECT_NOT_POISONED(__sanitizer_unaligned_load64(x
+ 8));
3648 EXPECT_NOT_POISONED(__sanitizer_unaligned_load64(x
+ 9));
3649 EXPECT_NOT_POISONED(__sanitizer_unaligned_load64(x
+ 16));
3650 EXPECT_POISONED_O(__sanitizer_unaligned_load64(x
+ 17), origin
+ 6);
3651 EXPECT_POISONED_O(__sanitizer_unaligned_load64(x
+ 21), origin
+ 6);
3652 EXPECT_POISONED_O(__sanitizer_unaligned_load64(x
+ 24), origin
+ 6);
3655 TEST(MemorySanitizer
, UnalignedStore16
) {
3656 char x
[5] __attribute__((aligned(4)));
3658 U4 origin
= __LINE__
;
3659 __msan_poison(&y2
, 1);
3660 __msan_set_origin(&y2
, 1, origin
);
3662 __sanitizer_unaligned_store16(x
+ 1, y2
);
3663 EXPECT_POISONED_O(x
[0], origin
);
3664 EXPECT_POISONED_O(x
[1], origin
);
3665 EXPECT_NOT_POISONED(x
[2]);
3666 EXPECT_POISONED_O(x
[3], origin
);
3669 TEST(MemorySanitizer
, UnalignedStore32
) {
3670 char x
[8] __attribute__((aligned(4)));
3672 U4 origin
= __LINE__
;
3673 __msan_poison(&y4
, 2);
3674 __msan_set_origin(&y4
, 2, origin
);
3676 __sanitizer_unaligned_store32(x
+ 3, y4
);
3677 EXPECT_POISONED_O(x
[0], origin
);
3678 EXPECT_POISONED_O(x
[1], origin
);
3679 EXPECT_POISONED_O(x
[2], origin
);
3680 EXPECT_POISONED_O(x
[3], origin
);
3681 EXPECT_POISONED_O(x
[4], origin
);
3682 EXPECT_NOT_POISONED(x
[5]);
3683 EXPECT_NOT_POISONED(x
[6]);
3684 EXPECT_POISONED_O(x
[7], origin
);
3687 TEST(MemorySanitizer
, UnalignedStore64
) {
3688 char x
[16] __attribute__((aligned(8)));
3690 U4 origin
= __LINE__
;
3691 __msan_poison(&y8
, 3);
3692 __msan_poison(((char *)&y8
) + sizeof(y8
) - 2, 1);
3693 __msan_set_origin(&y8
, 8, origin
);
3695 __sanitizer_unaligned_store64(x
+ 3, y8
);
3696 EXPECT_POISONED_O(x
[0], origin
);
3697 EXPECT_POISONED_O(x
[1], origin
);
3698 EXPECT_POISONED_O(x
[2], origin
);
3699 EXPECT_POISONED_O(x
[3], origin
);
3700 EXPECT_POISONED_O(x
[4], origin
);
3701 EXPECT_POISONED_O(x
[5], origin
);
3702 EXPECT_NOT_POISONED(x
[6]);
3703 EXPECT_NOT_POISONED(x
[7]);
3704 EXPECT_NOT_POISONED(x
[8]);
3705 EXPECT_POISONED_O(x
[9], origin
);
3706 EXPECT_NOT_POISONED(x
[10]);
3707 EXPECT_POISONED_O(x
[11], origin
);
3710 TEST(MemorySanitizer
, UnalignedStore16_precise
) {
3711 char x
[8] __attribute__((aligned(4)));
3713 U4 originx1
= __LINE__
;
3714 U4 originx2
= __LINE__
;
3715 U4 originy
= __LINE__
;
3716 __msan_poison(x
, sizeof(x
));
3717 __msan_set_origin(x
, 4, originx1
);
3718 __msan_set_origin(x
+ 4, 4, originx2
);
3719 __msan_poison(((char *)&y
) + 1, 1);
3720 __msan_set_origin(&y
, sizeof(y
), originy
);
3722 __sanitizer_unaligned_store16(x
+ 3, y
);
3723 EXPECT_POISONED_O(x
[0], originx1
);
3724 EXPECT_POISONED_O(x
[1], originx1
);
3725 EXPECT_POISONED_O(x
[2], originx1
);
3726 EXPECT_NOT_POISONED(x
[3]);
3727 EXPECT_POISONED_O(x
[4], originy
);
3728 EXPECT_POISONED_O(x
[5], originy
);
3729 EXPECT_POISONED_O(x
[6], originy
);
3730 EXPECT_POISONED_O(x
[7], originy
);
3733 TEST(MemorySanitizer
, UnalignedStore16_precise2
) {
3734 char x
[8] __attribute__((aligned(4)));
3736 U4 originx1
= __LINE__
;
3737 U4 originx2
= __LINE__
;
3738 U4 originy
= __LINE__
;
3739 __msan_poison(x
, sizeof(x
));
3740 __msan_set_origin(x
, 4, originx1
);
3741 __msan_set_origin(x
+ 4, 4, originx2
);
3742 __msan_poison(((char *)&y
), 1);
3743 __msan_set_origin(&y
, sizeof(y
), originy
);
3745 __sanitizer_unaligned_store16(x
+ 3, y
);
3746 EXPECT_POISONED_O(x
[0], originy
);
3747 EXPECT_POISONED_O(x
[1], originy
);
3748 EXPECT_POISONED_O(x
[2], originy
);
3749 EXPECT_POISONED_O(x
[3], originy
);
3750 EXPECT_NOT_POISONED(x
[4]);
3751 EXPECT_POISONED_O(x
[5], originx2
);
3752 EXPECT_POISONED_O(x
[6], originx2
);
3753 EXPECT_POISONED_O(x
[7], originx2
);
3756 TEST(MemorySanitizer
, UnalignedStore64_precise
) {
3757 char x
[12] __attribute__((aligned(8)));
3759 U4 originx1
= __LINE__
;
3760 U4 originx2
= __LINE__
;
3761 U4 originx3
= __LINE__
;
3762 U4 originy
= __LINE__
;
3763 __msan_poison(x
, sizeof(x
));
3764 __msan_set_origin(x
, 4, originx1
);
3765 __msan_set_origin(x
+ 4, 4, originx2
);
3766 __msan_set_origin(x
+ 8, 4, originx3
);
3767 __msan_poison(((char *)&y
) + 1, 1);
3768 __msan_poison(((char *)&y
) + 7, 1);
3769 __msan_set_origin(&y
, sizeof(y
), originy
);
3771 __sanitizer_unaligned_store64(x
+ 2, y
);
3772 EXPECT_POISONED_O(x
[0], originy
);
3773 EXPECT_POISONED_O(x
[1], originy
);
3774 EXPECT_NOT_POISONED(x
[2]);
3775 EXPECT_POISONED_O(x
[3], originy
);
3777 EXPECT_NOT_POISONED(x
[4]);
3778 EXPECT_NOT_POISONED(x
[5]);
3779 EXPECT_NOT_POISONED(x
[6]);
3780 EXPECT_NOT_POISONED(x
[7]);
3782 EXPECT_NOT_POISONED(x
[8]);
3783 EXPECT_POISONED_O(x
[9], originy
);
3784 EXPECT_POISONED_O(x
[10], originy
);
3785 EXPECT_POISONED_O(x
[11], originy
);
3788 TEST(MemorySanitizer
, UnalignedStore64_precise2
) {
3789 char x
[12] __attribute__((aligned(8)));
3791 U4 originx1
= __LINE__
;
3792 U4 originx2
= __LINE__
;
3793 U4 originx3
= __LINE__
;
3794 U4 originy
= __LINE__
;
3795 __msan_poison(x
, sizeof(x
));
3796 __msan_set_origin(x
, 4, originx1
);
3797 __msan_set_origin(x
+ 4, 4, originx2
);
3798 __msan_set_origin(x
+ 8, 4, originx3
);
3799 __msan_poison(((char *)&y
) + 3, 3);
3800 __msan_set_origin(&y
, sizeof(y
), originy
);
3802 __sanitizer_unaligned_store64(x
+ 2, y
);
3803 EXPECT_POISONED_O(x
[0], originx1
);
3804 EXPECT_POISONED_O(x
[1], originx1
);
3805 EXPECT_NOT_POISONED(x
[2]);
3806 EXPECT_NOT_POISONED(x
[3]);
3808 EXPECT_NOT_POISONED(x
[4]);
3809 EXPECT_POISONED_O(x
[5], originy
);
3810 EXPECT_POISONED_O(x
[6], originy
);
3811 EXPECT_POISONED_O(x
[7], originy
);
3813 EXPECT_NOT_POISONED(x
[8]);
3814 EXPECT_NOT_POISONED(x
[9]);
3815 EXPECT_POISONED_O(x
[10], originx3
);
3816 EXPECT_POISONED_O(x
[11], originx3
);
3819 #if (defined(__x86_64__) && defined(__clang__))
3821 typedef U1 V16x8
__attribute__((__vector_size__(16)));
3822 typedef U2 V8x16
__attribute__((__vector_size__(16)));
3823 typedef U4 V4x32
__attribute__((__vector_size__(16)));
3824 typedef U8 V2x64
__attribute__((__vector_size__(16)));
3825 typedef U4 V8x32
__attribute__((__vector_size__(32)));
3826 typedef U8 V4x64
__attribute__((__vector_size__(32)));
3827 typedef U4 V2x32
__attribute__((__vector_size__(8)));
3828 typedef U2 V4x16
__attribute__((__vector_size__(8)));
3829 typedef U1 V8x8
__attribute__((__vector_size__(8)));
3832 V8x16
shift_sse2_left_scalar(V8x16 x
, U4 y
) {
3833 return _mm_slli_epi16(x
, y
);
3836 V8x16
shift_sse2_left(V8x16 x
, V8x16 y
) {
3837 return _mm_sll_epi16(x
, y
);
3840 TEST(VectorShiftTest
, sse2_left_scalar
) {
3841 V8x16 v
= {Poisoned
<U2
>(0, 3), Poisoned
<U2
>(0, 7), 2, 3, 4, 5, 6, 7};
3842 V8x16 u
= shift_sse2_left_scalar(v
, 2);
3843 EXPECT_POISONED(u
[0]);
3844 EXPECT_POISONED(u
[1]);
3845 EXPECT_NOT_POISONED(u
[0] | (3U << 2));
3846 EXPECT_NOT_POISONED(u
[1] | (7U << 2));
3848 EXPECT_NOT_POISONED(u
);
3851 TEST(VectorShiftTest
, sse2_left_scalar_by_uninit
) {
3852 V8x16 v
= {0, 1, 2, 3, 4, 5, 6, 7};
3853 V8x16 u
= shift_sse2_left_scalar(v
, Poisoned
<U4
>());
3854 EXPECT_POISONED(u
[0]);
3855 EXPECT_POISONED(u
[1]);
3856 EXPECT_POISONED(u
[2]);
3857 EXPECT_POISONED(u
[3]);
3858 EXPECT_POISONED(u
[4]);
3859 EXPECT_POISONED(u
[5]);
3860 EXPECT_POISONED(u
[6]);
3861 EXPECT_POISONED(u
[7]);
3864 TEST(VectorShiftTest
, sse2_left
) {
3865 V8x16 v
= {Poisoned
<U2
>(0, 3), Poisoned
<U2
>(0, 7), 2, 3, 4, 5, 6, 7};
3866 // Top 64 bits of shift count don't affect the result.
3867 V2x64 s
= {2, Poisoned
<U8
>()};
3868 V8x16 u
= shift_sse2_left(v
, s
);
3869 EXPECT_POISONED(u
[0]);
3870 EXPECT_POISONED(u
[1]);
3871 EXPECT_NOT_POISONED(u
[0] | (3U << 2));
3872 EXPECT_NOT_POISONED(u
[1] | (7U << 2));
3874 EXPECT_NOT_POISONED(u
);
3877 TEST(VectorShiftTest
, sse2_left_by_uninit
) {
3878 V8x16 v
= {Poisoned
<U2
>(0, 3), Poisoned
<U2
>(0, 7), 2, 3, 4, 5, 6, 7};
3879 V2x64 s
= {Poisoned
<U8
>(), Poisoned
<U8
>()};
3880 V8x16 u
= shift_sse2_left(v
, s
);
3881 EXPECT_POISONED(u
[0]);
3882 EXPECT_POISONED(u
[1]);
3883 EXPECT_POISONED(u
[2]);
3884 EXPECT_POISONED(u
[3]);
3885 EXPECT_POISONED(u
[4]);
3886 EXPECT_POISONED(u
[5]);
3887 EXPECT_POISONED(u
[6]);
3888 EXPECT_POISONED(u
[7]);
3892 V4x32
shift_avx2_left(V4x32 x
, V4x32 y
) {
3893 return _mm_sllv_epi32(x
, y
);
3895 // This is variable vector shift that's only available starting with AVX2.
3896 // V4x32 shift_avx2_left(V4x32 x, V4x32 y) {
3897 TEST(VectorShiftTest
, avx2_left
) {
3898 V4x32 v
= {Poisoned
<U2
>(0, 3), Poisoned
<U2
>(0, 7), 2, 3};
3899 V4x32 s
= {2, Poisoned
<U4
>(), 3, Poisoned
<U4
>()};
3900 V4x32 u
= shift_avx2_left(v
, s
);
3901 EXPECT_POISONED(u
[0]);
3902 EXPECT_NOT_POISONED(u
[0] | (~7U));
3903 EXPECT_POISONED(u
[1]);
3904 EXPECT_POISONED(u
[1] | (~31U));
3905 EXPECT_NOT_POISONED(u
[2]);
3906 EXPECT_POISONED(u
[3]);
3907 EXPECT_POISONED(u
[3] | (~31U));
3912 TEST(VectorPackTest
, sse2_packssdw_128
) {
3913 const unsigned S2_max
= (1 << 15) - 1;
3914 V4x32 a
= {Poisoned
<U4
>(0, 0xFF0000), Poisoned
<U4
>(0, 0xFFFF0000),
3916 V4x32 b
= {Poisoned
<U4
>(0, 0xFF), S2_max
+ 10000, Poisoned
<U4
>(0, 0xFF00),
3919 V8x16 c
= _mm_packs_epi32(a
, b
);
3921 EXPECT_POISONED(c
[0]);
3922 EXPECT_POISONED(c
[1]);
3923 EXPECT_NOT_POISONED(c
[2]);
3924 EXPECT_NOT_POISONED(c
[3]);
3925 EXPECT_POISONED(c
[4]);
3926 EXPECT_NOT_POISONED(c
[5]);
3927 EXPECT_POISONED(c
[6]);
3928 EXPECT_NOT_POISONED(c
[7]);
3930 EXPECT_EQ(c
[2], S2_max
);
3932 EXPECT_EQ(c
[5], S2_max
);
3933 EXPECT_EQ(c
[7], S2_max
);
3936 TEST(VectorPackTest
, mmx_packuswb
) {
3937 const unsigned U1_max
= (1 << 8) - 1;
3938 V4x16 a
= {Poisoned
<U2
>(0, 0xFF00), Poisoned
<U2
>(0, 0xF000U
), U1_max
+ 100,
3940 V4x16 b
= {Poisoned
<U2
>(0, 0xFF), U1_max
- 1, Poisoned
<U2
>(0, 0xF), U1_max
};
3941 V8x8 c
= _mm_packs_pu16(a
, b
);
3943 EXPECT_POISONED(c
[0]);
3944 EXPECT_POISONED(c
[1]);
3945 EXPECT_NOT_POISONED(c
[2]);
3946 EXPECT_NOT_POISONED(c
[3]);
3947 EXPECT_POISONED(c
[4]);
3948 EXPECT_NOT_POISONED(c
[5]);
3949 EXPECT_POISONED(c
[6]);
3950 EXPECT_NOT_POISONED(c
[7]);
3952 EXPECT_EQ(c
[2], U1_max
);
3954 EXPECT_EQ(c
[5], U1_max
- 1);
3955 EXPECT_EQ(c
[7], U1_max
);
3958 TEST(VectorSadTest
, sse2_psad_bw
) {
3959 V16x8 a
= {Poisoned
<U1
>(), 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
3960 V16x8 b
= {100, 101, 102, 103, 104, 105, 106, 107,
3961 108, 109, 110, 111, 112, 113, 114, 115};
3962 V2x64 c
= _mm_sad_epu8(a
, b
);
3964 EXPECT_POISONED(c
[0]);
3965 EXPECT_NOT_POISONED(c
[1]);
3967 EXPECT_EQ(800U, c
[1]);
3970 TEST(VectorMaddTest
, mmx_pmadd_wd
) {
3971 V4x16 a
= {Poisoned
<U2
>(), 1, 2, 3};
3972 V4x16 b
= {100, 101, 102, 103};
3973 V2x32 c
= _mm_madd_pi16(a
, b
);
3975 EXPECT_POISONED(c
[0]);
3976 EXPECT_NOT_POISONED(c
[1]);
3978 EXPECT_EQ((unsigned)(2 * 102 + 3 * 103), c
[1]);
3981 TEST(VectorCmpTest
, mm_cmpneq_ps
) {
3983 c
= _mm_cmpneq_ps(V4x32
{Poisoned
<U4
>(), 1, 2, 3}, V4x32
{4, 5, Poisoned
<U4
>(), 6});
3984 EXPECT_POISONED(c
[0]);
3985 EXPECT_NOT_POISONED(c
[1]);
3986 EXPECT_POISONED(c
[2]);
3987 EXPECT_NOT_POISONED(c
[3]);
3989 c
= _mm_cmpneq_ps(V4x32
{0, 1, 2, 3}, V4x32
{4, 5, 6, 7});
3990 EXPECT_NOT_POISONED(c
);
3993 TEST(VectorCmpTest
, mm_cmpneq_sd
) {
3995 c
= _mm_cmpneq_sd(V2x64
{Poisoned
<U8
>(), 1}, V2x64
{2, 3});
3996 EXPECT_POISONED(c
[0]);
3997 c
= _mm_cmpneq_sd(V2x64
{1, 2}, V2x64
{Poisoned
<U8
>(), 3});
3998 EXPECT_POISONED(c
[0]);
3999 c
= _mm_cmpneq_sd(V2x64
{1, 2}, V2x64
{3, 4});
4000 EXPECT_NOT_POISONED(c
[0]);
4001 c
= _mm_cmpneq_sd(V2x64
{1, Poisoned
<U8
>()}, V2x64
{2, Poisoned
<U8
>()});
4002 EXPECT_NOT_POISONED(c
[0]);
4003 c
= _mm_cmpneq_sd(V2x64
{1, Poisoned
<U8
>()}, V2x64
{1, Poisoned
<U8
>()});
4004 EXPECT_NOT_POISONED(c
[0]);
4007 TEST(VectorCmpTest
, builtin_ia32_ucomisdlt
) {
4009 c
= __builtin_ia32_ucomisdlt(V2x64
{Poisoned
<U8
>(), 1}, V2x64
{2, 3});
4011 c
= __builtin_ia32_ucomisdlt(V2x64
{1, 2}, V2x64
{Poisoned
<U8
>(), 3});
4013 c
= __builtin_ia32_ucomisdlt(V2x64
{1, 2}, V2x64
{3, 4});
4014 EXPECT_NOT_POISONED(c
);
4015 c
= __builtin_ia32_ucomisdlt(V2x64
{1, Poisoned
<U8
>()}, V2x64
{2, Poisoned
<U8
>()});
4016 EXPECT_NOT_POISONED(c
);
4017 c
= __builtin_ia32_ucomisdlt(V2x64
{1, Poisoned
<U8
>()}, V2x64
{1, Poisoned
<U8
>()});
4018 EXPECT_NOT_POISONED(c
);
4021 #endif // defined(__x86_64__) && defined(__clang__)
4023 TEST(MemorySanitizerOrigins
, SetGet
) {
4024 EXPECT_EQ(TrackingOrigins(), !!__msan_get_track_origins());
4025 if (!TrackingOrigins()) return;
4027 __msan_set_origin(&x
, sizeof(x
), 1234);
4028 EXPECT_ORIGIN(1234U, __msan_get_origin(&x
));
4029 __msan_set_origin(&x
, sizeof(x
), 5678);
4030 EXPECT_ORIGIN(5678U, __msan_get_origin(&x
));
4031 __msan_set_origin(&x
, sizeof(x
), 0);
4032 EXPECT_ORIGIN(0U, __msan_get_origin(&x
));
4042 TEST(MemorySanitizerOrigins
, InitializedStoreDoesNotChangeOrigin
) {
4043 if (!TrackingOrigins()) return;
4046 U4 origin
= rand(); // NOLINT
4047 s
.a
= *GetPoisonedO
<U2
>(0, origin
);
4048 EXPECT_ORIGIN(origin
, __msan_get_origin(&s
.a
));
4049 EXPECT_ORIGIN(origin
, __msan_get_origin(&s
.b
));
4052 EXPECT_ORIGIN(origin
, __msan_get_origin(&s
.a
));
4053 EXPECT_ORIGIN(origin
, __msan_get_origin(&s
.b
));
4057 template<class T
, class BinaryOp
>
4059 void BinaryOpOriginTest(BinaryOp op
) {
4060 U4 ox
= rand(); //NOLINT
4061 U4 oy
= rand(); //NOLINT
4062 T
*x
= GetPoisonedO
<T
>(0, ox
, 0);
4063 T
*y
= GetPoisonedO
<T
>(1, oy
, 0);
4064 T
*z
= GetPoisonedO
<T
>(2, 0, 0);
4067 U4 origin
= __msan_get_origin(z
);
4068 EXPECT_POISONED_O(*z
, origin
);
4069 EXPECT_EQ(true, __msan_origin_is_descendant_or_same(origin
, ox
) ||
4070 __msan_origin_is_descendant_or_same(origin
, oy
));
4072 // y is poisoned, x is not.
4074 *y
= *GetPoisonedO
<T
>(1, oy
);
4075 break_optimization(x
);
4076 __msan_set_origin(z
, sizeof(*z
), 0);
4078 EXPECT_POISONED_O(*z
, oy
);
4079 EXPECT_ORIGIN(oy
, __msan_get_origin(z
));
4081 // x is poisoned, y is not.
4082 *x
= *GetPoisonedO
<T
>(0, ox
);
4084 break_optimization(y
);
4085 __msan_set_origin(z
, sizeof(*z
), 0);
4087 EXPECT_POISONED_O(*z
, ox
);
4088 EXPECT_ORIGIN(ox
, __msan_get_origin(z
));
4091 template<class T
> INLINE T
XOR(const T
&a
, const T
&b
) { return a
^ b
; }
4092 template<class T
> INLINE T
ADD(const T
&a
, const T
&b
) { return a
+ b
; }
4093 template<class T
> INLINE T
SUB(const T
&a
, const T
&b
) { return a
- b
; }
4094 template<class T
> INLINE T
MUL(const T
&a
, const T
&b
) { return a
* b
; }
4095 template<class T
> INLINE T
AND(const T
&a
, const T
&b
) { return a
& b
; }
4096 template<class T
> INLINE T
OR (const T
&a
, const T
&b
) { return a
| b
; }
4098 TEST(MemorySanitizerOrigins
, BinaryOp
) {
4099 if (!TrackingOrigins()) return;
4100 BinaryOpOriginTest
<S8
>(XOR
<S8
>);
4101 BinaryOpOriginTest
<U8
>(ADD
<U8
>);
4102 BinaryOpOriginTest
<S4
>(SUB
<S4
>);
4103 BinaryOpOriginTest
<S4
>(MUL
<S4
>);
4104 BinaryOpOriginTest
<U4
>(OR
<U4
>);
4105 BinaryOpOriginTest
<U4
>(AND
<U4
>);
4106 BinaryOpOriginTest
<double>(ADD
<U4
>);
4107 BinaryOpOriginTest
<float>(ADD
<S4
>);
4108 BinaryOpOriginTest
<double>(ADD
<double>);
4109 BinaryOpOriginTest
<float>(ADD
<double>);
4112 TEST(MemorySanitizerOrigins
, Unary
) {
4113 if (!TrackingOrigins()) return;
4114 EXPECT_POISONED_O(*GetPoisonedO
<S8
>(0, __LINE__
), __LINE__
);
4115 EXPECT_POISONED_O(*GetPoisonedO
<S8
>(0, __LINE__
), __LINE__
);
4116 EXPECT_POISONED_O(*GetPoisonedO
<S8
>(0, __LINE__
), __LINE__
);
4117 EXPECT_POISONED_O(*GetPoisonedO
<S8
>(0, __LINE__
), __LINE__
);
4119 EXPECT_POISONED_O(*GetPoisonedO
<S4
>(0, __LINE__
), __LINE__
);
4120 EXPECT_POISONED_O(*GetPoisonedO
<S4
>(0, __LINE__
), __LINE__
);
4121 EXPECT_POISONED_O(*GetPoisonedO
<S4
>(0, __LINE__
), __LINE__
);
4122 EXPECT_POISONED_O(*GetPoisonedO
<S4
>(0, __LINE__
), __LINE__
);
4124 EXPECT_POISONED_O(*GetPoisonedO
<U4
>(0, __LINE__
), __LINE__
);
4125 EXPECT_POISONED_O(*GetPoisonedO
<U4
>(0, __LINE__
), __LINE__
);
4126 EXPECT_POISONED_O(*GetPoisonedO
<U4
>(0, __LINE__
), __LINE__
);
4127 EXPECT_POISONED_O(*GetPoisonedO
<U4
>(0, __LINE__
), __LINE__
);
4129 EXPECT_POISONED_O(*GetPoisonedO
<S4
>(0, __LINE__
), __LINE__
);
4130 EXPECT_POISONED_O(*GetPoisonedO
<S4
>(0, __LINE__
), __LINE__
);
4131 EXPECT_POISONED_O(*GetPoisonedO
<S4
>(0, __LINE__
), __LINE__
);
4132 EXPECT_POISONED_O(*GetPoisonedO
<S4
>(0, __LINE__
), __LINE__
);
4134 EXPECT_POISONED_O((void*)*GetPoisonedO
<S8
>(0, __LINE__
), __LINE__
);
4135 EXPECT_POISONED_O((U8
)*GetPoisonedO
<void*>(0, __LINE__
), __LINE__
);
4138 TEST(MemorySanitizerOrigins
, EQ
) {
4139 if (!TrackingOrigins()) return;
4140 EXPECT_POISONED_O(*GetPoisonedO
<S4
>(0, __LINE__
) <= 11, __LINE__
);
4141 EXPECT_POISONED_O(*GetPoisonedO
<S4
>(0, __LINE__
) == 11, __LINE__
);
4142 EXPECT_POISONED_O(*GetPoisonedO
<float>(0, __LINE__
) == 1.1, __LINE__
);
4145 TEST(MemorySanitizerOrigins
, DIV
) {
4146 if (!TrackingOrigins()) return;
4147 EXPECT_POISONED_O(*GetPoisonedO
<U8
>(0, __LINE__
) / 100, __LINE__
);
4148 unsigned o
= __LINE__
;
4149 EXPECT_UMR_O(volatile unsigned y
= 100 / *GetPoisonedO
<S4
>(0, o
, 1), o
);
4152 TEST(MemorySanitizerOrigins
, SHIFT
) {
4153 if (!TrackingOrigins()) return;
4154 EXPECT_POISONED_O(*GetPoisonedO
<U8
>(0, __LINE__
) >> 10, __LINE__
);
4155 EXPECT_POISONED_O(*GetPoisonedO
<S8
>(0, __LINE__
) >> 10, __LINE__
);
4156 EXPECT_POISONED_O(*GetPoisonedO
<S8
>(0, __LINE__
) << 10, __LINE__
);
4157 EXPECT_POISONED_O(10U << *GetPoisonedO
<U8
>(0, __LINE__
), __LINE__
);
4158 EXPECT_POISONED_O(-10 >> *GetPoisonedO
<S8
>(0, __LINE__
), __LINE__
);
4159 EXPECT_POISONED_O(-10 << *GetPoisonedO
<S8
>(0, __LINE__
), __LINE__
);
4162 template<class T
, int N
>
4169 __msan_poison(x
, N
* sizeof(T
));
4170 __msan_set_origin(x
, N
* sizeof(T
), ox
);
4171 __msan_set_origin(y
, N
* sizeof(T
), 777777);
4172 __msan_set_origin(z
, N
* sizeof(T
), 888888);
4173 EXPECT_NOT_POISONED(x
);
4174 memcpy(y
, x
, N
* sizeof(T
));
4175 EXPECT_POISONED_O(y
[0], ox
);
4176 EXPECT_POISONED_O(y
[N
/2], ox
);
4177 EXPECT_POISONED_O(y
[N
-1], ox
);
4178 EXPECT_NOT_POISONED(x
);
4179 void *res
= mempcpy(q
, x
, N
* sizeof(T
));
4180 ASSERT_EQ(q
+ N
, res
);
4181 EXPECT_POISONED_O(q
[0], ox
);
4182 EXPECT_POISONED_O(q
[N
/2], ox
);
4183 EXPECT_POISONED_O(q
[N
-1], ox
);
4184 EXPECT_NOT_POISONED(x
);
4185 memmove(z
, x
, N
* sizeof(T
));
4186 EXPECT_POISONED_O(z
[0], ox
);
4187 EXPECT_POISONED_O(z
[N
/2], ox
);
4188 EXPECT_POISONED_O(z
[N
-1], ox
);
4191 TEST(MemorySanitizerOrigins
, LargeMemCpy
) {
4192 if (!TrackingOrigins()) return;
4193 MemCpyTest
<U1
, 10000>();
4194 MemCpyTest
<U8
, 10000>();
4197 TEST(MemorySanitizerOrigins
, SmallMemCpy
) {
4198 if (!TrackingOrigins()) return;
4199 MemCpyTest
<U8
, 1>();
4200 MemCpyTest
<U8
, 2>();
4201 MemCpyTest
<U8
, 3>();
4204 TEST(MemorySanitizerOrigins
, Select
) {
4205 if (!TrackingOrigins()) return;
4206 EXPECT_NOT_POISONED(g_one
? 1 : *GetPoisonedO
<S4
>(0, __LINE__
));
4207 EXPECT_POISONED_O(*GetPoisonedO
<S4
>(0, __LINE__
), __LINE__
);
4209 break_optimization(&x
);
4210 x
= g_1
? *GetPoisonedO
<S4
>(0, __LINE__
) : 0;
4212 EXPECT_POISONED_O(g_1
? *GetPoisonedO
<S4
>(0, __LINE__
) : 1, __LINE__
);
4213 EXPECT_POISONED_O(g_0
? 1 : *GetPoisonedO
<S4
>(0, __LINE__
), __LINE__
);
4216 NOINLINE
int RetvalOriginTest(U4 origin
) {
4218 break_optimization(a
);
4219 __msan_set_origin(a
, sizeof(*a
), origin
);
4225 TEST(MemorySanitizerOrigins
, Retval
) {
4226 if (!TrackingOrigins()) return;
4227 EXPECT_POISONED_O(RetvalOriginTest(__LINE__
), __LINE__
);
4230 NOINLINE
void ParamOriginTest(int param
, U4 origin
) {
4231 EXPECT_POISONED_O(param
, origin
);
4234 TEST(MemorySanitizerOrigins
, Param
) {
4235 if (!TrackingOrigins()) return;
4237 U4 origin
= __LINE__
;
4238 break_optimization(a
);
4239 __msan_set_origin(a
, sizeof(*a
), origin
);
4240 ParamOriginTest(*a
, origin
);
4244 TEST(MemorySanitizerOrigins
, Invoke
) {
4245 if (!TrackingOrigins()) return;
4246 StructWithDtor s
; // Will cause the calls to become invokes.
4247 EXPECT_POISONED_O(RetvalOriginTest(__LINE__
), __LINE__
);
4250 TEST(MemorySanitizerOrigins
, strlen
) {
4252 break_optimization(&alignment
);
4253 char x
[4] = {'a', 'b', 0, 0};
4254 __msan_poison(&x
[2], 1);
4255 U4 origin
= __LINE__
;
4256 __msan_set_origin(x
, sizeof(x
), origin
);
4257 EXPECT_UMR_O(volatile unsigned y
= strlen(x
), origin
);
4260 TEST(MemorySanitizerOrigins
, wcslen
) {
4261 wchar_t w
[3] = {'a', 'b', 0};
4262 U4 origin
= __LINE__
;
4263 __msan_set_origin(w
, sizeof(w
), origin
);
4264 __msan_poison(&w
[2], sizeof(wchar_t));
4265 EXPECT_UMR_O(volatile unsigned y
= wcslen(w
), origin
);
4269 TEST(MemorySanitizerOrigins
, StoreIntrinsic
) {
4271 U4 origin
= __LINE__
;
4272 __msan_set_origin(&x
, sizeof(x
), origin
);
4273 __msan_poison(&x
, sizeof(x
));
4274 _mm_storeu_ps((float*)&y
, x
);
4275 EXPECT_POISONED_O(y
, origin
);
4279 NOINLINE
void RecursiveMalloc(int depth
) {
4282 if ((count
% (1024 * 1024)) == 0)
4283 printf("RecursiveMalloc: %d\n", count
);
4286 break_optimization(x1
);
4287 break_optimization(x2
);
4289 RecursiveMalloc(depth
-1);
4290 RecursiveMalloc(depth
-1);
4296 TEST(MemorySanitizer
, Select
) {
4298 int volatile* p
= &x
;
4303 TEST(MemorySanitizer
, SelectPartial
) {
4304 // Precise instrumentation of select.
4305 // Some bits of the result do not depend on select condition, and must stay
4306 // initialized even if select condition is not. These are the bits that are
4307 // equal and initialized in both left and right select arguments.
4309 U4 x_s
= 0xFFFF0000U
;
4310 __msan_partial_poison(&x
, &x_s
, sizeof(x
));
4313 __msan_poison(&cond
, sizeof(cond
));
4314 U4 z
= cond
? x
: y
;
4315 __msan_print_shadow(&z
, sizeof(z
));
4316 EXPECT_POISONED(z
& 0xFFU
);
4317 EXPECT_NOT_POISONED(z
& 0xFF00U
);
4318 EXPECT_POISONED(z
& 0xFF0000U
);
4319 EXPECT_POISONED(z
& 0xFF000000U
);
4320 EXPECT_EQ(0xAB00U
, z
& 0xFF00U
);
4323 TEST(MemorySanitizerStress
, DISABLED_MallocStackTrace
) {
4324 RecursiveMalloc(22);
4327 TEST(MemorySanitizerAllocator
, get_estimated_allocated_size
) {
4328 size_t sizes
[] = {0, 20, 5000, 1<<20};
4329 for (size_t i
= 0; i
< sizeof(sizes
) / sizeof(*sizes
); ++i
) {
4330 size_t alloc_size
= __sanitizer_get_estimated_allocated_size(sizes
[i
]);
4331 EXPECT_EQ(alloc_size
, sizes
[i
]);
4335 TEST(MemorySanitizerAllocator
, get_allocated_size_and_ownership
) {
4336 char *array
= reinterpret_cast<char*>(malloc(100));
4337 int *int_ptr
= new int;
4339 EXPECT_TRUE(__sanitizer_get_ownership(array
));
4340 EXPECT_EQ(100U, __sanitizer_get_allocated_size(array
));
4342 EXPECT_TRUE(__sanitizer_get_ownership(int_ptr
));
4343 EXPECT_EQ(sizeof(*int_ptr
), __sanitizer_get_allocated_size(int_ptr
));
4345 void *wild_addr
= reinterpret_cast<void*>(0x1);
4346 EXPECT_FALSE(__sanitizer_get_ownership(wild_addr
));
4347 EXPECT_EQ(0U, __sanitizer_get_allocated_size(wild_addr
));
4349 EXPECT_FALSE(__sanitizer_get_ownership(array
+ 50));
4350 EXPECT_EQ(0U, __sanitizer_get_allocated_size(array
+ 50));
4352 // NULL is a valid argument for GetAllocatedSize but is not owned.
4353 EXPECT_FALSE(__sanitizer_get_ownership(NULL
));
4354 EXPECT_EQ(0U, __sanitizer_get_allocated_size(NULL
));
4357 EXPECT_FALSE(__sanitizer_get_ownership(array
));
4358 EXPECT_EQ(0U, __sanitizer_get_allocated_size(array
));
4363 TEST(MemorySanitizer
, MlockTest
) {
4364 EXPECT_EQ(0, mlockall(MCL_CURRENT
));
4365 EXPECT_EQ(0, mlock((void*)0x12345, 0x5678));
4366 EXPECT_EQ(0, munlockall());
4367 EXPECT_EQ(0, munlock((void*)0x987, 0x654));
4370 // Test that LargeAllocator unpoisons memory before releasing it to the OS.
4371 TEST(MemorySanitizer
, LargeAllocatorUnpoisonsOnFree
) {
4372 void *p
= malloc(1024 * 1024);
4375 typedef void *(*mmap_fn
)(void *, size_t, int, int, int, off_t
);
4376 mmap_fn real_mmap
= (mmap_fn
)dlsym(RTLD_NEXT
, "mmap");
4378 // Allocate the page that was released to the OS in free() with the real mmap,
4379 // bypassing the interceptor.
4380 char *q
= (char *)real_mmap(p
, 4096, PROT_READ
| PROT_WRITE
,
4381 MAP_PRIVATE
| MAP_ANONYMOUS
, -1, 0);
4382 ASSERT_NE((char *)0, q
);
4384 ASSERT_TRUE(q
<= p
);
4385 ASSERT_TRUE(q
+ 4096 > p
);
4387 EXPECT_NOT_POISONED(q
[0]);
4388 EXPECT_NOT_POISONED(q
[10]);
4389 EXPECT_NOT_POISONED(q
[100]);
4394 #if SANITIZER_TEST_HAS_MALLOC_USABLE_SIZE
4395 TEST(MemorySanitizer
, MallocUsableSizeTest
) {
4396 const size_t kArraySize
= 100;
4397 char *array
= Ident((char*)malloc(kArraySize
));
4398 int *int_ptr
= Ident(new int);
4399 EXPECT_EQ(0U, malloc_usable_size(NULL
));
4400 EXPECT_EQ(kArraySize
, malloc_usable_size(array
));
4401 EXPECT_EQ(sizeof(int), malloc_usable_size(int_ptr
));
4405 #endif // SANITIZER_TEST_HAS_MALLOC_USABLE_SIZE