10231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov//===-- msan_test.cc ------------------------------------------------------===//
20231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov//
30231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov//                     The LLVM Compiler Infrastructure
40231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov//
50231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// This file is distributed under the University of Illinois Open Source
60231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// License. See LICENSE.TXT for details.
70231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov//
80231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov//===----------------------------------------------------------------------===//
90231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov//
100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// This file is a part of MemorySanitizer.
110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov//
120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// MemorySanitizer unit tests.
130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov//===----------------------------------------------------------------------===//
140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
156e5ff89e8980b7c2ca0a39811433fb7ac2c74372Evgeniy Stepanov#ifndef MSAN_EXTERNAL_TEST_CONFIG
166e5ff89e8980b7c2ca0a39811433fb7ac2c74372Evgeniy Stepanov#include "msan_test_config.h"
176e5ff89e8980b7c2ca0a39811433fb7ac2c74372Evgeniy Stepanov#endif // MSAN_EXTERNAL_TEST_CONFIG
186e5ff89e8980b7c2ca0a39811433fb7ac2c74372Evgeniy Stepanov
192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include "sanitizer_common/tests/sanitizer_test_utils.h"
202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
216a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines#include "sanitizer/allocator_interface.h"
220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include "sanitizer/msan_interface.h"
2386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
2486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if defined(__FreeBSD__)
2586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# define _KERNEL  // To declare 'shminfo' structure.
2686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# include <sys/shm.h>
2786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# undef _KERNEL
2886277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesextern "C" {
2986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// <sys/shm.h> doesn't declare these functions in _KERNEL mode.
3086277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesvoid *shmat(int, const void *, int);
3186277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesint shmget(key_t, size_t, int);
3286277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesint shmctl(int, int, struct shmid_ds *);
3386277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesint shmdt(const void *);
3486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines}
3586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif
360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
37ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#include <inttypes.h>
380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <stdlib.h>
390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <stdarg.h>
400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <stdio.h>
410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <wchar.h>
427cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov#include <math.h>
430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
449530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov#include <arpa/inet.h>
45e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov#include <dlfcn.h>
46103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov#include <grp.h>
470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <unistd.h>
482bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov#include <link.h>
490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <limits.h>
500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <sys/time.h>
51e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov#include <poll.h>
520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <sys/types.h>
530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <sys/stat.h>
540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <fcntl.h>
550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <sys/resource.h>
560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <sys/ioctl.h>
575cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov#include <sys/statvfs.h>
580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <sys/utsname.h>
590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <sys/mman.h>
60d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov#include <dirent.h>
61e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#include <pwd.h>
62134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov#include <sys/socket.h>
630a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov#include <netdb.h>
64c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov#include <wordexp.h>
6510362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov#include <sys/ipc.h>
6610362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov#include <sys/shm.h>
670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
6886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__)
6986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# include <malloc.h>
7086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# include <sys/sysinfo.h>
7186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# include <sys/vfs.h>
7286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# include <mntent.h>
7386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# include <netinet/ether.h>
7486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#else
7586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# include <signal.h>
7686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# include <netinet/in.h>
7786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# include <pthread_np.h>
7886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# include <sys/uio.h>
7986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# include <sys/mount.h>
8086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# include <sys/sysctl.h>
8186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# include <net/ethernet.h>
8286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# define f_namelen f_namemax  // FreeBSD names this statfs field so.
8386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# define cpu_set_t cpuset_t
8486277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesextern "C" {
8586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// FreeBSD's <ssp/string.h> defines mempcpy() to be a macro expanding into
8686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// a __builtin___mempcpy_chk() call, but since Msan RTL defines it as an
8786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// ordinary function, we can declare it here to complete the tests.
8886277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesvoid *mempcpy(void *dest, const void *src, size_t n);
8986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines}
9086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif
9186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#if defined(__i386__) || defined(__x86_64__)
930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov# include <emmintrin.h>
940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov# define MSAN_HAS_M128 1
950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#else
960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov# define MSAN_HAS_M128 0
970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#endif
980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#ifdef __AVX2__
1002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines# include <immintrin.h>
1012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif
1022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
10386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// On FreeBSD procfs is not enabled by default.
10486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if defined(__FreeBSD__)
10586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# define FILE_TO_READ "/bin/cat"
10686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# define DIR_TO_READ "/bin"
10786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# define SUBFILE_TO_READ "cat"
10886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# define SYMLINK_TO_READ "/usr/bin/tar"
10986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# define SUPERUSER_GROUP "wheel"
11086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#else
11186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# define FILE_TO_READ "/proc/self/stat"
11286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# define DIR_TO_READ "/proc/self"
11386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# define SUBFILE_TO_READ "stat"
11486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# define SYMLINK_TO_READ "/proc/self/exe"
11586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# define SUPERUSER_GROUP "root"
11686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif
11786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
11886277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesconst size_t kPageSize = 4096;
11986277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesconst size_t kMaxPathLength = 4096;
12097160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov
1210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef unsigned char      U1;
1220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef unsigned short     U2;  // NOLINT
1230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef unsigned int       U4;
1240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef unsigned long long U8;  // NOLINT
1250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef   signed char      S1;
1260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef   signed short     S2;  // NOLINT
1270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef   signed int       S4;
1280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef   signed long long S8;  // NOLINT
1290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#define NOINLINE      __attribute__((noinline))
1300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#define INLINE      __attribute__((always_inline))
1310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
13211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovstatic bool TrackingOrigins() {
13311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  S8 x;
13411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  __msan_set_origin(&x, sizeof(x), 0x1234);
135250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  U4 origin = __msan_get_origin(&x);
13611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  __msan_set_origin(&x, sizeof(x), 0);
13786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  return __msan_origin_is_descendant_or_same(origin, 0x1234);
13811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov}
1390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
14086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#define EXPECT_ORIGIN(expected, origin) \
14186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  EXPECT_TRUE(__msan_origin_is_descendant_or_same((origin), (expected)))
14286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
14311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov#define EXPECT_UMR(action) \
1440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    do {                        \
1450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      __msan_set_expect_umr(1); \
1460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      action;                   \
1470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      __msan_set_expect_umr(0); \
1480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    } while (0)
1490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
15086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#define EXPECT_UMR_O(action, origin)                                       \
15186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  do {                                                                     \
15286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    __msan_set_expect_umr(1);                                              \
15386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    action;                                                                \
15486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    __msan_set_expect_umr(0);                                              \
15586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    if (TrackingOrigins()) EXPECT_ORIGIN(origin, __msan_get_umr_origin()); \
15686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  } while (0)
1570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
15811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov#define EXPECT_POISONED(x) ExpectPoisoned(x)
15911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
16011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovtemplate<typename T>
16111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovvoid ExpectPoisoned(const T& t) {
16211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NE(-1, __msan_test_shadow((void*)&t, sizeof(t)));
16311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov}
16411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
16511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov#define EXPECT_POISONED_O(x, origin) \
16611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  ExpectPoisonedWithOrigin(x, origin)
16711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
16811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovtemplate<typename T>
16911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovvoid ExpectPoisonedWithOrigin(const T& t, unsigned origin) {
17011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NE(-1, __msan_test_shadow((void*)&t, sizeof(t)));
17186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  if (TrackingOrigins()) EXPECT_ORIGIN(origin, __msan_get_origin((void *)&t));
17211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov}
17311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
17486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#define EXPECT_NOT_POISONED(x) EXPECT_EQ(true, TestForNotPoisoned((x)))
17511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
17611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovtemplate<typename T>
17786277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesbool TestForNotPoisoned(const T& t) {
17886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  return __msan_test_shadow((void*)&t, sizeof(t)) == -1;
17911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov}
1800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
1810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic U8 poisoned_array[100];
1820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T>
1830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovT *GetPoisoned(int i = 0, T val = 0) {
1840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *res = (T*)&poisoned_array[i];
1850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *res = val;
1860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&poisoned_array[i], sizeof(T));
1870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return res;
1880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
1890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
1900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T>
191250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy StepanovT *GetPoisonedO(int i, U4 origin, T val = 0) {
1920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *res = (T*)&poisoned_array[i];
1930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *res = val;
1940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&poisoned_array[i], sizeof(T));
1950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(&poisoned_array[i], sizeof(T), origin);
1960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return res;
1970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
1980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
1996a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hinestemplate<typename T>
2006a211c5814e25d6745a5058cc0e499e5235d3821Stephen HinesT Poisoned(T v = 0, T s = (T)(-1)) {
2016a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  __msan_partial_poison(&v, &s, sizeof(T));
2026a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  return v;
2036a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines}
2046a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines
2050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> NOINLINE T ReturnPoisoned() { return *GetPoisoned<T>(); }
2060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic volatile int g_one = 1;
2080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic volatile int g_zero = 0;
2090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic volatile int g_0 = 0;
2100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic volatile int g_1 = 1;
2110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovS4 a_s4[100];
2130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovS8 a_s8[100];
2140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
21512c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov// Check that malloc poisons memory.
21612c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov// A lot of tests below depend on this.
21712c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy StepanovTEST(MemorySanitizerSanity, PoisonInMalloc) {
21812c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  int *x = (int*)malloc(sizeof(int));
21912c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  EXPECT_POISONED(*x);
22012c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  free(x);
22112c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov}
22212c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov
2230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, NegativeTest1) {
2240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 *x = GetPoisoned<S4>();
2250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (g_one)
2260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    *x = 0;
22711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*x);
2280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
2290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, PositiveTest1) {
2310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // Load to store.
23211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S1>());
23311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S2>());
23411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S4>());
23511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S8>());
2360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // S->S conversions.
23811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S1>());
23911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S1>());
24011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S1>());
2410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
24211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S2>());
24311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S2>());
24411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S2>());
2450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
24611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S4>());
24711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S4>());
24811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S4>());
2490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
25011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S8>());
25111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S8>());
25211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S8>());
2530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // ZExt
25511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<U1>());
25611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<U1>());
25711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<U1>());
25811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<U2>());
25911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<U2>());
26011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<U4>());
2610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // Unary ops.
26311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(- *GetPoisoned<S4>());
2640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
26511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_UMR(a_s4[g_zero] = 100 / *GetPoisoned<S4>(0, 1));
2660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  a_s4[g_zero] = 1 - *GetPoisoned<S4>();
2690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  a_s4[g_zero] = 1 + *GetPoisoned<S4>();
2700231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
2710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Phi1) {
2730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 c;
2740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (g_one) {
2750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    c = *GetPoisoned<S4>();
2760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  } else {
27712c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov    break_optimization(0);
2780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    c = 0;
2790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  }
28011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(c);
2810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
2820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Phi2) {
2840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 i = *GetPoisoned<S4>();
2850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 n = g_one;
28611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_UMR(for (; i < g_one; i++););
28711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(i);
2880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
2890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
29011929000ec2919192b3be457f5a44c71ed55215eEvgeniy StepanovNOINLINE void Arg1ExpectUMR(S4 a1) { EXPECT_POISONED(a1); }
29111929000ec2919192b3be457f5a44c71ed55215eEvgeniy StepanovNOINLINE void Arg2ExpectUMR(S4 a1, S4 a2) { EXPECT_POISONED(a2); }
29211929000ec2919192b3be457f5a44c71ed55215eEvgeniy StepanovNOINLINE void Arg3ExpectUMR(S1 a1, S4 a2, S8 a3) { EXPECT_POISONED(a3); }
2930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, ArgTest) {
2950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  Arg1ExpectUMR(*GetPoisoned<S4>());
2960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  Arg2ExpectUMR(0, *GetPoisoned<S4>());
2970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  Arg3ExpectUMR(0, 1, *GetPoisoned<S8>());
2980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
2990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
3000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
3010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, CallAndRet) {
3020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ReturnPoisoned<S1>();
3030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ReturnPoisoned<S2>();
3040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ReturnPoisoned<S4>();
3050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ReturnPoisoned<S8>();
3060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
30711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(ReturnPoisoned<S1>());
30811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(ReturnPoisoned<S2>());
30911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(ReturnPoisoned<S4>());
31011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(ReturnPoisoned<S8>());
3110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
3120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
3130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// malloc() in the following test may be optimized to produce a compile-time
3140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// undef value. Check that we trap on the volatile assignment anyway.
3150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, DISABLED_MallocNoIdent) {
3160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 *x = (int*)malloc(sizeof(S4));
31711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*x);
3180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  free(x);
3190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
3200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
3210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Malloc) {
3220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 *x = (int*)Ident(malloc(sizeof(S4)));
32311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*x);
3240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  free(x);
3250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
3260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
3270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Realloc) {
3280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 *x = (int*)Ident(realloc(0, sizeof(S4)));
32911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(x[0]);
3300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[0] = 1;
3310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x = (int*)Ident(realloc(x, 2 * sizeof(S4)));
33211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);  // Ok, was inited before.
33311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(x[1]);
3340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x = (int*)Ident(realloc(x, 3 * sizeof(S4)));
33511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);  // Ok, was inited before.
33611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(x[2]);
33711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(x[1]);
3380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[2] = 1;  // Init this here. Check that after realloc it is poisoned again.
3390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x = (int*)Ident(realloc(x, 2 * sizeof(S4)));
34011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);  // Ok, was inited before.
34111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(x[1]);
3420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x = (int*)Ident(realloc(x, 3 * sizeof(S4)));
34311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(x[1]);
34411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(x[2]);
3450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  free(x);
3460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
3470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
3480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Calloc) {
3490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 *x = (int*)Ident(calloc(1, sizeof(S4)));
35011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*x);  // Should not be poisoned.
3512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_EQ(0, *x);
3520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  free(x);
3530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
3540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
3552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, CallocReturnsZeroMem) {
3562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  size_t sizes[] = {16, 1000, 10000, 100000, 2100000};
3572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  for (size_t s = 0; s < sizeof(sizes)/sizeof(sizes[0]); s++) {
3582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    size_t size = sizes[s];
3592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    for (size_t iter = 0; iter < 5; iter++) {
3602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      char *x = Ident((char*)calloc(1, size));
3612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      EXPECT_EQ(x[0], 0);
3622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      EXPECT_EQ(x[size - 1], 0);
3632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      EXPECT_EQ(x[size / 2], 0);
3642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      EXPECT_EQ(x[size / 3], 0);
3652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      EXPECT_EQ(x[size / 4], 0);
3662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      memset(x, 0x42, size);
3672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      free(Ident(x));
3682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    }
3692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  }
3702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
3712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
3720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, AndOr) {
3730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U4 *p = GetPoisoned<U4>();
3740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // We poison two bytes in the midle of a 4-byte word to make the test
3750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // correct regardless of endianness.
3760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ((U1*)p)[1] = 0;
3770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ((U1*)p)[2] = 0xff;
37811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*p & 0x00ffff00);
37911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*p & 0x00ff0000);
38011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*p & 0x0000ff00);
38111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*p & 0xff000000);
38211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*p & 0x000000ff);
38311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*p & 0x0000ffff);
38411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*p & 0xffff0000);
3850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
38611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*p | 0xff0000ff);
38711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*p | 0xff00ffff);
38811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*p | 0xffff00ff);
38911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*p | 0xff000000);
39011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*p | 0x000000ff);
39111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*p | 0x0000ffff);
39211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*p | 0xffff0000);
3930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
39411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<bool>() & *GetPoisoned<bool>());
3950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
3960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
3970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T>
39811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovstatic bool applyNot(T value, T shadow) {
3990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_partial_poison(&value, &shadow, sizeof(T));
40011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  return !value;
4010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Not) {
40411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U4>(0x0, 0x0));
40511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U4>(0xFFFFFFFF, 0x0));
40611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(applyNot<U4>(0xFFFFFFFF, 0xFFFFFFFF));
40711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U4>(0xFF000000, 0x0FFFFFFF));
40811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U4>(0xFF000000, 0x00FFFFFF));
40911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U4>(0xFF000000, 0x0000FFFF));
41011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U4>(0xFF000000, 0x00000000));
41111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(applyNot<U4>(0xFF000000, 0xFF000000));
41211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U4>(0xFF800000, 0xFF000000));
41311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(applyNot<U4>(0x00008000, 0x00008000));
41411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
41511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U1>(0x0, 0x0));
41611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U1>(0xFF, 0xFE));
41711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U1>(0xFF, 0x0));
41811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(applyNot<U1>(0xFF, 0xFF));
41911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
42011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(applyNot<void*>((void*)0xFFFFFF, (void*)(-1)));
42111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<void*>((void*)0xFFFFFF, (void*)(-2)));
4220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Shift) {
4250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U4 *up = GetPoisoned<U4>();
4260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ((U1*)up)[0] = 0;
4270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ((U1*)up)[3] = 0xff;
42811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*up >> 30);
42911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*up >> 24);
43011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*up >> 23);
43111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*up >> 10);
4320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
43311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*up << 30);
43411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*up << 24);
43511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*up << 23);
43611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*up << 10);
4370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 *sp = (S4*)up;
43911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*sp >> 30);
44011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*sp >> 24);
44111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*sp >> 23);
44211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*sp >> 10);
4430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  sp = GetPoisoned<S4>();
4450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ((S1*)sp)[1] = 0;
4460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ((S1*)sp)[2] = 0;
44711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*sp >> 31);
4480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
44911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(100 >> *GetPoisoned<S4>());
45011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(100U >> *GetPoisoned<S4>());
4510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE static int GetPoisonedZero() {
4540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int *zero = new int;
4550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *zero = 0;
4560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(zero, sizeof(*zero));
4570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = *zero;
4580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete zero;
4590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return res;
4600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, LoadFromDirtyAddress) {
4630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int *a = new int;
4640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *a = 0;
46512c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  EXPECT_UMR(break_optimization((void*)(U8)a[GetPoisonedZero()]));
4660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete a;
4670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, StoreToDirtyAddress) {
4700231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int *a = new int;
47111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_UMR(a[GetPoisonedZero()] = 0);
47212c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(a);
4730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete a;
4740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE void StackTestFunc() {
4780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 p4;
4790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 ok4 = 1;
4800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S2 p2;
4810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S2 ok2 = 1;
4820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S1 p1;
4830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S1 ok1 = 1;
48412c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&p4);
48512c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&ok4);
48612c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&p2);
48712c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&ok2);
48812c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&p1);
48912c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&ok1);
4900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
49111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(p4);
49211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(p2);
49311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(p1);
49411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(ok1);
49511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(ok2);
49611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(ok4);
4970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, StackTest) {
5000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StackTestFunc();
5010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
5020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE void StackStressFunc() {
5040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int foo[10000];
50512c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(foo);
5060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
5070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, DISABLED_StackStressTest) {
5090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  for (int i = 0; i < 1000000; i++)
5100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    StackStressFunc();
5110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
5120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T>
5140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovvoid TestFloatingPoint() {
5150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  static volatile T v;
5160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  static T g[100];
51712c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&g);
5180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *x = GetPoisoned<T>();
5190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *y = GetPoisoned<T>(1);
52011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*x);
52111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED((long long)*x);
52211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED((int)*x);
5230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  g[0] = *x;
5240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  g[1] = *x + *y;
5250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  g[2] = *x - *y;
5260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  g[3] = *x * *y;
5270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
5280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, FloatingPointTest) {
5300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestFloatingPoint<float>();
5310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestFloatingPoint<double>();
5320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
5330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, DynMem) {
5350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 x = 0;
5360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 *y = GetPoisoned<S4>();
5370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  memcpy(y, &x, g_one * sizeof(S4));
53811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*y);
5390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
5400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic char *DynRetTestStr;
5420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, DynRet) {
5440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ReturnPoisoned<S8>();
54586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  EXPECT_NOT_POISONED(atoi("0"));
5460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
5470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, DynRet1) {
5490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ReturnPoisoned<S8>();
5500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
5510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct LargeStruct {
5530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 x[10];
5540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
5550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE
5570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovLargeStruct LargeRetTest() {
5580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  LargeStruct res;
5590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[0] = *GetPoisoned<S4>();
5600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[1] = *GetPoisoned<S4>();
5610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[2] = *GetPoisoned<S4>();
5620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[3] = *GetPoisoned<S4>();
5630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[4] = *GetPoisoned<S4>();
5640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[5] = *GetPoisoned<S4>();
5650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[6] = *GetPoisoned<S4>();
5660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[7] = *GetPoisoned<S4>();
5670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[8] = *GetPoisoned<S4>();
5680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[9] = *GetPoisoned<S4>();
5690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return res;
5700231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
5710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
57267505a8a0cf9621243ed21b67dfa041224c78e4bAlexey SamsonovTEST(MemorySanitizer, strcmp) {
57367505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov  char s1[10];
57467505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov  char s2[10];
57567505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov  strncpy(s1, "foo", 10);
57667505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov  s2[0] = 'f';
57767505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov  s2[1] = 'n';
57867505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov  EXPECT_GT(strcmp(s1, s2), 0);
57967505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov  s2[1] = 'o';
58067505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov  int res;
58167505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov  EXPECT_UMR(res = strcmp(s1, s2));
58267505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov  EXPECT_NOT_POISONED(res);
58367505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov  EXPECT_EQ(strncmp(s1, s2, 1), 0);
58467505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov}
58567505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov
5860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, LargeRet) {
5870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  LargeStruct a = LargeRetTest();
58811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(a.x[0]);
58911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(a.x[9]);
5900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
5910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5921204979804868728edb6edfe3ae018465191a85cEvgeniy StepanovTEST(MemorySanitizer, strerror) {
5931204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov  char *buf = strerror(EINVAL);
5941204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov  EXPECT_NOT_POISONED(strlen(buf));
5951204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov  buf = strerror(123456);
5961204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov  EXPECT_NOT_POISONED(strlen(buf));
5971204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov}
5981204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov
5991204979804868728edb6edfe3ae018465191a85cEvgeniy StepanovTEST(MemorySanitizer, strerror_r) {
6001204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov  errno = 0;
6011204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov  char buf[1000];
60286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  char *res = (char*) (size_t) strerror_r(EINVAL, buf, sizeof(buf));
6031204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov  ASSERT_EQ(0, errno);
6041204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov  if (!res) res = buf; // POSIX version success.
6051204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov  EXPECT_NOT_POISONED(strlen(res));
6061204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov}
6071204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov
6080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, fread) {
6090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char *x = new char[32];
61086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  FILE *f = fopen(FILE_TO_READ, "r");
6112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(f != NULL);
6120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  fread(x, 1, 32, f);
61311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);
61411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[16]);
61511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[31]);
6160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  fclose(f);
6176d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  delete[] x;
6180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
6190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
6200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, read) {
6210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char *x = new char[32];
62286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  int fd = open(FILE_TO_READ, O_RDONLY);
6232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_GT(fd, 0);
6240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int sz = read(fd, x, 32);
6252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(sz, 32);
62611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);
62711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[16]);
62811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[31]);
6290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  close(fd);
6306d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  delete[] x;
6310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
6320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
6330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, pread) {
6340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char *x = new char[32];
63586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  int fd = open(FILE_TO_READ, O_RDONLY);
6362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_GT(fd, 0);
6370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int sz = pread(fd, x, 32, 0);
6382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(sz, 32);
63911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);
64011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[16]);
64111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[31]);
6420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  close(fd);
6436d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  delete[] x;
6440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
6450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
646b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy StepanovTEST(MemorySanitizer, readv) {
647b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  char buf[2011];
648b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  struct iovec iov[2];
649b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  iov[0].iov_base = buf + 1;
650b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  iov[0].iov_len = 5;
651b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  iov[1].iov_base = buf + 10;
652b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  iov[1].iov_len = 2000;
65386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  int fd = open(FILE_TO_READ, O_RDONLY);
6542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_GT(fd, 0);
655b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  int sz = readv(fd, iov, 2);
6562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_GE(sz, 0);
65786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  ASSERT_LE(sz, 5 + 2000);
6582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_GT((size_t)sz, iov[0].iov_len);
659b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_POISONED(buf[0]);
660b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[1]);
661b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[5]);
662b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_POISONED(buf[6]);
663b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_POISONED(buf[9]);
664b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[10]);
665b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[10 + (sz - 1) - 5]);
666b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_POISONED(buf[11 + (sz - 1) - 5]);
667b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  close(fd);
668b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov}
669b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov
670b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy StepanovTEST(MemorySanitizer, preadv) {
671b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  char buf[2011];
672b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  struct iovec iov[2];
673b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  iov[0].iov_base = buf + 1;
674b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  iov[0].iov_len = 5;
675b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  iov[1].iov_base = buf + 10;
676b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  iov[1].iov_len = 2000;
67786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  int fd = open(FILE_TO_READ, O_RDONLY);
6782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_GT(fd, 0);
679b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  int sz = preadv(fd, iov, 2, 3);
6802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_GE(sz, 0);
68186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  ASSERT_LE(sz, 5 + 2000);
6822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_GT((size_t)sz, iov[0].iov_len);
683b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_POISONED(buf[0]);
684b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[1]);
685b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[5]);
686b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_POISONED(buf[6]);
687b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_POISONED(buf[9]);
688b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[10]);
689b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[10 + (sz - 1) - 5]);
690b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_POISONED(buf[11 + (sz - 1) - 5]);
691b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  close(fd);
692b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov}
693b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov
6940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// FIXME: fails now.
6950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, DISABLED_ioctl) {
6960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  struct winsize ws;
6970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(ioctl(2, TIOCGWINSZ, &ws), 0);
69811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(ws.ws_col);
6990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
7000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
7010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, readlink) {
7020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char *x = new char[1000];
70386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  readlink(SYMLINK_TO_READ, x, 1000);
70411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);
7050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete [] x;
7060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
7070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
7080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, stat) {
7090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  struct stat* st = new struct stat;
71086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  int res = stat(FILE_TO_READ, st);
7112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
71211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(st->st_dev);
71311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(st->st_mode);
71411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(st->st_size);
7150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
7160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
717bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy StepanovTEST(MemorySanitizer, fstatat) {
718bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov  struct stat* st = new struct stat;
71986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  int dirfd = open(DIR_TO_READ, O_RDONLY);
7202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_GT(dirfd, 0);
72186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  int res = fstatat(dirfd, SUBFILE_TO_READ, st, 0);
7222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
723bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov  EXPECT_NOT_POISONED(st->st_dev);
724bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov  EXPECT_NOT_POISONED(st->st_mode);
725bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov  EXPECT_NOT_POISONED(st->st_size);
726bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov  close(dirfd);
727bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov}
728bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov
7290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, statfs) {
7305cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  struct statfs st;
7315cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  int res = statfs("/", &st);
7322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
7335cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  EXPECT_NOT_POISONED(st.f_type);
7345cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  EXPECT_NOT_POISONED(st.f_bfree);
7355cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  EXPECT_NOT_POISONED(st.f_namelen);
7365cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov}
7375cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov
7385cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy StepanovTEST(MemorySanitizer, statvfs) {
7395cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  struct statvfs st;
7405cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  int res = statvfs("/", &st);
7412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
7425cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  EXPECT_NOT_POISONED(st.f_bsize);
7435cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  EXPECT_NOT_POISONED(st.f_blocks);
7445cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  EXPECT_NOT_POISONED(st.f_bfree);
7455cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  EXPECT_NOT_POISONED(st.f_namemax);
7465cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov}
7475cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov
7485cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy StepanovTEST(MemorySanitizer, fstatvfs) {
7495cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  struct statvfs st;
7505cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  int fd = open("/", O_RDONLY | O_DIRECTORY);
7515cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  int res = fstatvfs(fd, &st);
7522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
7535cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  EXPECT_NOT_POISONED(st.f_bsize);
7545cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  EXPECT_NOT_POISONED(st.f_blocks);
7555cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  EXPECT_NOT_POISONED(st.f_bfree);
7565cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  EXPECT_NOT_POISONED(st.f_namemax);
7575cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  close(fd);
7580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
7590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
7600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, pipe) {
7610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* pipefd = new int[2];
7620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = pipe(pipefd);
7632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
76411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(pipefd[0]);
76511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(pipefd[1]);
7660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  close(pipefd[0]);
7670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  close(pipefd[1]);
7680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
7690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
770134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy StepanovTEST(MemorySanitizer, pipe2) {
771134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov  int* pipefd = new int[2];
772134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov  int res = pipe2(pipefd, O_NONBLOCK);
7732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
774134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov  EXPECT_NOT_POISONED(pipefd[0]);
775134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov  EXPECT_NOT_POISONED(pipefd[1]);
776134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov  close(pipefd[0]);
777134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov  close(pipefd[1]);
778134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov}
779134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov
780134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy StepanovTEST(MemorySanitizer, socketpair) {
781134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov  int sv[2];
782134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov  int res = socketpair(AF_UNIX, SOCK_STREAM, 0, sv);
7832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
784134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov  EXPECT_NOT_POISONED(sv[0]);
785134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov  EXPECT_NOT_POISONED(sv[1]);
786134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov  close(sv[0]);
787134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov  close(sv[1]);
788134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov}
789134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov
790e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy StepanovTEST(MemorySanitizer, poll) {
791e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  int* pipefd = new int[2];
792e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  int res = pipe(pipefd);
793e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  ASSERT_EQ(0, res);
794e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov
795e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  char data = 42;
796e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  res = write(pipefd[1], &data, 1);
797e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  ASSERT_EQ(1, res);
798e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov
799e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  pollfd fds[2];
800e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  fds[0].fd = pipefd[0];
801e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  fds[0].events = POLLIN;
802e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  fds[1].fd = pipefd[1];
803e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  fds[1].events = POLLIN;
804e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  res = poll(fds, 2, 500);
805e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  ASSERT_EQ(1, res);
806e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  EXPECT_NOT_POISONED(fds[0].revents);
807e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  EXPECT_NOT_POISONED(fds[1].revents);
808e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov
809e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  close(pipefd[0]);
810e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  close(pipefd[1]);
811e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov}
812e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov
81386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There is no ppoll() on FreeBSD.
81486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined (__FreeBSD__)
81547177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy StepanovTEST(MemorySanitizer, ppoll) {
81647177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  int* pipefd = new int[2];
81747177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  int res = pipe(pipefd);
81847177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  ASSERT_EQ(0, res);
81947177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov
82047177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  char data = 42;
82147177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  res = write(pipefd[1], &data, 1);
82247177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  ASSERT_EQ(1, res);
82347177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov
82447177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  pollfd fds[2];
82547177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  fds[0].fd = pipefd[0];
82647177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  fds[0].events = POLLIN;
82747177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  fds[1].fd = pipefd[1];
82847177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  fds[1].events = POLLIN;
82947177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  sigset_t ss;
83047177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  sigemptyset(&ss);
83147177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  res = ppoll(fds, 2, NULL, &ss);
83247177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  ASSERT_EQ(1, res);
83347177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  EXPECT_NOT_POISONED(fds[0].revents);
83447177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  EXPECT_NOT_POISONED(fds[1].revents);
83547177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov
83647177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  close(pipefd[0]);
83747177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  close(pipefd[1]);
83847177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov}
83986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif
84047177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov
841e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy StepanovTEST(MemorySanitizer, poll_positive) {
842e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  int* pipefd = new int[2];
843e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  int res = pipe(pipefd);
844e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  ASSERT_EQ(0, res);
845e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov
846e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  pollfd fds[2];
847e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  fds[0].fd = pipefd[0];
848e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  fds[0].events = POLLIN;
849e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  // fds[1].fd uninitialized
850e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  fds[1].events = POLLIN;
851e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  EXPECT_UMR(poll(fds, 2, 0));
852e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov
853e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  close(pipefd[0]);
854e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  close(pipefd[1]);
855e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov}
856e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov
8579f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy StepanovTEST(MemorySanitizer, bind_getsockname) {
8589f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  int sock = socket(AF_UNIX, SOCK_STREAM, 0);
8599f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov
8609f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  struct sockaddr_in sai;
8619f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  memset(&sai, 0, sizeof(sai));
8629f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  sai.sin_family = AF_UNIX;
8639f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  int res = bind(sock, (struct sockaddr *)&sai, sizeof(sai));
8649f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov
8652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
8669f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  char buf[200];
8679f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  socklen_t addrlen;
8689f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  EXPECT_UMR(getsockname(sock, (struct sockaddr *)&buf, &addrlen));
8699f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov
8709f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  addrlen = sizeof(buf);
8719f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  res = getsockname(sock, (struct sockaddr *)&buf, &addrlen);
8729f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  EXPECT_NOT_POISONED(addrlen);
8739f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[0]);
8749f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[addrlen - 1]);
8759f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  EXPECT_POISONED(buf[addrlen]);
8769f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  close(sock);
8779f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov}
8789f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov
8799d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy StepanovTEST(MemorySanitizer, accept) {
8809d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  int listen_socket = socket(AF_INET, SOCK_STREAM, 0);
8819d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  ASSERT_LT(0, listen_socket);
8829d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov
8839d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  struct sockaddr_in sai;
884ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  memset(&sai, 0, sizeof(sai));
8859d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  sai.sin_family = AF_INET;
8869d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  sai.sin_port = 0;
8879d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  sai.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
8889d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  int res = bind(listen_socket, (struct sockaddr *)&sai, sizeof(sai));
8899d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  ASSERT_EQ(0, res);
8909d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov
8919d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  res = listen(listen_socket, 1);
8929d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  ASSERT_EQ(0, res);
8939d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov
8949d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  socklen_t sz = sizeof(sai);
8959d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  res = getsockname(listen_socket, (struct sockaddr *)&sai, &sz);
8969d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  ASSERT_EQ(0, res);
8979d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  ASSERT_EQ(sizeof(sai), sz);
898bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov
8999d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  int connect_socket = socket(AF_INET, SOCK_STREAM, 0);
9009d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  ASSERT_LT(0, connect_socket);
9019d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  res = fcntl(connect_socket, F_SETFL, O_NONBLOCK);
9029d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  ASSERT_EQ(0, res);
9039d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  res = connect(connect_socket, (struct sockaddr *)&sai, sizeof(sai));
90486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  // On FreeBSD this connection completes immediately.
90586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  if (res != 0) {
90686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    ASSERT_EQ(-1, res);
90786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    ASSERT_EQ(EINPROGRESS, errno);
90886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  }
9099d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov
9109d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  __msan_poison(&sai, sizeof(sai));
911bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov  int new_sock = accept(listen_socket, (struct sockaddr *)&sai, &sz);
9129d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  ASSERT_LT(0, new_sock);
9139d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  ASSERT_EQ(sizeof(sai), sz);
9149d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  EXPECT_NOT_POISONED(sai);
9159d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov
916bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov  __msan_poison(&sai, sizeof(sai));
917bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov  res = getpeername(new_sock, (struct sockaddr *)&sai, &sz);
918bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov  ASSERT_EQ(0, res);
919bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov  ASSERT_EQ(sizeof(sai), sz);
920bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov  EXPECT_NOT_POISONED(sai);
921bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov
9229d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  close(new_sock);
9239d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  close(connect_socket);
9249d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  close(listen_socket);
9259d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov}
9269d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov
927512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy StepanovTEST(MemorySanitizer, getaddrinfo) {
928512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov  struct addrinfo *ai;
929512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov  struct addrinfo hints;
930512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov  memset(&hints, 0, sizeof(hints));
931512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov  hints.ai_family = AF_INET;
932512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov  int res = getaddrinfo("localhost", NULL, &hints, &ai);
933512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov  ASSERT_EQ(0, res);
934512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov  EXPECT_NOT_POISONED(*ai);
935512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov  ASSERT_EQ(sizeof(sockaddr_in), ai->ai_addrlen);
936512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov  EXPECT_NOT_POISONED(*(sockaddr_in*)ai->ai_addr);
937512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov}
938512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov
9399eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy StepanovTEST(MemorySanitizer, getnameinfo) {
9409eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov  struct sockaddr_in sai;
941ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  memset(&sai, 0, sizeof(sai));
9429eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov  sai.sin_family = AF_INET;
9439eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov  sai.sin_port = 80;
9449eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov  sai.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
9459eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov  char host[500];
9469eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov  char serv[500];
9479eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov  int res = getnameinfo((struct sockaddr *)&sai, sizeof(sai), host,
9489eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov                        sizeof(host), serv, sizeof(serv), 0);
9499eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov  ASSERT_EQ(0, res);
9509eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov  EXPECT_NOT_POISONED(host[0]);
9519eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov  EXPECT_POISONED(host[sizeof(host) - 1]);
9529eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov
9532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_NE(0U, strlen(host));
9549eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov  EXPECT_NOT_POISONED(serv[0]);
9559eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov  EXPECT_POISONED(serv[sizeof(serv) - 1]);
9562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_NE(0U, strlen(serv));
9579eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov}
9589eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov
9590a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov#define EXPECT_HOSTENT_NOT_POISONED(he)        \
9600a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  do {                                         \
9610a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov    EXPECT_NOT_POISONED(*(he));                \
9620a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov    ASSERT_NE((void *) 0, (he)->h_name);       \
9630a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov    ASSERT_NE((void *) 0, (he)->h_aliases);    \
9640a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov    ASSERT_NE((void *) 0, (he)->h_addr_list);  \
9650a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov    EXPECT_NOT_POISONED(strlen((he)->h_name)); \
9660a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov    char **p = (he)->h_aliases;                \
9670a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov    while (*p) {                               \
9680a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov      EXPECT_NOT_POISONED(strlen(*p));         \
9690a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov      ++p;                                     \
9700a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov    }                                          \
9710a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov    char **q = (he)->h_addr_list;              \
9720a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov    while (*q) {                               \
9730a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov      EXPECT_NOT_POISONED(*q[0]);              \
9740a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov      ++q;                                     \
9750a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov    }                                          \
9760a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov    EXPECT_NOT_POISONED(*q);                   \
9770a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  } while (0)
9780a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov
9790a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovTEST(MemorySanitizer, gethostent) {
9800a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  struct hostent *he = gethostent();
9810a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  ASSERT_NE((void *)NULL, he);
9820a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_HOSTENT_NOT_POISONED(he);
9830a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov}
9840a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov
985263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov#ifndef MSAN_TEST_DISABLE_GETHOSTBYNAME
986263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov
9870a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovTEST(MemorySanitizer, gethostbyname) {
9880a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  struct hostent *he = gethostbyname("localhost");
9890a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  ASSERT_NE((void *)NULL, he);
9900a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_HOSTENT_NOT_POISONED(he);
9910a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov}
9920a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov
993263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov#endif // MSAN_TEST_DISABLE_GETHOSTBYNAME
994263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov
995ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy StepanovTEST(MemorySanitizer, recvmsg) {
996ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  int server_socket = socket(AF_INET, SOCK_DGRAM, 0);
997ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  ASSERT_LT(0, server_socket);
998ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov
999ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  struct sockaddr_in sai;
1000ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  memset(&sai, 0, sizeof(sai));
1001ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  sai.sin_family = AF_INET;
1002ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  sai.sin_port = 0;
1003ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  sai.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
1004ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  int res = bind(server_socket, (struct sockaddr *)&sai, sizeof(sai));
1005ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  ASSERT_EQ(0, res);
1006ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov
1007ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  socklen_t sz = sizeof(sai);
1008ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  res = getsockname(server_socket, (struct sockaddr *)&sai, &sz);
1009ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  ASSERT_EQ(0, res);
1010ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  ASSERT_EQ(sizeof(sai), sz);
1011ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov
1012ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov
1013ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  int client_socket = socket(AF_INET, SOCK_DGRAM, 0);
1014ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  ASSERT_LT(0, client_socket);
1015ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov
1016ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  struct sockaddr_in client_sai;
1017ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  memset(&client_sai, 0, sizeof(client_sai));
1018ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  client_sai.sin_family = AF_INET;
1019ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  client_sai.sin_port = 0;
1020ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  client_sai.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
1021ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  res = bind(client_socket, (struct sockaddr *)&client_sai, sizeof(client_sai));
1022ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  ASSERT_EQ(0, res);
1023ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov
1024ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  sz = sizeof(client_sai);
1025ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  res = getsockname(client_socket, (struct sockaddr *)&client_sai, &sz);
1026ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  ASSERT_EQ(0, res);
1027ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  ASSERT_EQ(sizeof(client_sai), sz);
1028ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov
1029ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  const char *s = "message text";
1030ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  struct iovec iov;
1031ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  iov.iov_base = (void *)s;
1032ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  iov.iov_len = strlen(s) + 1;
1033ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  struct msghdr msg;
1034ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  memset(&msg, 0, sizeof(msg));
1035ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  msg.msg_name = &sai;
1036ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  msg.msg_namelen = sizeof(sai);
1037ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  msg.msg_iov = &iov;
1038ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  msg.msg_iovlen = 1;
1039ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  res = sendmsg(client_socket, &msg, 0);
1040ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  ASSERT_LT(0, res);
1041ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov
1042ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov
1043ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  char buf[1000];
1044ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  struct iovec recv_iov;
1045ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  recv_iov.iov_base = (void *)&buf;
1046ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  recv_iov.iov_len = sizeof(buf);
1047ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  struct sockaddr_in recv_sai;
1048ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  struct msghdr recv_msg;
1049ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  memset(&recv_msg, 0, sizeof(recv_msg));
1050ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  recv_msg.msg_name = &recv_sai;
1051ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  recv_msg.msg_namelen = sizeof(recv_sai);
1052ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  recv_msg.msg_iov = &recv_iov;
1053ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  recv_msg.msg_iovlen = 1;
1054ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  res = recvmsg(server_socket, &recv_msg, 0);
1055ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  ASSERT_LT(0, res);
1056ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov
1057ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  ASSERT_EQ(sizeof(recv_sai), recv_msg.msg_namelen);
1058ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  EXPECT_NOT_POISONED(*(struct sockaddr_in *)recv_msg.msg_name);
1059ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  EXPECT_STREQ(s, buf);
1060ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov
1061ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  close(server_socket);
1062ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  close(client_socket);
1063ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov}
1064ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov
10650a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovTEST(MemorySanitizer, gethostbyname2) {
10660a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  struct hostent *he = gethostbyname2("localhost", AF_INET);
10670a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  ASSERT_NE((void *)NULL, he);
10680a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_HOSTENT_NOT_POISONED(he);
10690a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov}
10700a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov
10710a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovTEST(MemorySanitizer, gethostbyaddr) {
10720a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  in_addr_t addr = inet_addr("127.0.0.1");
10730a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_NOT_POISONED(addr);
10740a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  struct hostent *he = gethostbyaddr(&addr, sizeof(addr), AF_INET);
10750a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  ASSERT_NE((void *)NULL, he);
10760a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_HOSTENT_NOT_POISONED(he);
10770a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov}
10780a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov
10790a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovTEST(MemorySanitizer, gethostent_r) {
10800a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  char buf[2000];
10810a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  struct hostent he;
10820a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  struct hostent *result;
10830a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  int err;
10840a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  int res = gethostent_r(&he, buf, sizeof(buf), &result, &err);
10850a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  ASSERT_EQ(0, res);
10860a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_NOT_POISONED(result);
10870a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  ASSERT_NE((void *)NULL, result);
10880a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_HOSTENT_NOT_POISONED(result);
10890a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_NOT_POISONED(err);
10900a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov}
10910a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov
10920a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovTEST(MemorySanitizer, gethostbyname_r) {
10930a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  char buf[2000];
10940a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  struct hostent he;
10950a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  struct hostent *result;
10960a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  int err;
10970a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  int res = gethostbyname_r("localhost", &he, buf, sizeof(buf), &result, &err);
10980a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  ASSERT_EQ(0, res);
10990a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_NOT_POISONED(result);
11000a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  ASSERT_NE((void *)NULL, result);
11010a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_HOSTENT_NOT_POISONED(result);
11020a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_NOT_POISONED(err);
11030a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov}
11040a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov
11052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, gethostbyname_r_bad_host_name) {
11062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  char buf[2000];
11072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  struct hostent he;
11082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  struct hostent *result;
11092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  int err;
11102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  int res = gethostbyname_r("bad-host-name", &he, buf, sizeof(buf), &result, &err);
11112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ((struct hostent *)0, result);
11122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(err);
11132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
11142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
11152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, gethostbyname_r_erange) {
11162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  char buf[5];
11172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  struct hostent he;
11182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  struct hostent *result;
11192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  int err;
11202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  int res = gethostbyname_r("localhost", &he, buf, sizeof(buf), &result, &err);
11212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(ERANGE, res);
11222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(err);
11232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
11242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
11250a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovTEST(MemorySanitizer, gethostbyname2_r) {
11260a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  char buf[2000];
11270a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  struct hostent he;
11280a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  struct hostent *result;
11290a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  int err;
11300a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  int res = gethostbyname2_r("localhost", AF_INET, &he, buf, sizeof(buf),
11310a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov                             &result, &err);
11320a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  ASSERT_EQ(0, res);
11330a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_NOT_POISONED(result);
11340a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  ASSERT_NE((void *)NULL, result);
11350a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_HOSTENT_NOT_POISONED(result);
11360a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_NOT_POISONED(err);
11370a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov}
11380a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov
11390a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovTEST(MemorySanitizer, gethostbyaddr_r) {
11400a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  char buf[2000];
11410a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  struct hostent he;
11420a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  struct hostent *result;
11430a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  int err;
11440a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  in_addr_t addr = inet_addr("127.0.0.1");
11450a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_NOT_POISONED(addr);
11460a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  int res = gethostbyaddr_r(&addr, sizeof(addr), AF_INET, &he, buf, sizeof(buf),
11470a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov                            &result, &err);
11480a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  ASSERT_EQ(0, res);
11490a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_NOT_POISONED(result);
11500a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  ASSERT_NE((void *)NULL, result);
11510a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_HOSTENT_NOT_POISONED(result);
11520a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_NOT_POISONED(err);
11530a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov}
11540a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov
1155f32be42523a199674ea665a499db131591e64e08Evgeniy StepanovTEST(MemorySanitizer, getsockopt) {
1156f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov  int sock = socket(AF_UNIX, SOCK_STREAM, 0);
1157f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov  struct linger l[2];
1158f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov  socklen_t sz = sizeof(l[0]);
1159f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov  int res = getsockopt(sock, SOL_SOCKET, SO_LINGER, &l[0], &sz);
1160f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov  ASSERT_EQ(0, res);
1161f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov  ASSERT_EQ(sizeof(l[0]), sz);
1162f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov  EXPECT_NOT_POISONED(l[0]);
1163f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov  EXPECT_POISONED(*(char *)(l + 1));
1164f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov}
1165f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov
11660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, getcwd) {
11670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char path[PATH_MAX + 1];
11680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* res = getcwd(path, sizeof(path));
11692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(res != NULL);
117011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(path[0]);
11710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
11720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
11737eed04c4dce69ad1e485edbf6dd963e176b52e0dEvgeniy StepanovTEST(MemorySanitizer, getcwd_gnu) {
11747eed04c4dce69ad1e485edbf6dd963e176b52e0dEvgeniy Stepanov  char* res = getcwd(NULL, 0);
11752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(res != NULL);
11767eed04c4dce69ad1e485edbf6dd963e176b52e0dEvgeniy Stepanov  EXPECT_NOT_POISONED(res[0]);
11777eed04c4dce69ad1e485edbf6dd963e176b52e0dEvgeniy Stepanov  free(res);
11787eed04c4dce69ad1e485edbf6dd963e176b52e0dEvgeniy Stepanov}
11797eed04c4dce69ad1e485edbf6dd963e176b52e0dEvgeniy Stepanov
118086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no get_current_dir_name() on FreeBSD.
118186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__)
1182801448950d645813efb398575bbc62b48e5b1dfcEvgeniy StepanovTEST(MemorySanitizer, get_current_dir_name) {
1183801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  char* res = get_current_dir_name();
11842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(res != NULL);
1185801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  EXPECT_NOT_POISONED(res[0]);
1186801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  free(res);
1187801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov}
118886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif
1189801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov
119010362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy StepanovTEST(MemorySanitizer, shmctl) {
119110362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  int id = shmget(IPC_PRIVATE, 4096, 0644 | IPC_CREAT);
119210362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  ASSERT_GT(id, -1);
119310362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov
119410362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  struct shmid_ds ds;
119510362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  int res = shmctl(id, IPC_STAT, &ds);
119610362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  ASSERT_GT(res, -1);
119710362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  EXPECT_NOT_POISONED(ds);
119810362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov
119986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  // FreeBSD does not support shmctl(IPC_INFO) and shmctl(SHM_INFO).
120086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__)
120110362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  struct shminfo si;
120210362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  res = shmctl(id, IPC_INFO, (struct shmid_ds *)&si);
120310362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  ASSERT_GT(res, -1);
120410362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  EXPECT_NOT_POISONED(si);
120510362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov
120610362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  struct shm_info s_i;
120710362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  res = shmctl(id, SHM_INFO, (struct shmid_ds *)&s_i);
120810362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  ASSERT_GT(res, -1);
120910362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  EXPECT_NOT_POISONED(s_i);
121086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif
121110362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov
121210362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  res = shmctl(id, IPC_RMID, 0);
121310362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  ASSERT_GT(res, -1);
121410362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov}
121510362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov
1216f3603890015c130420def39d67a02c2fdafc6f84Evgeniy StepanovTEST(MemorySanitizer, shmat) {
1217f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov  void *p = mmap(NULL, 4096, PROT_READ | PROT_WRITE,
121886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines                 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
1219f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov  ASSERT_NE(MAP_FAILED, p);
1220f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov
1221f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov  ((char *)p)[10] = *GetPoisoned<U1>();
1222f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov  ((char *)p)[4095] = *GetPoisoned<U1>();
1223f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov
1224f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov  int res = munmap(p, 4096);
1225f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov  ASSERT_EQ(0, res);
1226f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov
1227f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov  int id = shmget(IPC_PRIVATE, 4096, 0644 | IPC_CREAT);
1228f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov  ASSERT_GT(id, -1);
1229f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov
1230f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov  void *q = shmat(id, p, 0);
1231f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov  ASSERT_EQ(p, q);
1232f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov
1233f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov  EXPECT_NOT_POISONED(((char *)q)[0]);
1234f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov  EXPECT_NOT_POISONED(((char *)q)[10]);
1235f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov  EXPECT_NOT_POISONED(((char *)q)[4095]);
1236f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov
1237f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov  res = shmdt(q);
1238f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov  ASSERT_EQ(0, res);
1239f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov
1240f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov  res = shmctl(id, IPC_RMID, 0);
1241f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov  ASSERT_GT(res, -1);
1242f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov}
1243f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov
124486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no random_r() on FreeBSD.
124586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__)
1246aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy StepanovTEST(MemorySanitizer, random_r) {
1247aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov  int32_t x;
1248aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov  char z[64];
1249e46ecb155b22c8ea37235ebe317e0de1edf6b001Evgeniy Stepanov  memset(z, 0, sizeof(z));
1250e46ecb155b22c8ea37235ebe317e0de1edf6b001Evgeniy Stepanov
1251aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov  struct random_data buf;
1252e46ecb155b22c8ea37235ebe317e0de1edf6b001Evgeniy Stepanov  memset(&buf, 0, sizeof(buf));
1253aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov
1254aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov  int res = initstate_r(0, z, sizeof(z), &buf);
1255aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov  ASSERT_EQ(0, res);
1256aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov
1257aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov  res = random_r(&buf, &x);
1258aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov  ASSERT_EQ(0, res);
1259aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov  EXPECT_NOT_POISONED(x);
1260aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov}
126186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif
126210362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov
12635ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy StepanovTEST(MemorySanitizer, confstr) {
12645ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov  char buf[3];
12655ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov  size_t res = confstr(_CS_PATH, buf, sizeof(buf));
12665ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov  ASSERT_GT(res, sizeof(buf));
12675ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[0]);
12685ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[sizeof(buf) - 1]);
12695ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov
12705ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov  char buf2[1000];
12715ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov  res = confstr(_CS_PATH, buf2, sizeof(buf2));
12725ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov  ASSERT_LT(res, sizeof(buf2));
12735ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov  EXPECT_NOT_POISONED(buf2[0]);
12745ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov  EXPECT_NOT_POISONED(buf2[res - 1]);
12755ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov  EXPECT_POISONED(buf2[res]);
12765ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov  ASSERT_EQ(res, strlen(buf2) + 1);
12775ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov}
12785ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov
127986277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST(MemorySanitizer, opendir) {
128086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  DIR *dir = opendir(".");
128186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  closedir(dir);
128286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
128386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  char name[10] = ".";
128486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  __msan_poison(name, sizeof(name));
128586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  EXPECT_UMR(dir = opendir(name));
128686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  closedir(dir);
128786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines}
128886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
1289d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy StepanovTEST(MemorySanitizer, readdir) {
1290d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov  DIR *dir = opendir(".");
1291d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov  struct dirent *d = readdir(dir);
12922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(d != NULL);
1293d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov  EXPECT_NOT_POISONED(d->d_name[0]);
1294d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov  closedir(dir);
1295d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov}
1296d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov
1297b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy StepanovTEST(MemorySanitizer, readdir_r) {
1298b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov  DIR *dir = opendir(".");
1299b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov  struct dirent d;
1300b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov  struct dirent *pd;
1301b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov  int res = readdir_r(dir, &d, &pd);
13022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
1303b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov  EXPECT_NOT_POISONED(pd);
1304b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov  EXPECT_NOT_POISONED(d.d_name[0]);
1305b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov  closedir(dir);
1306b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov}
1307b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov
13080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, realpath) {
13090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  const char* relpath = ".";
13100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char path[PATH_MAX + 1];
13110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* res = realpath(relpath, path);
13122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(res != NULL);
131311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(path[0]);
13140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
13150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
131612eb79dd701d9d40551759330a9257316601373bEvgeniy StepanovTEST(MemorySanitizer, realpath_null) {
131712eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov  const char* relpath = ".";
131812eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov  char* res = realpath(relpath, NULL);
131912eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov  printf("%d, %s\n", errno, strerror(errno));
13202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(res != NULL);
132112eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov  EXPECT_NOT_POISONED(res[0]);
132212eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov  free(res);
132312eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov}
132412eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov
132586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no canonicalize_file_name() on FreeBSD.
132686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__)
132712eb79dd701d9d40551759330a9257316601373bEvgeniy StepanovTEST(MemorySanitizer, canonicalize_file_name) {
132812eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov  const char* relpath = ".";
132912eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov  char* res = canonicalize_file_name(relpath);
13302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(res != NULL);
133112eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov  EXPECT_NOT_POISONED(res[0]);
133212eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov  free(res);
1333534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov}
133486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif
1335534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov
1336534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanovextern char **environ;
1337534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov
1338534e2ba5188e1a74b340f9507755806357835f62Evgeniy StepanovTEST(MemorySanitizer, setenv) {
1339534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov  setenv("AAA", "BBB", 1);
1340534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov  for (char **envp = environ; *envp; ++envp) {
1341534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov    EXPECT_NOT_POISONED(*envp);
1342534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov    EXPECT_NOT_POISONED(*envp[0]);
1343534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov  }
1344534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov}
1345534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov
1346534e2ba5188e1a74b340f9507755806357835f62Evgeniy StepanovTEST(MemorySanitizer, putenv) {
1347534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov  char s[] = "AAA=BBB";
1348534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov  putenv(s);
1349534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov  for (char **envp = environ; *envp; ++envp) {
1350534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov    EXPECT_NOT_POISONED(*envp);
1351534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov    EXPECT_NOT_POISONED(*envp[0]);
1352534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov  }
135312eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov}
135412eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov
13550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, memcpy) {
13560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* x = new char[2];
13570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* y = new char[2];
13580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[0] = 1;
13590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[1] = *GetPoisoned<char>();
13600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  memcpy(y, x, 2);
136111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(y[0]);
136211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(y[1]);
13630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
13640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
13656a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hinesvoid TestUnalignedMemcpy(unsigned left, unsigned right, bool src_is_aligned,
13666a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines                         bool src_is_poisoned, bool dst_is_poisoned) {
13676a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  fprintf(stderr, "%s(%d, %d, %d, %d, %d)\n", __func__, left, right,
13686a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines          src_is_aligned, src_is_poisoned, dst_is_poisoned);
13696a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines
13706a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  const unsigned sz = 20;
13716a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  U4 dst_origin, src_origin;
1372450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov  char *dst = (char *)malloc(sz);
13736a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  if (dst_is_poisoned)
13746a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines    dst_origin = __msan_get_origin(dst);
13756a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  else
13766a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines    memset(dst, 0, sz);
1377450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov
1378450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov  char *src = (char *)malloc(sz);
13796a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  if (src_is_poisoned)
13806a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines    src_origin = __msan_get_origin(src);
13816a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  else
13826a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines    memset(src, 0, sz);
1383450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov
1384450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov  memcpy(dst + left, src_is_aligned ? src + left : src, sz - left - right);
13856a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines
13866a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  for (unsigned i = 0; i < (left & (~3U)); ++i)
13876a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines    if (dst_is_poisoned)
13886a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines      EXPECT_POISONED_O(dst[i], dst_origin);
13896a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines    else
13906a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines      EXPECT_NOT_POISONED(dst[i]);
13916a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines
13926a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  for (unsigned i = 0; i < (right & (~3U)); ++i)
13936a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines    if (dst_is_poisoned)
13946a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines      EXPECT_POISONED_O(dst[sz - i - 1], dst_origin);
13956a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines    else
13966a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines      EXPECT_NOT_POISONED(dst[sz - i - 1]);
13976a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines
13986a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  for (unsigned i = left; i < sz - right; ++i)
13996a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines    if (src_is_poisoned)
14006a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines      EXPECT_POISONED_O(dst[i], src_origin);
14016a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines    else
14026a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines      EXPECT_NOT_POISONED(dst[i]);
1403450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov
1404450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov  free(dst);
1405450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov  free(src);
1406450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov}
1407450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov
1408450eee655289a622ab9acf87d863f38991b184c9Evgeniy StepanovTEST(MemorySanitizer, memcpy_unaligned) {
14096a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  for (int i = 0; i < 10; ++i)
14106a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines    for (int j = 0; j < 10; ++j)
14116a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines      for (int aligned = 0; aligned < 2; ++aligned)
14126a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines        for (int srcp = 0; srcp < 2; ++srcp)
14136a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines          for (int dstp = 0; dstp < 2; ++dstp)
14146a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines            TestUnalignedMemcpy(i, j, aligned, srcp, dstp);
1415450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov}
1416450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov
14170231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, memmove) {
14180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* x = new char[2];
14190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* y = new char[2];
14200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[0] = 1;
14210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[1] = *GetPoisoned<char>();
14220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  memmove(y, x, 2);
142311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(y[0]);
142411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(y[1]);
14250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
14260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
14275492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy StepanovTEST(MemorySanitizer, memccpy_nomatch) {
14285492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  char* x = new char[5];
14295492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  char* y = new char[5];
14305492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  strcpy(x, "abc");
14315492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  memccpy(y, x, 'd', 4);
14325492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  EXPECT_NOT_POISONED(y[0]);
14335492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  EXPECT_NOT_POISONED(y[1]);
14345492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  EXPECT_NOT_POISONED(y[2]);
14355492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  EXPECT_NOT_POISONED(y[3]);
14365492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  EXPECT_POISONED(y[4]);
14375492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  delete[] x;
14385492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  delete[] y;
14395492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov}
14405492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov
14415492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy StepanovTEST(MemorySanitizer, memccpy_match) {
14425492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  char* x = new char[5];
14435492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  char* y = new char[5];
14445492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  strcpy(x, "abc");
14455492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  memccpy(y, x, 'b', 4);
14465492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  EXPECT_NOT_POISONED(y[0]);
14475492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  EXPECT_NOT_POISONED(y[1]);
14485492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  EXPECT_POISONED(y[2]);
14495492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  EXPECT_POISONED(y[3]);
14505492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  EXPECT_POISONED(y[4]);
14515492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  delete[] x;
14525492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  delete[] y;
14535492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov}
14545492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov
14555492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy StepanovTEST(MemorySanitizer, memccpy_nomatch_positive) {
14565492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  char* x = new char[5];
14575492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  char* y = new char[5];
14585492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  strcpy(x, "abc");
14595492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  EXPECT_UMR(memccpy(y, x, 'd', 5));
14605492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  delete[] x;
14615492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  delete[] y;
14625492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov}
14635492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov
14645492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy StepanovTEST(MemorySanitizer, memccpy_match_positive) {
14655492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  char* x = new char[5];
14665492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  char* y = new char[5];
14675492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  x[0] = 'a';
14685492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  x[2] = 'b';
14695492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  EXPECT_UMR(memccpy(y, x, 'b', 5));
14705492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  delete[] x;
14715492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  delete[] y;
14725492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov}
14735492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov
1474ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy StepanovTEST(MemorySanitizer, bcopy) {
1475ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  char* x = new char[2];
1476ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  char* y = new char[2];
1477ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  x[0] = 1;
1478ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  x[1] = *GetPoisoned<char>();
1479ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  bcopy(x, y, 2);
1480ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  EXPECT_NOT_POISONED(y[0]);
1481ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  EXPECT_POISONED(y[1]);
1482ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov}
1483ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov
14840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, strdup) {
14858aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  char buf[4] = "abc";
14868aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  __msan_poison(buf + 2, sizeof(*buf));
14878aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  char *x = strdup(buf);
14888aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);
14898aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_NOT_POISONED(x[1]);
14908aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_POISONED(x[2]);
14918aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_NOT_POISONED(x[3]);
14928aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  free(x);
14938aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov}
14948aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov
14958aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy StepanovTEST(MemorySanitizer, strndup) {
14968aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  char buf[4] = "abc";
14978aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  __msan_poison(buf + 2, sizeof(*buf));
14988aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  char *x = strndup(buf, 3);
14998aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);
15008aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_NOT_POISONED(x[1]);
15018aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_POISONED(x[2]);
15028aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_NOT_POISONED(x[3]);
15030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  free(x);
15040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
15050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
15068aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy StepanovTEST(MemorySanitizer, strndup_short) {
15078aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  char buf[4] = "abc";
15088aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  __msan_poison(buf + 1, sizeof(*buf));
15098aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  __msan_poison(buf + 2, sizeof(*buf));
15108aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  char *x = strndup(buf, 2);
15118aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);
15128aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_POISONED(x[1]);
15131d21bd159c3830dd7a6c05854408442d91a336adEvgeniy Stepanov  EXPECT_NOT_POISONED(x[2]);
15148aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  free(x);
15158aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov}
15168aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov
15178aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov
15180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T, int size>
15190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovvoid TestOverlapMemmove() {
15200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *x = new T[size];
15212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_GE(size, 3);
15220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[2] = 0;
15230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  memmove(x, x + 1, (size - 1) * sizeof(T));
152411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[1]);
15256d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  EXPECT_POISONED(x[0]);
15266d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  EXPECT_POISONED(x[2]);
15270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete [] x;
15280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
15290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
15300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, overlap_memmove) {
15310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestOverlapMemmove<U1, 10>();
15320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestOverlapMemmove<U1, 1000>();
15330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestOverlapMemmove<U8, 4>();
15340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestOverlapMemmove<U8, 1000>();
15350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
15360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
15370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, strcpy) {  // NOLINT
15380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* x = new char[3];
15390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* y = new char[3];
15400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[0] = 'a';
15410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[1] = *GetPoisoned<char>(1, 1);
15420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[2] = 0;
15430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  strcpy(y, x);  // NOLINT
154411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(y[0]);
154511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(y[1]);
154611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(y[2]);
15470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
15480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
15490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, strncpy) {  // NOLINT
15500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* x = new char[3];
15516d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  char* y = new char[5];
15520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[0] = 'a';
15530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[1] = *GetPoisoned<char>(1, 1);
15546d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  x[2] = '\0';
15556d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  strncpy(y, x, 4);  // NOLINT
155611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(y[0]);
155711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(y[1]);
15586d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  EXPECT_NOT_POISONED(y[2]);
15596d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  EXPECT_NOT_POISONED(y[3]);
15606d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  EXPECT_POISONED(y[4]);
15610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
15620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
15634bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy StepanovTEST(MemorySanitizer, stpcpy) {  // NOLINT
15644bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov  char* x = new char[3];
15654bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov  char* y = new char[3];
15664bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov  x[0] = 'a';
15674bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov  x[1] = *GetPoisoned<char>(1, 1);
15684bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov  x[2] = 0;
15694bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov  char *res = stpcpy(y, x);  // NOLINT
15704bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov  ASSERT_EQ(res, y + 2);
15714bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov  EXPECT_NOT_POISONED(y[0]);
15724bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov  EXPECT_POISONED(y[1]);
15734bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov  EXPECT_NOT_POISONED(y[2]);
15744bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov}
15754bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov
15762d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, strcat) {  // NOLINT
15772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  char a[10];
15782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  char b[] = "def";
15792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  strcpy(a, "abc");
15802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_poison(b + 1, 1);
15812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  strcat(a, b);
15822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(a[3]);
15832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(a[4]);
15842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(a[5]);
15852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(a[6]);
15862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(a[7]);
15872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
15882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
15892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, strncat) {  // NOLINT
15902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  char a[10];
15912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  char b[] = "def";
15922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  strcpy(a, "abc");
15932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_poison(b + 1, 1);
15942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  strncat(a, b, 5);
15952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(a[3]);
15962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(a[4]);
15972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(a[5]);
15982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(a[6]);
15992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(a[7]);
16002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
16012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
16022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, strncat_overflow) {  // NOLINT
16032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  char a[10];
16042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  char b[] = "def";
16052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  strcpy(a, "abc");
16062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_poison(b + 1, 1);
16072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  strncat(a, b, 2);
16082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(a[3]);
16092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(a[4]);
16102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(a[5]);
16112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(a[6]);
16122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(a[7]);
16132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
16142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
161586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#define TEST_STRTO_INT(func_name, char_type, str_prefix) \
161686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  TEST(MemorySanitizer, func_name) {                     \
161786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    char_type *e;                                        \
161886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    EXPECT_EQ(1U, func_name(str_prefix##"1", &e, 10));   \
161986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    EXPECT_NOT_POISONED((S8)e);                          \
16202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  }
16210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
162286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#define TEST_STRTO_FLOAT(func_name, char_type, str_prefix) \
162386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  TEST(MemorySanitizer, func_name) {                       \
162486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    char_type *e;                                          \
162586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    EXPECT_NE(0, func_name(str_prefix##"1.5", &e));        \
162686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    EXPECT_NOT_POISONED((S8)e);                            \
16272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  }
16280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
162986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#define TEST_STRTO_FLOAT_LOC(func_name, char_type, str_prefix)   \
16302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  TEST(MemorySanitizer, func_name) {                             \
16312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    locale_t loc = newlocale(LC_NUMERIC_MASK, "C", (locale_t)0); \
163286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    char_type *e;                                                \
163386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    EXPECT_NE(0, func_name(str_prefix##"1.5", &e, loc));         \
16342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    EXPECT_NOT_POISONED((S8)e);                                  \
16352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    freelocale(loc);                                             \
16362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  }
16370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
163886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#define TEST_STRTO_INT_LOC(func_name, char_type, str_prefix)     \
16392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  TEST(MemorySanitizer, func_name) {                             \
16402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    locale_t loc = newlocale(LC_NUMERIC_MASK, "C", (locale_t)0); \
164186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    char_type *e;                                                \
164286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    ASSERT_EQ(1U, func_name(str_prefix##"1", &e, 10, loc));      \
16432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    EXPECT_NOT_POISONED((S8)e);                                  \
16442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    freelocale(loc);                                             \
16452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  }
16460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
164786277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_INT(strtol, char, )
164886277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_INT(strtoll, char, )
164986277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_INT(strtoul, char, )
165086277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_INT(strtoull, char, )
165186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
165286277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_FLOAT(strtof, char, )
165386277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_FLOAT(strtod, char, )
165486277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_FLOAT(strtold, char, )
165586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
165686277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_FLOAT_LOC(strtof_l, char, )
165786277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_FLOAT_LOC(strtod_l, char, )
165886277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_FLOAT_LOC(strtold_l, char, )
1659ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov
166086277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_INT_LOC(strtol_l, char, )
166186277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_INT_LOC(strtoll_l, char, )
166286277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_INT_LOC(strtoul_l, char, )
166386277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_INT_LOC(strtoull_l, char, )
16642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
166586277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_INT(wcstol, wchar_t, L)
166686277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_INT(wcstoll, wchar_t, L)
166786277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_INT(wcstoul, wchar_t, L)
166886277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_INT(wcstoull, wchar_t, L)
166986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
167086277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_FLOAT(wcstof, wchar_t, L)
167186277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_FLOAT(wcstod, wchar_t, L)
167286277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_FLOAT(wcstold, wchar_t, L)
167386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
167486277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_FLOAT_LOC(wcstof_l, wchar_t, L)
167586277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_FLOAT_LOC(wcstod_l, wchar_t, L)
167686277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_FLOAT_LOC(wcstold_l, wchar_t, L)
167786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
167886277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_INT_LOC(wcstol_l, wchar_t, L)
167986277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_INT_LOC(wcstoll_l, wchar_t, L)
168086277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_INT_LOC(wcstoul_l, wchar_t, L)
168186277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_INT_LOC(wcstoull_l, wchar_t, L)
16822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
16832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
16846a211c5814e25d6745a5058cc0e499e5235d3821Stephen HinesTEST(MemorySanitizer, strtoimax) {
1685ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  char *e;
16862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(1, strtoimax("1", &e, 10));
1687ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  EXPECT_NOT_POISONED((S8) e);
1688ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov}
1689ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov
16906a211c5814e25d6745a5058cc0e499e5235d3821Stephen HinesTEST(MemorySanitizer, strtoumax) {
1691e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  char *e;
16922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(1U, strtoumax("1", &e, 10));
169311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED((S8) e);
1694e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov}
1695e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov
16963f4beff5efdd0d30844ca8b270876f7d59a608e7Evgeniy Stepanov#ifdef __GLIBC__
16972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesextern "C" float __strtof_l(const char *nptr, char **endptr, locale_t loc);
169886277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_FLOAT_LOC(__strtof_l, char, )
16993f4beff5efdd0d30844ca8b270876f7d59a608e7Evgeniy Stepanovextern "C" double __strtod_l(const char *nptr, char **endptr, locale_t loc);
170086277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_FLOAT_LOC(__strtod_l, char, )
17012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesextern "C" long double __strtold_l(const char *nptr, char **endptr,
17022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines                                   locale_t loc);
170386277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_FLOAT_LOC(__strtold_l, char, )
170486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
170586277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesextern "C" float __wcstof_l(const wchar_t *nptr, wchar_t **endptr, locale_t loc);
170686277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_FLOAT_LOC(__wcstof_l, wchar_t, L)
170786277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesextern "C" double __wcstod_l(const wchar_t *nptr, wchar_t **endptr, locale_t loc);
170886277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_FLOAT_LOC(__wcstod_l, wchar_t, L)
170986277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesextern "C" long double __wcstold_l(const wchar_t *nptr, wchar_t **endptr,
171086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines                                   locale_t loc);
171186277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_FLOAT_LOC(__wcstold_l, wchar_t, L)
17123f4beff5efdd0d30844ca8b270876f7d59a608e7Evgeniy Stepanov#endif  // __GLIBC__
17133f4beff5efdd0d30844ca8b270876f7d59a608e7Evgeniy Stepanov
1714c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy StepanovTEST(MemorySanitizer, modf) {
1715c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov  double x, y;
1716c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov  x = modf(2.1, &y);
1717c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov  EXPECT_NOT_POISONED(y);
1718c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov}
1719c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov
1720c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy StepanovTEST(MemorySanitizer, modff) {
1721c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov  float x, y;
1722c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov  x = modff(2.1, &y);
1723c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov  EXPECT_NOT_POISONED(y);
1724c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov}
1725c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov
1726c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy StepanovTEST(MemorySanitizer, modfl) {
1727c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov  long double x, y;
1728c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov  x = modfl(2.1, &y);
1729c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov  EXPECT_NOT_POISONED(y);
1730c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov}
1731c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov
173286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no sincos() on FreeBSD.
173386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__)
1734f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy StepanovTEST(MemorySanitizer, sincos) {
1735f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  double s, c;
1736f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  sincos(0.2, &s, &c);
1737f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  EXPECT_NOT_POISONED(s);
1738f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  EXPECT_NOT_POISONED(c);
1739f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov}
174086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif
1741f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov
174286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no sincosf() on FreeBSD.
174386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__)
1744f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy StepanovTEST(MemorySanitizer, sincosf) {
1745f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  float s, c;
1746f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  sincosf(0.2, &s, &c);
1747f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  EXPECT_NOT_POISONED(s);
1748f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  EXPECT_NOT_POISONED(c);
1749f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov}
175086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif
1751f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov
175286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no sincosl() on FreeBSD.
175386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__)
1754f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy StepanovTEST(MemorySanitizer, sincosl) {
1755f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  long double s, c;
1756f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  sincosl(0.2, &s, &c);
1757f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  EXPECT_NOT_POISONED(s);
1758f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  EXPECT_NOT_POISONED(c);
1759f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov}
176086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif
1761f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov
1762f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy StepanovTEST(MemorySanitizer, remquo) {
1763f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  int quo;
1764f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  double res = remquo(29.0, 3.0, &quo);
1765f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  ASSERT_NE(0.0, res);
1766f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  EXPECT_NOT_POISONED(quo);
1767f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov}
1768f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov
1769f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy StepanovTEST(MemorySanitizer, remquof) {
1770f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  int quo;
1771f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  float res = remquof(29.0, 3.0, &quo);
1772f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  ASSERT_NE(0.0, res);
1773f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  EXPECT_NOT_POISONED(quo);
1774f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov}
1775f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov
1776f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy StepanovTEST(MemorySanitizer, remquol) {
1777f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  int quo;
1778f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  long double res = remquof(29.0, 3.0, &quo);
1779f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  ASSERT_NE(0.0, res);
1780f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  EXPECT_NOT_POISONED(quo);
1781f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov}
1782f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov
1783f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy StepanovTEST(MemorySanitizer, lgamma) {
1784f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  double res = lgamma(1.1);
1785f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  ASSERT_NE(0.0, res);
1786f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  EXPECT_NOT_POISONED(signgam);
1787f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov}
1788f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov
1789f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy StepanovTEST(MemorySanitizer, lgammaf) {
1790f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  float res = lgammaf(1.1);
1791f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  ASSERT_NE(0.0, res);
1792f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  EXPECT_NOT_POISONED(signgam);
1793f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov}
1794f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov
1795f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy StepanovTEST(MemorySanitizer, lgammal) {
1796f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  long double res = lgammal(1.1);
1797f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  ASSERT_NE(0.0, res);
1798f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  EXPECT_NOT_POISONED(signgam);
1799f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov}
1800f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov
1801f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy StepanovTEST(MemorySanitizer, lgamma_r) {
1802f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  int sgn;
1803f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  double res = lgamma_r(1.1, &sgn);
1804f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  ASSERT_NE(0.0, res);
1805f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  EXPECT_NOT_POISONED(sgn);
1806f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov}
1807f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov
1808f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy StepanovTEST(MemorySanitizer, lgammaf_r) {
1809f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  int sgn;
1810f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  float res = lgammaf_r(1.1, &sgn);
1811f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  ASSERT_NE(0.0, res);
1812f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  EXPECT_NOT_POISONED(sgn);
1813f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov}
1814f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov
181586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no lgammal_r() on FreeBSD.
181686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__)
1817f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy StepanovTEST(MemorySanitizer, lgammal_r) {
1818f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  int sgn;
1819f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  long double res = lgammal_r(1.1, &sgn);
1820f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  ASSERT_NE(0.0, res);
1821f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  EXPECT_NOT_POISONED(sgn);
1822f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov}
182386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif
1824f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov
182586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no drand48_r() on FreeBSD.
182686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__)
182778d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy StepanovTEST(MemorySanitizer, drand48_r) {
182878d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov  struct drand48_data buf;
182978d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov  srand48_r(0, &buf);
183078d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov  double d;
183178d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov  drand48_r(&buf, &d);
183278d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov  EXPECT_NOT_POISONED(d);
183378d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov}
183486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif
183578d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov
183686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no lrand48_r() on FreeBSD.
183786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__)
183878d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy StepanovTEST(MemorySanitizer, lrand48_r) {
183978d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov  struct drand48_data buf;
184078d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov  srand48_r(0, &buf);
184178d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov  long d;
184278d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov  lrand48_r(&buf, &d);
184378d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov  EXPECT_NOT_POISONED(d);
184478d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov}
184586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif
184678d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov
18470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, sprintf) {  // NOLINT
18480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char buff[10];
184912c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(buff);
185011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(buff[0]);
18510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = sprintf(buff, "%d", 1234567);  // NOLINT
18522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(res, 7);
18532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(buff[0], '1');
18542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(buff[1], '2');
18552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(buff[2], '3');
18562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(buff[6], '7');
18572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(buff[7], 0);
185811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(buff[8]);
18590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
18600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
18610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, snprintf) {
18620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char buff[10];
186312c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(buff);
186411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(buff[0]);
18650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = snprintf(buff, sizeof(buff), "%d", 1234567);
18662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(res, 7);
18672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(buff[0], '1');
18682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(buff[1], '2');
18692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(buff[2], '3');
18702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(buff[6], '7');
18712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(buff[7], 0);
187211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(buff[8]);
18730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
18740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
18750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, swprintf) {
18760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  wchar_t buff[10];
18772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(4U, sizeof(wchar_t));
187812c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(buff);
187911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(buff[0]);
18800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = swprintf(buff, 9, L"%d", 1234567);
18812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(res, 7);
18822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(buff[0], '1');
18832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(buff[1], '2');
18842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(buff[2], '3');
18852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(buff[6], '7');
18863d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar  ASSERT_EQ(buff[7], L'\0');
188711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(buff[8]);
18880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
18890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
18900797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy StepanovTEST(MemorySanitizer, asprintf) {  // NOLINT
18910797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov  char *pbuf;
18920797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov  EXPECT_POISONED(pbuf);
18930797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov  int res = asprintf(&pbuf, "%d", 1234567);  // NOLINT
18942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(res, 7);
18950797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov  EXPECT_NOT_POISONED(pbuf);
18962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(pbuf[0], '1');
18972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(pbuf[1], '2');
18982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(pbuf[2], '3');
18992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(pbuf[6], '7');
19002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(pbuf[7], 0);
19010797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov  free(pbuf);
19020797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov}
19030797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov
1904e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey SamsonovTEST(MemorySanitizer, mbstowcs) {
1905e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov  const char *x = "abc";
1906e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov  wchar_t buff[10];
1907e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov  int res = mbstowcs(buff, x, 2);
1908e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov  EXPECT_EQ(2, res);
1909e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov  EXPECT_EQ(L'a', buff[0]);
1910e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov  EXPECT_EQ(L'b', buff[1]);
1911e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov  EXPECT_POISONED(buff[2]);
1912e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov  res = mbstowcs(buff, x, 10);
1913e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov  EXPECT_EQ(3, res);
1914e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov  EXPECT_NOT_POISONED(buff[3]);
1915e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov}
1916e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov
19170231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, wcstombs) {
19180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  const wchar_t *x = L"abc";
19190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char buff[10];
19200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = wcstombs(buff, x, 4);
19210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(res, 3);
19220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(buff[0], 'a');
19230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(buff[1], 'b');
19240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(buff[2], 'c');
19250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
19260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
1927ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy StepanovTEST(MemorySanitizer, wcsrtombs) {
1928ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  const wchar_t *x = L"abc";
1929ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  const wchar_t *p = x;
1930ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  char buff[10];
1931ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  mbstate_t mbs;
193257a1095fca7b95db8a0ec87fce7a6f0e331a5b99Evgeniy Stepanov  memset(&mbs, 0, sizeof(mbs));
1933ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  int res = wcsrtombs(buff, &p, 4, &mbs);
1934ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  EXPECT_EQ(res, 3);
1935ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  EXPECT_EQ(buff[0], 'a');
1936ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  EXPECT_EQ(buff[1], 'b');
1937ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  EXPECT_EQ(buff[2], 'c');
19389b21ba6f661a6b14e3e81bb4f06ffb769be028c4Evgeniy Stepanov  EXPECT_EQ(buff[3], '\0');
19399b21ba6f661a6b14e3e81bb4f06ffb769be028c4Evgeniy Stepanov  EXPECT_POISONED(buff[4]);
1940ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov}
1941ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov
1942ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy StepanovTEST(MemorySanitizer, wcsnrtombs) {
1943ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  const wchar_t *x = L"abc";
1944ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  const wchar_t *p = x;
1945ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  char buff[10];
1946ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  mbstate_t mbs;
194757a1095fca7b95db8a0ec87fce7a6f0e331a5b99Evgeniy Stepanov  memset(&mbs, 0, sizeof(mbs));
1948ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  int res = wcsnrtombs(buff, &p, 2, 4, &mbs);
1949ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  EXPECT_EQ(res, 2);
1950ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  EXPECT_EQ(buff[0], 'a');
1951ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  EXPECT_EQ(buff[1], 'b');
19529b21ba6f661a6b14e3e81bb4f06ffb769be028c4Evgeniy Stepanov  EXPECT_POISONED(buff[2]);
1953ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov}
1954ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov
19553d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga NainarTEST(MemorySanitizer, wcrtomb) {
19563d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar  wchar_t x = L'a';
19573d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar  char buff[10];
19583d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar  mbstate_t mbs;
19593d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar  memset(&mbs, 0, sizeof(mbs));
19603d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar  size_t res = wcrtomb(buff, x, &mbs);
19613d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar  EXPECT_EQ(res, (size_t)1);
19623d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar  EXPECT_EQ(buff[0], 'a');
19633d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar}
19643d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar
196586277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST(MemorySanitizer, wmemset) {
196686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    wchar_t x[25];
196786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    break_optimization(x);
196886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    EXPECT_POISONED(x[0]);
196986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    wmemset(x, L'A', 10);
197086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    EXPECT_EQ(x[0], L'A');
197186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    EXPECT_EQ(x[9], L'A');
197286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    EXPECT_POISONED(x[10]);
197386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines}
197486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
1975801448950d645813efb398575bbc62b48e5b1dfcEvgeniy StepanovTEST(MemorySanitizer, mbtowc) {
1976801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  const char *x = "abc";
1977801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  wchar_t wx;
1978801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  int res = mbtowc(&wx, x, 3);
1979801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  EXPECT_GT(res, 0);
1980801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  EXPECT_NOT_POISONED(wx);
1981801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov}
1982801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov
1983801448950d645813efb398575bbc62b48e5b1dfcEvgeniy StepanovTEST(MemorySanitizer, mbrtowc) {
1984801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  const char *x = "abc";
1985801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  wchar_t wx;
1986801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  mbstate_t mbs;
1987801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  memset(&mbs, 0, sizeof(mbs));
1988801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  int res = mbrtowc(&wx, x, 3, &mbs);
1989801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  EXPECT_GT(res, 0);
1990801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  EXPECT_NOT_POISONED(wx);
1991801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov}
1992801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov
19932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, wcsftime) {
19942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  wchar_t x[100];
19952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  time_t t = time(NULL);
19962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  struct tm tms;
19972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  struct tm *tmres = localtime_r(&t, &tms);
19982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_NE((void *)0, tmres);
19992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  size_t res = wcsftime(x, sizeof(x) / sizeof(x[0]), L"%Y-%m-%d", tmres);
20002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_GT(res, 0UL);
20012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_EQ(res, wcslen(x));
20022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
20032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
20040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, gettimeofday) {
20050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  struct timeval tv;
20060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  struct timezone tz;
200712c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&tv);
200812c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&tz);
20092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(16U, sizeof(tv));
20102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(8U, sizeof(tz));
201111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(tv.tv_sec);
201211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(tv.tv_usec);
201311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(tz.tz_minuteswest);
201411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(tz.tz_dsttime);
20152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, gettimeofday(&tv, &tz));
201611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(tv.tv_sec);
201711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(tv.tv_usec);
201811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(tz.tz_minuteswest);
201911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(tz.tz_dsttime);
20200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
20210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2022e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovTEST(MemorySanitizer, clock_gettime) {
2023e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  struct timespec tp;
2024e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_POISONED(tp.tv_sec);
2025e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_POISONED(tp.tv_nsec);
20262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, clock_gettime(CLOCK_REALTIME, &tp));
2027e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(tp.tv_sec);
2028e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(tp.tv_nsec);
2029e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov}
2030e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov
20317cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy StepanovTEST(MemorySanitizer, clock_getres) {
20327cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov  struct timespec tp;
20337cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov  EXPECT_POISONED(tp.tv_sec);
20347cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov  EXPECT_POISONED(tp.tv_nsec);
20352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, clock_getres(CLOCK_REALTIME, 0));
20367cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov  EXPECT_POISONED(tp.tv_sec);
20377cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov  EXPECT_POISONED(tp.tv_nsec);
20382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, clock_getres(CLOCK_REALTIME, &tp));
20397cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov  EXPECT_NOT_POISONED(tp.tv_sec);
20407cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov  EXPECT_NOT_POISONED(tp.tv_nsec);
20417cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov}
20427cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov
2043e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovTEST(MemorySanitizer, getitimer) {
2044e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  struct itimerval it1, it2;
2045e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  int res;
2046e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_POISONED(it1.it_interval.tv_sec);
2047e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_POISONED(it1.it_interval.tv_usec);
2048e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_POISONED(it1.it_value.tv_sec);
2049e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_POISONED(it1.it_value.tv_usec);
2050e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  res = getitimer(ITIMER_VIRTUAL, &it1);
20512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
2052e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(it1.it_interval.tv_sec);
2053e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(it1.it_interval.tv_usec);
2054e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(it1.it_value.tv_sec);
2055e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(it1.it_value.tv_usec);
2056e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov
2057e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  it1.it_interval.tv_sec = it1.it_value.tv_sec = 10000;
2058e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  it1.it_interval.tv_usec = it1.it_value.tv_usec = 0;
2059e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov
2060e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  res = setitimer(ITIMER_VIRTUAL, &it1, &it2);
20612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
2062e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(it2.it_interval.tv_sec);
2063e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(it2.it_interval.tv_usec);
2064e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(it2.it_value.tv_sec);
2065e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(it2.it_value.tv_usec);
2066e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov
2067e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  // Check that old_value can be 0, and disable the timer.
2068e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  memset(&it1, 0, sizeof(it1));
2069e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  res = setitimer(ITIMER_VIRTUAL, &it1, 0);
20702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
2071e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov}
2072e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov
207339d68edd461abb5058a4b96fd16f1741ad89bba7Evgeniy StepanovTEST(MemorySanitizer, setitimer_null) {
207439d68edd461abb5058a4b96fd16f1741ad89bba7Evgeniy Stepanov  setitimer(ITIMER_VIRTUAL, 0, 0);
207539d68edd461abb5058a4b96fd16f1741ad89bba7Evgeniy Stepanov  // Not testing the return value, since it the behaviour seems to differ
207639d68edd461abb5058a4b96fd16f1741ad89bba7Evgeniy Stepanov  // between libc implementations and POSIX.
207739d68edd461abb5058a4b96fd16f1741ad89bba7Evgeniy Stepanov  // Should never crash, though.
207839d68edd461abb5058a4b96fd16f1741ad89bba7Evgeniy Stepanov}
207939d68edd461abb5058a4b96fd16f1741ad89bba7Evgeniy Stepanov
2080fef660506e9e5703fedfee01d614abd4b741c738Evgeniy StepanovTEST(MemorySanitizer, time) {
2081fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov  time_t t;
2082fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov  EXPECT_POISONED(t);
2083fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov  time_t t2 = time(&t);
20842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_NE(t2, (time_t)-1);
2085fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov  EXPECT_NOT_POISONED(t);
2086fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov}
2087fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov
2088e4f9f8a1296768a7a6b6646a3b241a379f4a5e15Evgeniy StepanovTEST(MemorySanitizer, strptime) {
2089e4f9f8a1296768a7a6b6646a3b241a379f4a5e15Evgeniy Stepanov  struct tm time;
2090e4f9f8a1296768a7a6b6646a3b241a379f4a5e15Evgeniy Stepanov  char *p = strptime("11/1/2013-05:39", "%m/%d/%Y-%H:%M", &time);
20912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(p != NULL);
2092e4f9f8a1296768a7a6b6646a3b241a379f4a5e15Evgeniy Stepanov  EXPECT_NOT_POISONED(time.tm_sec);
2093e4f9f8a1296768a7a6b6646a3b241a379f4a5e15Evgeniy Stepanov  EXPECT_NOT_POISONED(time.tm_hour);
2094e4f9f8a1296768a7a6b6646a3b241a379f4a5e15Evgeniy Stepanov  EXPECT_NOT_POISONED(time.tm_year);
2095e4f9f8a1296768a7a6b6646a3b241a379f4a5e15Evgeniy Stepanov}
2096e4f9f8a1296768a7a6b6646a3b241a379f4a5e15Evgeniy Stepanov
20979358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy StepanovTEST(MemorySanitizer, localtime) {
20989358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  time_t t = 123;
20999358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  struct tm *time = localtime(&t);
21002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(time != NULL);
21019358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  EXPECT_NOT_POISONED(time->tm_sec);
21029358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  EXPECT_NOT_POISONED(time->tm_hour);
21039358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  EXPECT_NOT_POISONED(time->tm_year);
21049358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  EXPECT_NOT_POISONED(time->tm_isdst);
21052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NE(0U, strlen(time->tm_zone));
21069358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov}
21079358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov
21089358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy StepanovTEST(MemorySanitizer, localtime_r) {
21099358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  time_t t = 123;
21109358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  struct tm time;
21119358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  struct tm *res = localtime_r(&t, &time);
21122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(res != NULL);
21139358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  EXPECT_NOT_POISONED(time.tm_sec);
21149358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  EXPECT_NOT_POISONED(time.tm_hour);
21159358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  EXPECT_NOT_POISONED(time.tm_year);
21169358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  EXPECT_NOT_POISONED(time.tm_isdst);
21172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NE(0U, strlen(time.tm_zone));
21189358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov}
21199358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov
212086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no getmntent() on FreeBSD.
212186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__)
21224d7297daef90ad59446250617b72d184141436fcEvgeniy StepanovTEST(MemorySanitizer, getmntent) {
21234d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  FILE *fp = setmntent("/etc/fstab", "r");
21244d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  struct mntent *mnt = getmntent(fp);
21252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(mnt != NULL);
21262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_NE(0U, strlen(mnt->mnt_fsname));
21272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_NE(0U, strlen(mnt->mnt_dir));
21282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_NE(0U, strlen(mnt->mnt_type));
21292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_NE(0U, strlen(mnt->mnt_opts));
21304d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  EXPECT_NOT_POISONED(mnt->mnt_freq);
21314d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  EXPECT_NOT_POISONED(mnt->mnt_passno);
21324d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  fclose(fp);
21334d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov}
213486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif
21354d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov
213686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no getmntent_r() on FreeBSD.
213786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__)
21384d7297daef90ad59446250617b72d184141436fcEvgeniy StepanovTEST(MemorySanitizer, getmntent_r) {
21394d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  FILE *fp = setmntent("/etc/fstab", "r");
21404d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  struct mntent mntbuf;
21414d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  char buf[1000];
21424d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  struct mntent *mnt = getmntent_r(fp, &mntbuf, buf, sizeof(buf));
21432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(mnt != NULL);
21442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_NE(0U, strlen(mnt->mnt_fsname));
21452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_NE(0U, strlen(mnt->mnt_dir));
21462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_NE(0U, strlen(mnt->mnt_type));
21472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_NE(0U, strlen(mnt->mnt_opts));
21484d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  EXPECT_NOT_POISONED(mnt->mnt_freq);
21494d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  EXPECT_NOT_POISONED(mnt->mnt_passno);
21504d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  fclose(fp);
21514d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov}
215286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif
21534d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov
2154369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy StepanovTEST(MemorySanitizer, ether) {
2155369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov  const char *asc = "11:22:33:44:55:66";
2156369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov  struct ether_addr *paddr = ether_aton(asc);
2157369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov  EXPECT_NOT_POISONED(*paddr);
2158369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov
2159369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov  struct ether_addr addr;
2160369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov  paddr = ether_aton_r(asc, &addr);
2161369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov  ASSERT_EQ(paddr, &addr);
2162369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov  EXPECT_NOT_POISONED(addr);
2163369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov
2164369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov  char *s = ether_ntoa(&addr);
21652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_NE(0U, strlen(s));
2166369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov
2167369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov  char buf[100];
2168369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov  s = ether_ntoa_r(&addr, buf);
2169369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov  ASSERT_EQ(s, buf);
21702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_NE(0U, strlen(buf));
2171369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov}
2172369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov
21730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, mmap) {
21740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  const int size = 4096;
21750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  void *p1, *p2;
21760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  p1 = mmap(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0);
21770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(p1, size);
21780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  munmap(p1, size);
21790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  for (int i = 0; i < 1000; i++) {
21800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    p2 = mmap(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0);
21810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    if (p2 == p1)
21820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      break;
21830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    else
21840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      munmap(p2, size);
21850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  }
21860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (p1 == p2) {
218711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov    EXPECT_NOT_POISONED(*(char*)p2);
21880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    munmap(p2, size);
21890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  }
21900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
21910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
219286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no fcvt() on FreeBSD.
219386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__)
21940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// FIXME: enable and add ecvt.
21950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// FIXME: check why msandr does nt handle fcvt.
21960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, fcvt) {
21970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int a, b;
219812c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&a);
219912c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&b);
220011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(a);
220111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(b);
22020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char *str = fcvt(12345.6789, 10, &a, &b);
220311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(a);
220411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(b);
22056d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  ASSERT_NE(nullptr, str);
22066d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  EXPECT_NOT_POISONED(str[0]);
22076d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  ASSERT_NE(0U, strlen(str));
22080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
220986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif
22100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
221186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no fcvt_long() on FreeBSD.
221286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__)
22136d1862363c88c183b0ed7740fca876342cf0474bStephen HinesTEST(MemorySanitizer, fcvt_long) {
22146d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  int a, b;
22156d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  break_optimization(&a);
22166d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  break_optimization(&b);
22176d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  EXPECT_POISONED(a);
22186d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  EXPECT_POISONED(b);
22196d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  char *str = fcvt(111111112345.6789, 10, &a, &b);
22206d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  EXPECT_NOT_POISONED(a);
22216d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  EXPECT_NOT_POISONED(b);
22226d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  ASSERT_NE(nullptr, str);
22236d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  EXPECT_NOT_POISONED(str[0]);
22246d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  ASSERT_NE(0U, strlen(str));
22256d1862363c88c183b0ed7740fca876342cf0474bStephen Hines}
222686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif
22276d1862363c88c183b0ed7740fca876342cf0474bStephen Hines
22282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, memchr) {
22292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  char x[10];
22302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  break_optimization(x);
22312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(x[0]);
22322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  x[2] = '2';
22332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  void *res;
22342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_UMR(res = memchr(x, '2', 10));
22352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(res);
22362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  x[0] = '0';
22372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  x[1] = '1';
22382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  res = memchr(x, '2', 10);
22392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_EQ(&x[2], res);
22402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_UMR(res = memchr(x, '3', 10));
22412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(res);
22422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
22432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
22442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, memrchr) {
22452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  char x[10];
22462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  break_optimization(x);
22472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(x[0]);
22482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  x[9] = '9';
22492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  void *res;
22502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_UMR(res = memrchr(x, '9', 10));
22512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(res);
22522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  x[0] = '0';
22532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  x[1] = '1';
22542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  res = memrchr(x, '0', 2);
22552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_EQ(&x[0], res);
22562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_UMR(res = memrchr(x, '7', 10));
22572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(res);
22582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
22592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
22607cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy StepanovTEST(MemorySanitizer, frexp) {
22617cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  int x;
22627cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  x = *GetPoisoned<int>();
22637cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  double r = frexp(1.1, &x);
22647cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  EXPECT_NOT_POISONED(r);
22657cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  EXPECT_NOT_POISONED(x);
22667cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov
22677cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  x = *GetPoisoned<int>();
22687cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  float rf = frexpf(1.1, &x);
22697cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  EXPECT_NOT_POISONED(rf);
22707cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  EXPECT_NOT_POISONED(x);
22717cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov
22727cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  x = *GetPoisoned<int>();
22737cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  double rl = frexpl(1.1, &x);
22747cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  EXPECT_NOT_POISONED(rl);
22757cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  EXPECT_NOT_POISONED(x);
22767cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov}
22777cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov
227806658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanovnamespace {
227906658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov
228006658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanovstatic int cnt;
228106658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov
228206658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanovvoid SigactionHandler(int signo, siginfo_t* si, void* uc) {
22832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(signo, SIGPROF);
22842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(si != NULL);
228506658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  EXPECT_NOT_POISONED(si->si_errno);
228606658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  EXPECT_NOT_POISONED(si->si_pid);
228706658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov#if __linux__
228806658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov# if defined(__x86_64__)
228906658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  EXPECT_NOT_POISONED(((ucontext_t*)uc)->uc_mcontext.gregs[REG_RIP]);
229006658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov# elif defined(__i386__)
229106658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  EXPECT_NOT_POISONED(((ucontext_t*)uc)->uc_mcontext.gregs[REG_EIP]);
229206658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov# endif
229306658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov#endif
229406658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  ++cnt;
229506658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov}
229606658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov
229706658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy StepanovTEST(MemorySanitizer, sigaction) {
229806658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  struct sigaction act = {};
2299cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov  struct sigaction oldact = {};
23006d0b7f6c41bed64419dd74a8daf83de5e9f54de9Evgeniy Stepanov  struct sigaction origact = {};
23016d0b7f6c41bed64419dd74a8daf83de5e9f54de9Evgeniy Stepanov
23026d0b7f6c41bed64419dd74a8daf83de5e9f54de9Evgeniy Stepanov  sigaction(SIGPROF, 0, &origact);
23036d0b7f6c41bed64419dd74a8daf83de5e9f54de9Evgeniy Stepanov
230406658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  act.sa_flags |= SA_SIGINFO;
230506658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  act.sa_sigaction = &SigactionHandler;
230606658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  sigaction(SIGPROF, &act, 0);
230706658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov
230806658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  kill(getpid(), SIGPROF);
230906658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov
231006658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  act.sa_flags &= ~SA_SIGINFO;
231106658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  act.sa_handler = SIG_DFL;
231206658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  sigaction(SIGPROF, &act, 0);
231306658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov
231406658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  act.sa_flags &= ~SA_SIGINFO;
231506658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  act.sa_handler = SIG_IGN;
2316cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov  sigaction(SIGPROF, &act, &oldact);
2317cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov  EXPECT_FALSE(oldact.sa_flags & SA_SIGINFO);
2318cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov  EXPECT_EQ(SIG_DFL, oldact.sa_handler);
231906658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  kill(getpid(), SIGPROF);
232006658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov
232106658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  act.sa_flags |= SA_SIGINFO;
232206658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  act.sa_sigaction = &SigactionHandler;
2323cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov  sigaction(SIGPROF, &act, &oldact);
2324cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov  EXPECT_FALSE(oldact.sa_flags & SA_SIGINFO);
2325cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov  EXPECT_EQ(SIG_IGN, oldact.sa_handler);
232606658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  kill(getpid(), SIGPROF);
232706658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov
232806658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  act.sa_flags &= ~SA_SIGINFO;
232906658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  act.sa_handler = SIG_DFL;
2330cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov  sigaction(SIGPROF, &act, &oldact);
2331cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov  EXPECT_TRUE(oldact.sa_flags & SA_SIGINFO);
2332cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov  EXPECT_EQ(&SigactionHandler, oldact.sa_sigaction);
233306658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  EXPECT_EQ(2, cnt);
23346d0b7f6c41bed64419dd74a8daf83de5e9f54de9Evgeniy Stepanov
23356d0b7f6c41bed64419dd74a8daf83de5e9f54de9Evgeniy Stepanov  sigaction(SIGPROF, &origact, 0);
233606658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov}
233706658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov
233806658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov} // namespace
233906658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov
23409a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov
23419a949a8909f652b28e9084de785c848743139fd5Evgeniy StepanovTEST(MemorySanitizer, sigemptyset) {
23429a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  sigset_t s;
23439a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  EXPECT_POISONED(s);
23449a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  int res = sigemptyset(&s);
23459a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  ASSERT_EQ(0, res);
23469a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  EXPECT_NOT_POISONED(s);
23479a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov}
23489a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov
23499a949a8909f652b28e9084de785c848743139fd5Evgeniy StepanovTEST(MemorySanitizer, sigfillset) {
23509a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  sigset_t s;
23519a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  EXPECT_POISONED(s);
23529a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  int res = sigfillset(&s);
23539a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  ASSERT_EQ(0, res);
23549a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  EXPECT_NOT_POISONED(s);
23559a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov}
23569a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov
23579a949a8909f652b28e9084de785c848743139fd5Evgeniy StepanovTEST(MemorySanitizer, sigpending) {
23589a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  sigset_t s;
23599a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  EXPECT_POISONED(s);
23609a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  int res = sigpending(&s);
23619a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  ASSERT_EQ(0, res);
23629a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  EXPECT_NOT_POISONED(s);
23639a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov}
23649a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov
23659a949a8909f652b28e9084de785c848743139fd5Evgeniy StepanovTEST(MemorySanitizer, sigprocmask) {
23669a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  sigset_t s;
23679a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  EXPECT_POISONED(s);
23689a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  int res = sigprocmask(SIG_BLOCK, 0, &s);
23699a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  ASSERT_EQ(0, res);
23709a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  EXPECT_NOT_POISONED(s);
23719a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov}
23729a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov
23730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct StructWithDtor {
23740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ~StructWithDtor();
23750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
23760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
23770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE StructWithDtor::~StructWithDtor() {
237812c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(0);
23790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
23800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
23810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Invoke) {
23820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StructWithDtor s;  // Will cause the calls to become invokes.
238311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(0);
238411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<int>());
238511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(0);
238611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<int>());
238711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(ReturnPoisoned<S4>());
23880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
23890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
23900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, ptrtoint) {
23910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // Test that shadow is propagated through pointer-to-integer conversion.
23920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  void* p = (void*)0xABCD;
23930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(((char*)&p) + 1, sizeof(p));
2394250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  EXPECT_NOT_POISONED((((uintptr_t)p) & 0xFF) == 0);
23950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
23960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  void* q = (void*)0xABCD;
23970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&q, sizeof(q) - 1);
2398250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  EXPECT_POISONED((((uintptr_t)q) & 0xFF) == 0);
23990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
24000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
24010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn2(int guard, ...) {
24020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl;
24030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_start(vl, guard);
240411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
240511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
240611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
240711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, double));
24080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_end(vl);
24090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
24100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
24110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn(int guard, ...) {
24120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl;
24130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_start(vl, guard);
241411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
241511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
24160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // The following call will overwrite __msan_param_tls.
24170231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // Checks after it test that arg shadow was somehow saved across the call.
24180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  vaargsfn2(1, 2, 3, 4, *GetPoisoned<double>());
241911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
242011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
24210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_end(vl);
24220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
24230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
24240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, VAArgTest) {
24250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* x = GetPoisoned<int>();
24260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* y = GetPoisoned<int>(4);
24270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  vaargsfn(1, 13, *x, 42, *y);
24280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
24290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
24300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_many(int guard, ...) {
24310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl;
24320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_start(vl, guard);
243311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
243411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
243511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
243611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
243711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
243811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
243911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
244011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
244111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
244211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
24430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_end(vl);
24440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
24450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
24460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, VAArgManyTest) {
24470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* x = GetPoisoned<int>();
24480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* y = GetPoisoned<int>(4);
24490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  vaargsfn_many(1, 2, *x, 3, 4, 5, 6, 7, 8, 9, *y);
24500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
24510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
24520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_pass2(va_list vl) {
245311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
245411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
245511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
24560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
24570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
24580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_pass(int guard, ...) {
24590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl;
24600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_start(vl, guard);
246111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
24620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  vaargsfn_pass2(vl);
24630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_end(vl);
24640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
24650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
24660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, VAArgPass) {
24670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* x = GetPoisoned<int>();
24680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* y = GetPoisoned<int>(4);
24690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  vaargsfn_pass(1, *x, 2, 3, *y);
24700231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
24710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
24720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_copy2(va_list vl) {
247311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
247411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
24750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
24760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
24770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_copy(int guard, ...) {
24780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl;
24790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_start(vl, guard);
248011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
248111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
24820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl2;
24830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_copy(vl2, vl);
24840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  vaargsfn_copy2(vl2);
248511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
248611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
24870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_end(vl);
24880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
24890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
24900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, VAArgCopy) {
24910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* x = GetPoisoned<int>();
24920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* y = GetPoisoned<int>(4);
24930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  vaargsfn_copy(1, 2, *x, 3, *y);
24940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
24950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
24960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_ptr(int guard, ...) {
24970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl;
24980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_start(vl, guard);
249911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int*));
250011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int*));
250111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int*));
250211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, double*));
25030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_end(vl);
25040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
25050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
25060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, VAArgPtr) {
25070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int** x = GetPoisoned<int*>();
25080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  double** y = GetPoisoned<double*>(8);
25090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int z;
25100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  vaargsfn_ptr(1, &z, *x, &z, *y);
25110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
25120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
25130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_overflow(int guard, ...) {
25140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl;
25150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_start(vl, guard);
251611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
251711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
251811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
251911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
252011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
252111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
252211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
252311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, double));
252411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, double));
252511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, double));
252611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, double));
252711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, double));
252811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int*));
252911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, double));
253011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, double));
253111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
253211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
253311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, double));
253411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int*));
253511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
253611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
253711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, double));
253811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int*));
253911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
254011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
254111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, double));
254211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int*));
25430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
25440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_end(vl);
25450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
25460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
25470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, VAArgOverflow) {
25480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* x = GetPoisoned<int>();
25490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  double* y = GetPoisoned<double>(8);
25500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int** p = GetPoisoned<int*>(16);
25510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int z;
25520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  vaargsfn_overflow(1,
25530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      1, 2, *x, 4, 5, 6,
25540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      1.1, 2.2, 3.3, *y, 5.5, *p, 7.7, 8.8,
25550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      // the following args will overflow for sure
25560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      *x, *y, *p,
25570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      7, 9.9, &z,
25580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      *x, *y, *p);
25590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
25600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
25610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_tlsoverwrite2(int guard, ...) {
25620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl;
25630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_start(vl, guard);
25643c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov  for (int i = 0; i < 20; ++i)
25653c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov    EXPECT_NOT_POISONED(va_arg(vl, int));
25660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_end(vl);
25670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
25680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
25690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_tlsoverwrite(int guard, ...) {
25700231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // This call will overwrite TLS contents unless it's backed up somewhere.
25713c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov  vaargsfn_tlsoverwrite2(2,
25723c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov      42, 42, 42, 42, 42,
25733c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov      42, 42, 42, 42, 42,
25743c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov      42, 42, 42, 42, 42,
25753c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov      42, 42, 42, 42, 42); // 20x
25760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl;
25770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_start(vl, guard);
25783c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov  for (int i = 0; i < 20; ++i)
25793c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov    EXPECT_POISONED(va_arg(vl, int));
25800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_end(vl);
25810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
25820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
25830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, VAArgTLSOverwrite) {
25840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* x = GetPoisoned<int>();
25853c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov  vaargsfn_tlsoverwrite(1,
25863c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov      *x, *x, *x, *x, *x,
25873c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov      *x, *x, *x, *x, *x,
25883c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov      *x, *x, *x, *x, *x,
25893c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov      *x, *x, *x, *x, *x); // 20x
25903c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov
25910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
25920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
25930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct StructByVal {
25940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int a, b, c, d, e, f;
25950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
25960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
25972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesstatic void vaargsfn_structbyval(int guard, ...) {
25982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  va_list vl;
25992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  va_start(vl, guard);
26002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  {
26012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    StructByVal s = va_arg(vl, StructByVal);
26022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    EXPECT_NOT_POISONED(s.a);
26032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    EXPECT_POISONED(s.b);
26042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    EXPECT_NOT_POISONED(s.c);
26052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    EXPECT_POISONED(s.d);
26062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    EXPECT_NOT_POISONED(s.e);
26072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    EXPECT_POISONED(s.f);
26082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  }
26092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  {
26102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    StructByVal s = va_arg(vl, StructByVal);
26112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    EXPECT_NOT_POISONED(s.a);
26122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    EXPECT_POISONED(s.b);
26132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    EXPECT_NOT_POISONED(s.c);
26142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    EXPECT_POISONED(s.d);
26152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    EXPECT_NOT_POISONED(s.e);
26162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    EXPECT_POISONED(s.f);
26172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  }
26182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  va_end(vl);
26192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
26202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
26212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, VAArgStructByVal) {
26222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  StructByVal s;
26232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  s.a = 1;
26242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  s.b = *GetPoisoned<int>();
26252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  s.c = 2;
26262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  s.d = *GetPoisoned<int>();
26272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  s.e = 3;
26282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  s.f = *GetPoisoned<int>();
26292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  vaargsfn_structbyval(0, s, s);
26302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
26312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
26320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE void StructByValTestFunc(struct StructByVal s) {
263311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s.a);
263411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s.b);
263511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s.c);
263611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s.d);
263711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s.e);
263811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s.f);
26390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
26400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
26410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE void StructByValTestFunc1(struct StructByVal s) {
26420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StructByValTestFunc(s);
26430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
26440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
26450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE void StructByValTestFunc2(int z, struct StructByVal s) {
26460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StructByValTestFunc(s);
26470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
26480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
26490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, StructByVal) {
26500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // Large aggregates are passed as "byval" pointer argument in LLVM.
26510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  struct StructByVal s;
26520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  s.a = 1;
26530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  s.b = *GetPoisoned<int>();
26540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  s.c = 2;
26550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  s.d = *GetPoisoned<int>();
26560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  s.e = 3;
26570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  s.f = *GetPoisoned<int>();
26580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StructByValTestFunc(s);
26590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StructByValTestFunc1(s);
26600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StructByValTestFunc2(0, s);
26610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
26620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
26630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
26640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#if MSAN_HAS_M128
2665b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy StepanovNOINLINE __m128i m128Eq(__m128i *a, __m128i *b) { return _mm_cmpeq_epi16(*a, *b); }
2666b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy StepanovNOINLINE __m128i m128Lt(__m128i *a, __m128i *b) { return _mm_cmplt_epi16(*a, *b); }
26670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, m128) {
26680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __m128i a = _mm_set1_epi16(0x1234);
26690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __m128i b = _mm_set1_epi16(0x7890);
267011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(m128Eq(&a, &b));
267111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(m128Lt(&a, &b));
26720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
26730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// FIXME: add more tests for __m128i.
26740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#endif  // MSAN_HAS_M128
26750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
26760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// We should not complain when copying this poisoned hole.
26770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct StructWithHole {
26780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U4  a;
26790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // 4-byte hole.
26800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U8  b;
26810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
26820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
26830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE StructWithHole ReturnStructWithHole() {
26840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StructWithHole res;
26850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&res, sizeof(res));
26860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.a = 1;
26870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.b = 2;
26880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return res;
26890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
26900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
26910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, StructWithHole) {
26920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StructWithHole a = ReturnStructWithHole();
269312c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&a);
26940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
26950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
26960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate <class T>
26970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE T ReturnStruct() {
26980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T res;
26990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&res, sizeof(res));
27000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.a = 1;
27010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return res;
27020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
27030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
27040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate <class T>
27050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE void TestReturnStruct() {
27060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T s1 = ReturnStruct<T>();
270711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s1.a);
270811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s1.b);
27090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
27100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
27110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS1 {
27120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int a, b, c;
27130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
27140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS2 {
27150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int b, a, c;
27160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
27170231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS3 {
27180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int b, c, a;
27190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
27200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS4 {
27210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int c, b, a;
27220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
27230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
27240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS5 {
27250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int a;
27260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  float b;
27270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
27280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS6 {
27290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int a;
27300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  double b;
27310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
27320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS7 {
27330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S8 b;
27340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int a;
27350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
27360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS8 {
27370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S2 b;
27380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S8 a;
27390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
27400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
27410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, IntStruct3) {
27420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestReturnStruct<SSS1>();
27430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestReturnStruct<SSS2>();
27440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestReturnStruct<SSS3>();
27450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestReturnStruct<SSS4>();
27460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestReturnStruct<SSS5>();
27470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestReturnStruct<SSS6>();
27480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestReturnStruct<SSS7>();
27490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestReturnStruct<SSS8>();
27500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
27510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
27520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct LongStruct {
27530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U1 a1, b1;
27540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U2 a2, b2;
27550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U4 a4, b4;
27560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U8 a8, b8;
27570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
27580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
27590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE LongStruct ReturnLongStruct1() {
27600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  LongStruct res;
27610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&res, sizeof(res));
27620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.a1 = res.a2 = res.a4 = res.a8 = 111;
27630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // leaves b1, .., b8 poisoned.
27640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return res;
27650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
27660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
27670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE LongStruct ReturnLongStruct2() {
27680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  LongStruct res;
27690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&res, sizeof(res));
27700231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.b1 = res.b2 = res.b4 = res.b8 = 111;
27710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // leaves a1, .., a8 poisoned.
27720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return res;
27730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
27740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
27750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, LongStruct) {
27760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  LongStruct s1 = ReturnLongStruct1();
27770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_print_shadow(&s1, sizeof(s1));
277811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s1.a1);
277911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s1.a2);
278011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s1.a4);
278111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s1.a8);
27820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
278311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s1.b1);
278411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s1.b2);
278511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s1.b4);
278611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s1.b8);
27870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
27880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  LongStruct s2 = ReturnLongStruct2();
27890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_print_shadow(&s2, sizeof(s2));
279011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s2.b1);
279111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s2.b2);
279211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s2.b4);
279311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s2.b8);
27940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
279511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s2.a1);
279611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s2.a2);
279711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s2.a4);
279811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s2.a8);
27990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
28000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
28010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, getrlimit) {
28020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  struct rlimit limit;
28030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&limit, sizeof(limit));
28040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int result = getrlimit(RLIMIT_DATA, &limit);
28052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(result, 0);
28062bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov  EXPECT_NOT_POISONED(limit.rlim_cur);
28072bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov  EXPECT_NOT_POISONED(limit.rlim_max);
28080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
28090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2810e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy StepanovTEST(MemorySanitizer, getrusage) {
2811e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  struct rusage usage;
2812e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  __msan_poison(&usage, sizeof(usage));
2813e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  int result = getrusage(RUSAGE_SELF, &usage);
28142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(result, 0);
281511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_utime.tv_sec);
281611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_utime.tv_usec);
281711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_stime.tv_sec);
281811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_stime.tv_usec);
281911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_maxrss);
282011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_minflt);
282111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_majflt);
282211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_inblock);
282311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_oublock);
282411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_nvcsw);
282511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_nivcsw);
2826e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov}
2827e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov
282886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if defined(__FreeBSD__)
282986277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesstatic void GetProgramPath(char *buf, size_t sz) {
283086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 };
283186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  int res = sysctl(mib, 4, buf, &sz, NULL, 0);
283286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  ASSERT_EQ(0, res);
283386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines}
283486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#elif defined(__GLIBC__)
283586277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesstatic void GetProgramPath(char *buf, size_t sz) {
283686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  extern char *program_invocation_name;
283786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  int res = snprintf(buf, sz, "%s", program_invocation_name);
283886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  ASSERT_GE(res, 0);
283986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  ASSERT_LT((size_t)res, sz);
284086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines}
284186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#else
28421aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov# error "TODO: port this"
28431aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov#endif
28441aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov
2845e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanovstatic void dladdr_testfn() {}
2846e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov
2847e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy StepanovTEST(MemorySanitizer, dladdr) {
2848e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  Dl_info info;
2849e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  __msan_poison(&info, sizeof(info));
2850e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  int result = dladdr((const void*)dladdr_testfn, &info);
28512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_NE(result, 0);
285211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED((unsigned long)info.dli_fname);
2853e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  if (info.dli_fname)
285411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov    EXPECT_NOT_POISONED(strlen(info.dli_fname));
285511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED((unsigned long)info.dli_fbase);
285611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED((unsigned long)info.dli_sname);
2857e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  if (info.dli_sname)
285811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov    EXPECT_NOT_POISONED(strlen(info.dli_sname));
285911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED((unsigned long)info.dli_saddr);
2860e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov}
2861e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov
286208104e6f77f4e5279f8cb4a74784ffb7afd5073fEvgeniy Stepanov#ifndef MSAN_TEST_DISABLE_DLOPEN
286308104e6f77f4e5279f8cb4a74784ffb7afd5073fEvgeniy Stepanov
28642bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanovstatic int dl_phdr_callback(struct dl_phdr_info *info, size_t size, void *data) {
28652bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov  (*(int *)data)++;
28662bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov  EXPECT_NOT_POISONED(info->dlpi_addr);
28672bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov  EXPECT_NOT_POISONED(strlen(info->dlpi_name));
28682bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov  EXPECT_NOT_POISONED(info->dlpi_phnum);
28692bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov  for (int i = 0; i < info->dlpi_phnum; ++i)
28702bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov    EXPECT_NOT_POISONED(info->dlpi_phdr[i]);
28712bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov  return 0;
28722bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov}
28732bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov
2874263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov// Compute the path to our loadable DSO.  We assume it's in the same
2875263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov// directory.  Only use string routines that we intercept so far to do this.
287686277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesstatic void GetPathToLoadable(char *buf, size_t sz) {
287786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  char program_path[kMaxPathLength];
287886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  GetProgramPath(program_path, sizeof(program_path));
287986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
288086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  const char *last_slash = strrchr(program_path, '/');
288186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  ASSERT_NE(nullptr, last_slash);
288286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  size_t dir_len = (size_t)(last_slash - program_path);
288386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if defined(__x86_64__)
288486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  static const char basename[] = "libmsan_loadable.x86_64.so";
288586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#elif defined(__MIPSEB__) || defined(MIPSEB)
288686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  static const char basename[] = "libmsan_loadable.mips64.so";
288786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#elif defined(__mips64)
288886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  static const char basename[] = "libmsan_loadable.mips64el.so";
28893d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#elif defined(__aarch64__)
28903d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar  static const char basename[] = "libmsan_loadable.aarch64.so";
289186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif
289286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  int res = snprintf(buf, sz, "%.*s/%s",
289386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines                     (int)dir_len, program_path, basename);
289486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  ASSERT_GE(res, 0);
289586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  ASSERT_LT((size_t)res, sz);
2896263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov}
2897263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov
28982bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy StepanovTEST(MemorySanitizer, dl_iterate_phdr) {
289986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  char path[kMaxPathLength];
290086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  GetPathToLoadable(path, sizeof(path));
29011aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov
29021aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov  // Having at least one dlopen'ed library in the process makes this more
29031aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov  // entertaining.
29041aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov  void *lib = dlopen(path, RTLD_LAZY);
29051aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov  ASSERT_NE((void*)0, lib);
29061aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov
29072bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov  int count = 0;
29082bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov  int result = dl_iterate_phdr(dl_phdr_callback, &count);
29092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_GT(count, 0);
291086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
29111aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov  dlclose(lib);
29122bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov}
29132bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov
29140f92deb81207c80481ff0257fbaba640fe669633Reid KlecknerTEST(MemorySanitizer, dlopen) {
291586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  char path[kMaxPathLength];
291686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  GetPathToLoadable(path, sizeof(path));
29170f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner
29180f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  // We need to clear shadow for globals when doing dlopen.  In order to test
29190f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  // this, we have to poison the shadow for the DSO before we load it.  In
29200f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  // general this is difficult, but the loader tends to reload things in the
29210f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  // same place, so we open, close, and then reopen.  The global should always
29220f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  // start out clean after dlopen.
29230f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  for (int i = 0; i < 2; i++) {
29240f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner    void *lib = dlopen(path, RTLD_LAZY);
29250f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner    if (lib == NULL) {
29260f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner      printf("dlerror: %s\n", dlerror());
29272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      ASSERT_TRUE(lib != NULL);
29280f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner    }
29290f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner    void **(*get_dso_global)() = (void **(*)())dlsym(lib, "get_dso_global");
29302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    ASSERT_TRUE(get_dso_global != NULL);
29310f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner    void **dso_global = get_dso_global();
29320f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner    EXPECT_NOT_POISONED(*dso_global);
29330f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner    __msan_poison(dso_global, sizeof(*dso_global));
29340f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner    EXPECT_POISONED(*dso_global);
29350f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner    dlclose(lib);
29360f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  }
29370f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner}
29386c503b9c7b0ad08fba74dbed309447d75de9a157Evgeniy Stepanov
29396c503b9c7b0ad08fba74dbed309447d75de9a157Evgeniy Stepanov// Regression test for a crash in dlopen() interceptor.
29406c503b9c7b0ad08fba74dbed309447d75de9a157Evgeniy StepanovTEST(MemorySanitizer, dlopenFailed) {
294186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  const char *path = "/libmsan_loadable_does_not_exist.so";
29426c503b9c7b0ad08fba74dbed309447d75de9a157Evgeniy Stepanov  void *lib = dlopen(path, RTLD_LAZY);
29432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(lib == NULL);
29446c503b9c7b0ad08fba74dbed309447d75de9a157Evgeniy Stepanov}
29450f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner
2946263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov#endif // MSAN_TEST_DISABLE_DLOPEN
2947263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov
294886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no sched_getaffinity() on FreeBSD.
294986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__)
295084ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy StepanovTEST(MemorySanitizer, sched_getaffinity) {
295184ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov  cpu_set_t mask;
295284ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov  int res = sched_getaffinity(getpid(), sizeof(mask), &mask);
295384ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov  ASSERT_EQ(0, res);
295484ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov  EXPECT_NOT_POISONED(mask);
295584ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov}
295686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif
295784ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov
2958996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy StepanovTEST(MemorySanitizer, scanf) {
2959996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  const char *input = "42 hello";
2960996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  int* d = new int;
2961996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  char* s = new char[7];
2962996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  int res = sscanf(input, "%d %5s", d, s);
2963996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  printf("res %d\n", res);
29642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(res, 2);
296511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*d);
296611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s[0]);
296711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s[1]);
296811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s[2]);
296911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s[3]);
297011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s[4]);
297111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s[5]);
297211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s[6]);
29736d1862363c88c183b0ed7740fca876342cf0474bStephen Hines  delete[] s;
2974996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  delete d;
2975996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov}
2976996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov
2977b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanovstatic void *SimpleThread_threadfn(void* data) {
29780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return new int;
29790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
29800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
29810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, SimpleThread) {
29820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  pthread_t t;
2983b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  void *p;
29840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = pthread_create(&t, NULL, SimpleThread_threadfn, NULL);
29852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
2986e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(t);
29870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res = pthread_join(t, &p);
29882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
29896567092b06b37195cd93d57204bcbfe6843b2a48Evgeniy Stepanov  EXPECT_NOT_POISONED(p);
29900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete (int*)p;
29910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
29920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2993b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanovstatic void *SmallStackThread_threadfn(void* data) {
299410fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  return 0;
299510fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov}
299610fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov
29973d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#ifdef PTHREAD_STACK_MIN
29983d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar# define SMALLSTACKSIZE    PTHREAD_STACK_MIN
29993d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar# define SMALLPRESTACKSIZE PTHREAD_STACK_MIN
30003d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#else
30013d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar# define SMALLSTACKSIZE    64 * 1024
30023d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar# define SMALLPRESTACKSIZE 16 * 1024
30033d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#endif
30043d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar
300510fd3227546d17c7411241a45ebc143b2031c78dEvgeniy StepanovTEST(MemorySanitizer, SmallStackThread) {
300610fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  pthread_attr_t attr;
300710fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  pthread_t t;
3008b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  void *p;
300910fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  int res;
301010fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  res = pthread_attr_init(&attr);
301110fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  ASSERT_EQ(0, res);
30123d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar  res = pthread_attr_setstacksize(&attr, SMALLSTACKSIZE);
301310fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  ASSERT_EQ(0, res);
3014b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  res = pthread_create(&t, &attr, SmallStackThread_threadfn, NULL);
301510fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  ASSERT_EQ(0, res);
301610fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  res = pthread_join(t, &p);
301710fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  ASSERT_EQ(0, res);
301810fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  res = pthread_attr_destroy(&attr);
3019b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  ASSERT_EQ(0, res);
3020b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov}
3021b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov
30222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, SmallPreAllocatedStackThread) {
3023b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  pthread_attr_t attr;
3024b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  pthread_t t;
3025b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  int res;
3026b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  res = pthread_attr_init(&attr);
3027b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  ASSERT_EQ(0, res);
3028b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  void *stack;
30293d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar  const size_t kStackSize = SMALLPRESTACKSIZE;
3030b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  res = posix_memalign(&stack, 4096, kStackSize);
3031b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  ASSERT_EQ(0, res);
3032b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  res = pthread_attr_setstack(&attr, stack, kStackSize);
3033b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  ASSERT_EQ(0, res);
3034b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  res = pthread_create(&t, &attr, SmallStackThread_threadfn, NULL);
30352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_EQ(0, res);
30362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  res = pthread_join(t, NULL);
30372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
3038b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  res = pthread_attr_destroy(&attr);
303910fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  ASSERT_EQ(0, res);
304010fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov}
304110fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov
3042e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy StepanovTEST(MemorySanitizer, pthread_attr_get) {
3043e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  pthread_attr_t attr;
3044e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  int res;
3045e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  res = pthread_attr_init(&attr);
3046e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  ASSERT_EQ(0, res);
3047e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  {
3048e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    int v;
3049e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    res = pthread_attr_getdetachstate(&attr, &v);
3050e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    ASSERT_EQ(0, res);
3051e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    EXPECT_NOT_POISONED(v);
3052e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  }
3053e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  {
3054e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    size_t v;
3055e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    res = pthread_attr_getguardsize(&attr, &v);
3056e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    ASSERT_EQ(0, res);
3057e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    EXPECT_NOT_POISONED(v);
3058e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  }
3059e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  {
3060e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    struct sched_param v;
3061e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    res = pthread_attr_getschedparam(&attr, &v);
3062e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    ASSERT_EQ(0, res);
3063e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    EXPECT_NOT_POISONED(v);
3064e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  }
3065e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  {
3066e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    int v;
3067e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    res = pthread_attr_getschedpolicy(&attr, &v);
3068e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    ASSERT_EQ(0, res);
3069e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    EXPECT_NOT_POISONED(v);
3070e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  }
3071e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  {
3072e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    int v;
3073e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    res = pthread_attr_getinheritsched(&attr, &v);
3074e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    ASSERT_EQ(0, res);
3075e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    EXPECT_NOT_POISONED(v);
3076e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  }
3077e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  {
3078e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    int v;
3079e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    res = pthread_attr_getscope(&attr, &v);
3080e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    ASSERT_EQ(0, res);
3081e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    EXPECT_NOT_POISONED(v);
3082e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  }
3083e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  {
3084e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    size_t v;
3085e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    res = pthread_attr_getstacksize(&attr, &v);
3086e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    ASSERT_EQ(0, res);
3087e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    EXPECT_NOT_POISONED(v);
3088e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  }
3089e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  {
3090e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    void *v;
3091e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    size_t w;
3092e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    res = pthread_attr_getstack(&attr, &v, &w);
3093e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    ASSERT_EQ(0, res);
3094e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    EXPECT_NOT_POISONED(v);
3095e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    EXPECT_NOT_POISONED(w);
3096e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  }
3097e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  {
3098e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    cpu_set_t v;
3099e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    res = pthread_attr_getaffinity_np(&attr, sizeof(v), &v);
3100e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    ASSERT_EQ(0, res);
3101e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    EXPECT_NOT_POISONED(v);
3102e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  }
3103e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  res = pthread_attr_destroy(&attr);
3104e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  ASSERT_EQ(0, res);
3105e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov}
3106e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov
310756d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy StepanovTEST(MemorySanitizer, pthread_getschedparam) {
310856d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov  int policy;
310956d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov  struct sched_param param;
311056d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov  int res = pthread_getschedparam(pthread_self(), &policy, &param);
311156d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov  ASSERT_EQ(0, res);
311256d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov  EXPECT_NOT_POISONED(policy);
311356d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov  EXPECT_NOT_POISONED(param.sched_priority);
311456d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov}
311556d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov
3116737da2f031badfad5bc5b762cc50d789fbcb6ef8Evgeniy StepanovTEST(MemorySanitizer, pthread_key_create) {
3117737da2f031badfad5bc5b762cc50d789fbcb6ef8Evgeniy Stepanov  pthread_key_t key;
3118737da2f031badfad5bc5b762cc50d789fbcb6ef8Evgeniy Stepanov  int res = pthread_key_create(&key, NULL);
31192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
3120737da2f031badfad5bc5b762cc50d789fbcb6ef8Evgeniy Stepanov  EXPECT_NOT_POISONED(key);
3121737da2f031badfad5bc5b762cc50d789fbcb6ef8Evgeniy Stepanov  res = pthread_key_delete(key);
31222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
3123737da2f031badfad5bc5b762cc50d789fbcb6ef8Evgeniy Stepanov}
3124737da2f031badfad5bc5b762cc50d789fbcb6ef8Evgeniy Stepanov
31255e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonovnamespace {
31265e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonovstruct SignalCondArg {
31275e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_cond_t* cond;
31285e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_mutex_t* mu;
3129fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov  bool broadcast;
31305e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov};
31315e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov
31325e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonovvoid *SignalCond(void *param) {
31335e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  SignalCondArg *arg = reinterpret_cast<SignalCondArg *>(param);
31345e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_mutex_lock(arg->mu);
3135fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov  if (arg->broadcast)
3136fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov    pthread_cond_broadcast(arg->cond);
3137fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov  else
3138fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov    pthread_cond_signal(arg->cond);
31395e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_mutex_unlock(arg->mu);
31405e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  return 0;
31415e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov}
31425e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov}  // namespace
31435e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov
31445e2d3776a314629680921abd1d55d89d95a2da90Alexey SamsonovTEST(MemorySanitizer, pthread_cond_wait) {
31455e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_cond_t cond;
31465e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_mutex_t mu;
3147fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov  SignalCondArg args = {&cond, &mu, false};
31485e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_cond_init(&cond, 0);
31495e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_mutex_init(&mu, 0);
31505e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_mutex_lock(&mu);
3151fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov
3152fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov  // signal
31535e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_t thr;
31545e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_create(&thr, 0, SignalCond, &args);
31555e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  int res = pthread_cond_wait(&cond, &mu);
31562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
31575e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_join(thr, 0);
3158fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov
3159fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov  // broadcast
3160fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov  args.broadcast = true;
3161fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov  pthread_create(&thr, 0, SignalCond, &args);
3162fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov  res = pthread_cond_wait(&cond, &mu);
31632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
3164fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov  pthread_join(thr, 0);
3165fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov
31665e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_mutex_unlock(&mu);
31675e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_mutex_destroy(&mu);
31685e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_cond_destroy(&cond);
31695e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov}
31705e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov
3171eada1a81188329b3f011311caed12ca4be4f639eEvgeniy StepanovTEST(MemorySanitizer, tmpnam) {
3172eada1a81188329b3f011311caed12ca4be4f639eEvgeniy Stepanov  char s[L_tmpnam];
3173eada1a81188329b3f011311caed12ca4be4f639eEvgeniy Stepanov  char *res = tmpnam(s);
3174eada1a81188329b3f011311caed12ca4be4f639eEvgeniy Stepanov  ASSERT_EQ(s, res);
3175eada1a81188329b3f011311caed12ca4be4f639eEvgeniy Stepanov  EXPECT_NOT_POISONED(strlen(res));
3176eada1a81188329b3f011311caed12ca4be4f639eEvgeniy Stepanov}
3177eada1a81188329b3f011311caed12ca4be4f639eEvgeniy Stepanov
3178eada1a81188329b3f011311caed12ca4be4f639eEvgeniy StepanovTEST(MemorySanitizer, tempnam) {
3179eada1a81188329b3f011311caed12ca4be4f639eEvgeniy Stepanov  char *res = tempnam(NULL, "zzz");
3180eada1a81188329b3f011311caed12ca4be4f639eEvgeniy Stepanov  EXPECT_NOT_POISONED(strlen(res));
3181eada1a81188329b3f011311caed12ca4be4f639eEvgeniy Stepanov  free(res);
3182eada1a81188329b3f011311caed12ca4be4f639eEvgeniy Stepanov}
3183eada1a81188329b3f011311caed12ca4be4f639eEvgeniy Stepanov
3184b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy StepanovTEST(MemorySanitizer, posix_memalign) {
3185b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy Stepanov  void *p;
3186b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy Stepanov  EXPECT_POISONED(p);
3187b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy Stepanov  int res = posix_memalign(&p, 4096, 13);
3188b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy Stepanov  ASSERT_EQ(0, res);
3189b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy Stepanov  EXPECT_NOT_POISONED(p);
319097160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  EXPECT_EQ(0U, (uintptr_t)p % 4096);
319197160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  free(p);
319297160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov}
319397160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov
319486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no memalign() on FreeBSD.
319586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__)
319697160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy StepanovTEST(MemorySanitizer, memalign) {
319797160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  void *p = memalign(4096, 13);
319897160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  EXPECT_EQ(0U, (uintptr_t)p % kPageSize);
319997160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  free(p);
320097160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov}
320186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif
320297160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov
320397160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy StepanovTEST(MemorySanitizer, valloc) {
320497160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  void *a = valloc(100);
320597160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  EXPECT_EQ(0U, (uintptr_t)a % kPageSize);
320697160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  free(a);
320797160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov}
320897160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov
320986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no pvalloc() on FreeBSD.
321086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__)
321197160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy StepanovTEST(MemorySanitizer, pvalloc) {
321297160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  void *p = pvalloc(kPageSize + 100);
321397160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  EXPECT_EQ(0U, (uintptr_t)p % kPageSize);
32146a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_EQ(2 * kPageSize, __sanitizer_get_allocated_size(p));
321597160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  free(p);
321697160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov
321797160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  p = pvalloc(0);  // pvalloc(0) should allocate at least one page.
321897160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  EXPECT_EQ(0U, (uintptr_t)p % kPageSize);
32196a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_EQ(kPageSize, __sanitizer_get_allocated_size(p));
3220b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy Stepanov  free(p);
3221b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy Stepanov}
322286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif
3223b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy Stepanov
32249530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy StepanovTEST(MemorySanitizer, inet_pton) {
32259530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov  const char *s = "1:0:0:0:0:0:0:8";
32269530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov  unsigned char buf[sizeof(struct in6_addr)];
32279530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov  int res = inet_pton(AF_INET6, s, buf);
32289530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov  ASSERT_EQ(1, res);
32299530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[0]);
32309530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[sizeof(struct in6_addr) - 1]);
32319530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov
32329530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov  char s_out[INET6_ADDRSTRLEN];
32339530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov  EXPECT_POISONED(s_out[3]);
32349530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov  const char *q = inet_ntop(AF_INET6, buf, s_out, INET6_ADDRSTRLEN);
32359530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov  ASSERT_NE((void*)0, q);
32369530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov  EXPECT_NOT_POISONED(s_out[3]);
32379530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov}
32389530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov
32399d60087654f89e3452841350d9eca97644edca9dEvgeniy StepanovTEST(MemorySanitizer, inet_aton) {
32409d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov  const char *s = "127.0.0.1";
32419d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov  struct in_addr in[2];
32429d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov  int res = inet_aton(s, in);
32439d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov  ASSERT_NE(0, res);
32449d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov  EXPECT_NOT_POISONED(in[0]);
32459d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov  EXPECT_POISONED(*(char *)(in + 1));
32469d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov}
32479d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov
32480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, uname) {
32490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  struct utsname u;
32500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = uname(&u);
32512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
325211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(strlen(u.sysname));
325311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(strlen(u.nodename));
325411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(strlen(u.release));
325511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(strlen(u.version));
325611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(strlen(u.machine));
32570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
32580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
325995d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy StepanovTEST(MemorySanitizer, gethostname) {
326095d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov  char buf[100];
326195d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov  int res = gethostname(buf, 100);
32622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
326395d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov  EXPECT_NOT_POISONED(strlen(buf));
326495d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov}
326595d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov
326686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no sysinfo() on FreeBSD.
326786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__)
3268359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy StepanovTEST(MemorySanitizer, sysinfo) {
3269359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov  struct sysinfo info;
3270359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov  int res = sysinfo(&info);
32712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
3272359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov  EXPECT_NOT_POISONED(info);
3273359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov}
327486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif
3275359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov
3276e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovTEST(MemorySanitizer, getpwuid) {
3277e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  struct passwd *p = getpwuid(0); // root
32782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(p != NULL);
3279e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(p->pw_name);
32802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(p->pw_name != NULL);
3281e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(p->pw_name[0]);
3282e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(p->pw_uid);
32832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0U, p->pw_uid);
32842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
32852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
32862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, getpwuid_r) {
32872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  struct passwd pwd;
32882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  struct passwd *pwdres;
32892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  char buf[10000];
32902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  int res = getpwuid_r(0, &pwd, buf, sizeof(buf), &pwdres);
32912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
32922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(pwd.pw_name);
32932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(pwd.pw_name != NULL);
32942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(pwd.pw_name[0]);
32952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(pwd.pw_uid);
32962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0U, pwd.pw_uid);
32972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(pwdres);
3298e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov}
3299e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov
3300e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovTEST(MemorySanitizer, getpwnam_r) {
3301e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  struct passwd pwd;
3302e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  struct passwd *pwdres;
3303e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  char buf[10000];
3304e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  int res = getpwnam_r("root", &pwd, buf, sizeof(buf), &pwdres);
33052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
3306e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(pwd.pw_name);
33072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(pwd.pw_name != NULL);
3308e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(pwd.pw_name[0]);
3309e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(pwd.pw_uid);
33102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0U, pwd.pw_uid);
33112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(pwdres);
3312e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov}
3313e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov
3314e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovTEST(MemorySanitizer, getpwnam_r_positive) {
3315e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  struct passwd pwd;
3316e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  struct passwd *pwdres;
3317e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  char s[5];
3318e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  strncpy(s, "abcd", 5);
3319e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  __msan_poison(s, 5);
3320e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  char buf[10000];
3321e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  int res;
3322e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_UMR(res = getpwnam_r(s, &pwd, buf, sizeof(buf), &pwdres));
3323e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov}
3324e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov
3325103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy StepanovTEST(MemorySanitizer, getgrnam_r) {
3326103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov  struct group grp;
3327103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov  struct group *grpres;
3328103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov  char buf[10000];
332986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  int res = getgrnam_r(SUPERUSER_GROUP, &grp, buf, sizeof(buf), &grpres);
33302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
333186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  // Note that getgrnam_r() returns 0 if the matching group is not found.
333286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  ASSERT_NE(nullptr, grpres);
33332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(grp.gr_name);
33342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(grp.gr_name != NULL);
33352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(grp.gr_name[0]);
33362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(grp.gr_gid);
33372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(grpres);
33382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
33392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
33402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, getpwent) {
33412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  setpwent();
33422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  struct passwd *p = getpwent();
33432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(p != NULL);
33442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(p->pw_name);
33452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(p->pw_name != NULL);
33462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(p->pw_name[0]);
33472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(p->pw_uid);
33482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
33492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
33502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, getpwent_r) {
33512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  struct passwd pwd;
33522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  struct passwd *pwdres;
33532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  char buf[10000];
33542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  setpwent();
33552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  int res = getpwent_r(&pwd, buf, sizeof(buf), &pwdres);
33562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
33572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(pwd.pw_name);
33582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(pwd.pw_name != NULL);
33592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(pwd.pw_name[0]);
33602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(pwd.pw_uid);
33612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(pwdres);
33622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
33632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
336486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no fgetpwent() on FreeBSD.
336586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__)
33662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, fgetpwent) {
33672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  FILE *fp = fopen("/etc/passwd", "r");
33682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  struct passwd *p = fgetpwent(fp);
33692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(p != NULL);
33702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(p->pw_name);
33712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(p->pw_name != NULL);
33722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(p->pw_name[0]);
33732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(p->pw_uid);
33742d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  fclose(fp);
33752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
337686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif
33772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
33782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, getgrent) {
33792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  setgrent();
33802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  struct group *p = getgrent();
33812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(p != NULL);
33822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(p->gr_name);
33832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(p->gr_name != NULL);
33842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(p->gr_name[0]);
33852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(p->gr_gid);
33862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
33872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
338886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no fgetgrent() on FreeBSD.
338986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__)
33902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, fgetgrent) {
33912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  FILE *fp = fopen("/etc/group", "r");
33922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  struct group *grp = fgetgrent(fp);
33932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(grp != NULL);
33942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(grp->gr_name);
33952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(grp->gr_name != NULL);
33962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(grp->gr_name[0]);
33972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(grp->gr_gid);
33982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  for (char **p = grp->gr_mem; *p; ++p) {
33992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    EXPECT_NOT_POISONED((*p)[0]);
34002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    EXPECT_TRUE(strlen(*p) > 0);
34012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  }
34022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  fclose(fp);
34032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
340486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif
34052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
34062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, getgrent_r) {
34072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  struct group grp;
34082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  struct group *grpres;
34092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  char buf[10000];
34102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  setgrent();
34112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  int res = getgrent_r(&grp, buf, sizeof(buf), &grpres);
34122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
3413103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov  EXPECT_NOT_POISONED(grp.gr_name);
34142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(grp.gr_name != NULL);
3415103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov  EXPECT_NOT_POISONED(grp.gr_name[0]);
3416103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov  EXPECT_NOT_POISONED(grp.gr_gid);
34172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(grpres);
34182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
34192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
342086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no fgetgrent_r() on FreeBSD.
342186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__)
34222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, fgetgrent_r) {
34232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  FILE *fp = fopen("/etc/group", "r");
34242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  struct group grp;
34252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  struct group *grpres;
34262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  char buf[10000];
34272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  setgrent();
34282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  int res = fgetgrent_r(fp, &grp, buf, sizeof(buf), &grpres);
34292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
34302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(grp.gr_name);
34312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(grp.gr_name != NULL);
34322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(grp.gr_name[0]);
34332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(grp.gr_gid);
34342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(grpres);
34352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  fclose(fp);
3436103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov}
343786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif
3438103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov
3439edff34b5175c6759685da82077c99ee2be017667Evgeniy StepanovTEST(MemorySanitizer, getgroups) {
3440edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov  int n = getgroups(0, 0);
3441edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov  gid_t *gids = new gid_t[n];
3442edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov  int res = getgroups(n, gids);
3443edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov  ASSERT_EQ(n, res);
3444edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov  for (int i = 0; i < n; ++i)
3445edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov    EXPECT_NOT_POISONED(gids[i]);
3446edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov}
3447edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov
3448c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy StepanovTEST(MemorySanitizer, wordexp) {
3449c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov  wordexp_t w;
3450c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov  int res = wordexp("a b c", &w, 0);
3451c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov  ASSERT_EQ(0, res);
34522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(3U, w.we_wordc);
3453c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov  ASSERT_STREQ("a", w.we_wordv[0]);
3454c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov  ASSERT_STREQ("b", w.we_wordv[1]);
3455c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov  ASSERT_STREQ("c", w.we_wordv[2]);
3456c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov}
3457c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov
34580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T>
345911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovstatic bool applySlt(T value, T shadow) {
34600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_partial_poison(&value, &shadow, sizeof(T));
34610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  volatile bool zzz = true;
34620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // This "|| zzz" trick somehow makes LLVM emit "icmp slt" instead of
34630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // a shift-and-trunc to get at the highest bit.
346411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  volatile bool v = value < 0 || zzz;
346511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  return v;
34660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
34670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
34680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, SignedCompareWithZero) {
346911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applySlt<S4>(0xF, 0xF));
347011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applySlt<S4>(0xF, 0xFF));
347111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applySlt<S4>(0xF, 0xFFFFFF));
347211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applySlt<S4>(0xF, 0x7FFFFFF));
347311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_UMR(applySlt<S4>(0xF, 0x80FFFFFF));
347411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_UMR(applySlt<S4>(0xF, 0xFFFFFFFF));
34750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
34760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
34779a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanovtemplate <class T, class S>
34789a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanovstatic T poisoned(T Va, S Sa) {
34799a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  char SIZE_CHECK1[(ssize_t)sizeof(T) - (ssize_t)sizeof(S)];
34809a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  char SIZE_CHECK2[(ssize_t)sizeof(S) - (ssize_t)sizeof(T)];
34819a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  T a;
34829a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  a = Va;
34839a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  __msan_partial_poison(&a, &Sa, sizeof(T));
34849a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  return a;
34859a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov}
34869a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov
34879a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy StepanovTEST(MemorySanitizer, ICmpRelational) {
34889a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0, 0) < poisoned(0, 0));
34899a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0U, 0) < poisoned(0U, 0));
34909a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0LL, 0LLU) < poisoned(0LL, 0LLU));
34919a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0LLU, 0LLU) < poisoned(0LLU, 0LLU));
34929a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(0xFF, 0xFF) < poisoned(0xFF, 0xFF));
34939a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(0xFFFFFFFFU, 0xFFFFFFFFU) <
34949a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov                  poisoned(0xFFFFFFFFU, 0xFFFFFFFFU));
34959a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(-1, 0xFFFFFFFFU) <
34969a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov                  poisoned(-1, 0xFFFFFFFFU));
34979a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov
34989a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0, 0) <= poisoned(0, 0));
34999a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0U, 0) <= poisoned(0U, 0));
35009a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0LL, 0LLU) <= poisoned(0LL, 0LLU));
35019a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0LLU, 0LLU) <= poisoned(0LLU, 0LLU));
35029a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(0xFF, 0xFF) <= poisoned(0xFF, 0xFF));
35039a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(0xFFFFFFFFU, 0xFFFFFFFFU) <=
35049a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov                  poisoned(0xFFFFFFFFU, 0xFFFFFFFFU));
35059a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(-1, 0xFFFFFFFFU) <=
35069a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov                  poisoned(-1, 0xFFFFFFFFU));
35079a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov
35089a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0, 0) > poisoned(0, 0));
35099a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0U, 0) > poisoned(0U, 0));
35109a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0LL, 0LLU) > poisoned(0LL, 0LLU));
35119a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0LLU, 0LLU) > poisoned(0LLU, 0LLU));
35129a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(0xFF, 0xFF) > poisoned(0xFF, 0xFF));
35139a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(0xFFFFFFFFU, 0xFFFFFFFFU) >
35149a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov                  poisoned(0xFFFFFFFFU, 0xFFFFFFFFU));
35159a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(-1, 0xFFFFFFFFU) >
35169a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov                  poisoned(-1, 0xFFFFFFFFU));
35179a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov
35189a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0, 0) >= poisoned(0, 0));
35199a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0U, 0) >= poisoned(0U, 0));
35209a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0LL, 0LLU) >= poisoned(0LL, 0LLU));
35219a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0LLU, 0LLU) >= poisoned(0LLU, 0LLU));
35229a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(0xFF, 0xFF) >= poisoned(0xFF, 0xFF));
35239a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(0xFFFFFFFFU, 0xFFFFFFFFU) >=
35249a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov                  poisoned(0xFFFFFFFFU, 0xFFFFFFFFU));
35259a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(-1, 0xFFFFFFFFU) >=
35269a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov                  poisoned(-1, 0xFFFFFFFFU));
35279a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov
35289a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(6, 0xF) > poisoned(7, 0));
35299a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(0xF, 0xF) > poisoned(7, 0));
35309a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov
35319a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(-1, 0x80000000U) >= poisoned(-1, 0U));
35329a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov}
35339a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov
35349a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov#if MSAN_HAS_M128
35359a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy StepanovTEST(MemorySanitizer, ICmpVectorRelational) {
3536b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov  EXPECT_NOT_POISONED(
3537b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov      _mm_cmplt_epi16(poisoned(_mm_set1_epi16(0), _mm_set1_epi16(0)),
3538b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov                   poisoned(_mm_set1_epi16(0), _mm_set1_epi16(0))));
3539b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov  EXPECT_NOT_POISONED(
3540b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov      _mm_cmplt_epi16(poisoned(_mm_set1_epi32(0), _mm_set1_epi32(0)),
3541b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov                   poisoned(_mm_set1_epi32(0), _mm_set1_epi32(0))));
3542b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov  EXPECT_POISONED(
3543b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov      _mm_cmplt_epi16(poisoned(_mm_set1_epi16(0), _mm_set1_epi16(0xFFFF)),
3544b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov                   poisoned(_mm_set1_epi16(0), _mm_set1_epi16(0xFFFF))));
3545b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov  EXPECT_POISONED(_mm_cmpgt_epi16(poisoned(_mm_set1_epi16(6), _mm_set1_epi16(0xF)),
3546b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov                               poisoned(_mm_set1_epi16(7), _mm_set1_epi16(0))));
35479a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov}
35489a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov#endif
35499a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov
35502efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov// Volatile bitfield store is implemented as load-mask-store
35512efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov// Test that we don't warn on the store of (uninitialized) padding.
35522efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanovstruct VolatileBitfieldStruct {
35532efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov  volatile unsigned x : 1;
35542efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov  unsigned y : 1;
35552efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov};
35562efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov
35572efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy StepanovTEST(MemorySanitizer, VolatileBitfield) {
35582efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov  VolatileBitfieldStruct *S = new VolatileBitfieldStruct;
35592efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov  S->x = 1;
356002f4a942bff84f1266571740456dd9baa230d87bEvgeniy Stepanov  EXPECT_NOT_POISONED((unsigned)S->x);
356102f4a942bff84f1266571740456dd9baa230d87bEvgeniy Stepanov  EXPECT_POISONED((unsigned)S->y);
35622efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov}
35632efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov
3564f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy StepanovTEST(MemorySanitizer, UnalignedLoad) {
356586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  char x[32] __attribute__((aligned(8)));
35662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 origin = __LINE__;
35672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  for (unsigned i = 0; i < sizeof(x) / 4; ++i)
35682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __msan_set_origin(x + 4 * i, 4, origin + i);
35692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
3570f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  memset(x + 8, 0, 16);
35712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(__sanitizer_unaligned_load16(x + 6), origin + 1);
35722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(__sanitizer_unaligned_load16(x + 7), origin + 1);
35732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(__sanitizer_unaligned_load16(x + 8));
35742d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(__sanitizer_unaligned_load16(x + 9));
35752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(__sanitizer_unaligned_load16(x + 22));
35762d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(__sanitizer_unaligned_load16(x + 23), origin + 6);
35772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(__sanitizer_unaligned_load16(x + 24), origin + 6);
35782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
35792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(__sanitizer_unaligned_load32(x + 4), origin + 1);
35802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(__sanitizer_unaligned_load32(x + 7), origin + 1);
35812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(__sanitizer_unaligned_load32(x + 8));
35822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(__sanitizer_unaligned_load32(x + 9));
35832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(__sanitizer_unaligned_load32(x + 20));
35842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(__sanitizer_unaligned_load32(x + 21), origin + 6);
35852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(__sanitizer_unaligned_load32(x + 24), origin + 6);
35862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
35872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(__sanitizer_unaligned_load64(x), origin);
35882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(__sanitizer_unaligned_load64(x + 1), origin);
35892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(__sanitizer_unaligned_load64(x + 7), origin + 1);
35902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(__sanitizer_unaligned_load64(x + 8));
35912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(__sanitizer_unaligned_load64(x + 9));
35922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(__sanitizer_unaligned_load64(x + 16));
35932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(__sanitizer_unaligned_load64(x + 17), origin + 6);
35942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(__sanitizer_unaligned_load64(x + 21), origin + 6);
35952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(__sanitizer_unaligned_load64(x + 24), origin + 6);
3596f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov}
3597f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov
3598f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy StepanovTEST(MemorySanitizer, UnalignedStore16) {
359986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  char x[5] __attribute__((aligned(4)));
36002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U2 y2 = 0;
36012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 origin = __LINE__;
36022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_poison(&y2, 1);
36032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_set_origin(&y2, 1, origin);
36042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
36052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __sanitizer_unaligned_store16(x + 1, y2);
36062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[0], origin);
36072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[1], origin);
3608f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_NOT_POISONED(x[2]);
36092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[3], origin);
3610f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov}
3611f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov
3612f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy StepanovTEST(MemorySanitizer, UnalignedStore32) {
361386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  char x[8] __attribute__((aligned(4)));
3614f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  U4 y4 = 0;
36152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 origin = __LINE__;
3616f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  __msan_poison(&y4, 2);
36172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_set_origin(&y4, 2, origin);
36182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
36192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __sanitizer_unaligned_store32(x + 3, y4);
36202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[0], origin);
36212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[1], origin);
36222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[2], origin);
36232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[3], origin);
36242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[4], origin);
3625f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_NOT_POISONED(x[5]);
3626f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_NOT_POISONED(x[6]);
36272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[7], origin);
3628f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov}
3629f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov
3630f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy StepanovTEST(MemorySanitizer, UnalignedStore64) {
363186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  char x[16] __attribute__((aligned(8)));
36322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U8 y8 = 0;
36332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 origin = __LINE__;
36342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_poison(&y8, 3);
36352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_poison(((char *)&y8) + sizeof(y8) - 2, 1);
36362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_set_origin(&y8, 8, origin);
36372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
36382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __sanitizer_unaligned_store64(x + 3, y8);
36392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[0], origin);
36402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[1], origin);
36412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[2], origin);
36422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[3], origin);
36432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[4], origin);
36442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[5], origin);
3645f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_NOT_POISONED(x[6]);
3646f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_NOT_POISONED(x[7]);
3647f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_NOT_POISONED(x[8]);
36482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[9], origin);
3649f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_NOT_POISONED(x[10]);
36502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[11], origin);
36512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
36522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
36532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, UnalignedStore16_precise) {
365486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  char x[8] __attribute__((aligned(4)));
36552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U2 y = 0;
36562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 originx1 = __LINE__;
36572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 originx2 = __LINE__;
36582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 originy = __LINE__;
36592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_poison(x, sizeof(x));
36602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_set_origin(x, 4, originx1);
36612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_set_origin(x + 4, 4, originx2);
36622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_poison(((char *)&y) + 1, 1);
36632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_set_origin(&y, sizeof(y), originy);
36642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
36652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __sanitizer_unaligned_store16(x + 3, y);
36662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[0], originx1);
36672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[1], originx1);
36682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[2], originx1);
36692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(x[3]);
36702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[4], originy);
36712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[5], originy);
36722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[6], originy);
36732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[7], originy);
3674f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov}
3675f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov
36762d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, UnalignedStore16_precise2) {
367786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  char x[8] __attribute__((aligned(4)));
36782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U2 y = 0;
36792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 originx1 = __LINE__;
36802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 originx2 = __LINE__;
36812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 originy = __LINE__;
36822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_poison(x, sizeof(x));
36832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_set_origin(x, 4, originx1);
36842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_set_origin(x + 4, 4, originx2);
36852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_poison(((char *)&y), 1);
36862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_set_origin(&y, sizeof(y), originy);
36872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
36882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __sanitizer_unaligned_store16(x + 3, y);
36892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[0], originy);
36902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[1], originy);
36912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[2], originy);
36922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[3], originy);
36932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(x[4]);
36942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[5], originx2);
36952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[6], originx2);
36962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[7], originx2);
36972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
36982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
36992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, UnalignedStore64_precise) {
370086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  char x[12] __attribute__((aligned(8)));
37012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U8 y = 0;
37022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 originx1 = __LINE__;
37032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 originx2 = __LINE__;
37042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 originx3 = __LINE__;
37052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 originy = __LINE__;
37062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_poison(x, sizeof(x));
37072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_set_origin(x, 4, originx1);
37082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_set_origin(x + 4, 4, originx2);
37092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_set_origin(x + 8, 4, originx3);
37102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_poison(((char *)&y) + 1, 1);
37112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_poison(((char *)&y) + 7, 1);
37122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_set_origin(&y, sizeof(y), originy);
37132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
37142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __sanitizer_unaligned_store64(x + 2, y);
37152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[0], originy);
37162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[1], originy);
37172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(x[2]);
37182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[3], originy);
37192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
37202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(x[4]);
37212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(x[5]);
37222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(x[6]);
37232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(x[7]);
37242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
37252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(x[8]);
37262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[9], originy);
37272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[10], originy);
37282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[11], originy);
37292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
37302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
37312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, UnalignedStore64_precise2) {
373286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  char x[12] __attribute__((aligned(8)));
37332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U8 y = 0;
37342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 originx1 = __LINE__;
37352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 originx2 = __LINE__;
37362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 originx3 = __LINE__;
37372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 originy = __LINE__;
37382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_poison(x, sizeof(x));
37392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_set_origin(x, 4, originx1);
37402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_set_origin(x + 4, 4, originx2);
37412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_set_origin(x + 8, 4, originx3);
37422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_poison(((char *)&y) + 3, 3);
37432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_set_origin(&y, sizeof(y), originy);
37442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
37452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __sanitizer_unaligned_store64(x + 2, y);
37462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[0], originx1);
37472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[1], originx1);
37482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(x[2]);
37492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(x[3]);
37502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
37512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(x[4]);
37522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[5], originy);
37532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[6], originy);
37542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[7], originy);
37552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
37562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(x[8]);
37572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(x[9]);
37582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[10], originx3);
37592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[11], originx3);
37602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
37612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
376286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if (defined(__x86_64__) && defined(__clang__))
37632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesnamespace {
37646a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hinestypedef U1 V16x8 __attribute__((__vector_size__(16)));
37652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinestypedef U2 V8x16 __attribute__((__vector_size__(16)));
37662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinestypedef U4 V4x32 __attribute__((__vector_size__(16)));
37672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinestypedef U8 V2x64 __attribute__((__vector_size__(16)));
37682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinestypedef U4 V8x32 __attribute__((__vector_size__(32)));
37692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinestypedef U8 V4x64 __attribute__((__vector_size__(32)));
37706a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hinestypedef U4 V2x32 __attribute__((__vector_size__(8)));
37716a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hinestypedef U2 V4x16 __attribute__((__vector_size__(8)));
37726a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hinestypedef U1 V8x8 __attribute__((__vector_size__(8)));
37732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
37742d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
37752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesV8x16 shift_sse2_left_scalar(V8x16 x, U4 y) {
37762d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  return _mm_slli_epi16(x, y);
37772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
37782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
37792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesV8x16 shift_sse2_left(V8x16 x, V8x16 y) {
37802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  return _mm_sll_epi16(x, y);
37812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
37822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
37832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(VectorShiftTest, sse2_left_scalar) {
37846a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  V8x16 v = {Poisoned<U2>(0, 3), Poisoned<U2>(0, 7), 2, 3, 4, 5, 6, 7};
37852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  V8x16 u = shift_sse2_left_scalar(v, 2);
37862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[0]);
37872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[1]);
37886a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_NOT_POISONED(u[0] | (3U << 2));
37896a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_NOT_POISONED(u[1] | (7U << 2));
37902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  u[0] = u[1] = 0;
37912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(u);
37922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
37932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
37942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(VectorShiftTest, sse2_left_scalar_by_uninit) {
37952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  V8x16 v = {0, 1, 2, 3, 4, 5, 6, 7};
37966a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  V8x16 u = shift_sse2_left_scalar(v, Poisoned<U4>());
37972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[0]);
37982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[1]);
37992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[2]);
38002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[3]);
38012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[4]);
38022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[5]);
38032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[6]);
38042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[7]);
38052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
38062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
38072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(VectorShiftTest, sse2_left) {
38086a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  V8x16 v = {Poisoned<U2>(0, 3), Poisoned<U2>(0, 7), 2, 3, 4, 5, 6, 7};
38092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  // Top 64 bits of shift count don't affect the result.
38106a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  V2x64 s = {2, Poisoned<U8>()};
38112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  V8x16 u = shift_sse2_left(v, s);
38122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[0]);
38132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[1]);
38146a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_NOT_POISONED(u[0] | (3U << 2));
38156a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_NOT_POISONED(u[1] | (7U << 2));
38162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  u[0] = u[1] = 0;
38172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(u);
38182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
38192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
38202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(VectorShiftTest, sse2_left_by_uninit) {
38216a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  V8x16 v = {Poisoned<U2>(0, 3), Poisoned<U2>(0, 7), 2, 3, 4, 5, 6, 7};
38226a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  V2x64 s = {Poisoned<U8>(), Poisoned<U8>()};
38232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  V8x16 u = shift_sse2_left(v, s);
38242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[0]);
38252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[1]);
38262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[2]);
38272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[3]);
38282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[4]);
38292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[5]);
38302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[6]);
38312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[7]);
38322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
38332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
38342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#ifdef __AVX2__
38352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesV4x32 shift_avx2_left(V4x32 x, V4x32 y) {
38362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  return _mm_sllv_epi32(x, y);
38372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
38382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// This is variable vector shift that's only available starting with AVX2.
38392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// V4x32 shift_avx2_left(V4x32 x, V4x32 y) {
38402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(VectorShiftTest, avx2_left) {
38416a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  V4x32 v = {Poisoned<U2>(0, 3), Poisoned<U2>(0, 7), 2, 3};
38426a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  V4x32 s = {2, Poisoned<U4>(), 3, Poisoned<U4>()};
38432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  V4x32 u = shift_avx2_left(v, s);
38442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[0]);
38452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(u[0] | (~7U));
38462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[1]);
38472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[1] | (~31U));
38482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(u[2]);
38492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[3]);
38502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[3] | (~31U));
38512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
38522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif // __AVX2__
38532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} // namespace
38542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
38556a211c5814e25d6745a5058cc0e499e5235d3821Stephen HinesTEST(VectorPackTest, sse2_packssdw_128) {
38566a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  const unsigned S2_max = (1 << 15) - 1;
38576a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  V4x32 a = {Poisoned<U4>(0, 0xFF0000), Poisoned<U4>(0, 0xFFFF0000),
38586a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines             S2_max + 100, 4};
38596a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  V4x32 b = {Poisoned<U4>(0, 0xFF), S2_max + 10000, Poisoned<U4>(0, 0xFF00),
38606a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines             S2_max};
38616a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines
38626a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  V8x16 c = _mm_packs_epi32(a, b);
38636a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines
38646a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_POISONED(c[0]);
38656a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_POISONED(c[1]);
38666a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_NOT_POISONED(c[2]);
38676a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_NOT_POISONED(c[3]);
38686a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_POISONED(c[4]);
38696a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_NOT_POISONED(c[5]);
38706a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_POISONED(c[6]);
38716a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_NOT_POISONED(c[7]);
38726a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines
38736a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_EQ(c[2], S2_max);
38746a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_EQ(c[3], 4);
38756a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_EQ(c[5], S2_max);
38766a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_EQ(c[7], S2_max);
38776a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines}
38786a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines
38796a211c5814e25d6745a5058cc0e499e5235d3821Stephen HinesTEST(VectorPackTest, mmx_packuswb) {
38806a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  const unsigned U1_max = (1 << 8) - 1;
38816a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  V4x16 a = {Poisoned<U2>(0, 0xFF00), Poisoned<U2>(0, 0xF000U), U1_max + 100,
38826a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines             4};
38836a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  V4x16 b = {Poisoned<U2>(0, 0xFF), U1_max - 1, Poisoned<U2>(0, 0xF), U1_max};
38846a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  V8x8 c = _mm_packs_pu16(a, b);
38856a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines
38866a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_POISONED(c[0]);
38876a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_POISONED(c[1]);
38886a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_NOT_POISONED(c[2]);
38896a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_NOT_POISONED(c[3]);
38906a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_POISONED(c[4]);
38916a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_NOT_POISONED(c[5]);
38926a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_POISONED(c[6]);
38936a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_NOT_POISONED(c[7]);
38946a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines
38956a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_EQ(c[2], U1_max);
38966a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_EQ(c[3], 4);
38976a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_EQ(c[5], U1_max - 1);
38986a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_EQ(c[7], U1_max);
38996a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines}
39006a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines
39016a211c5814e25d6745a5058cc0e499e5235d3821Stephen HinesTEST(VectorSadTest, sse2_psad_bw) {
39026a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  V16x8 a = {Poisoned<U1>(), 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
39036a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  V16x8 b = {100, 101, 102, 103, 104, 105, 106, 107,
39046a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines             108, 109, 110, 111, 112, 113, 114, 115};
39056a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  V2x64 c = _mm_sad_epu8(a, b);
39066a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines
39076a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_POISONED(c[0]);
39086a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_NOT_POISONED(c[1]);
39096a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines
39106a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_EQ(800U, c[1]);
39116a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines}
39126a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines
39136a211c5814e25d6745a5058cc0e499e5235d3821Stephen HinesTEST(VectorMaddTest, mmx_pmadd_wd) {
39146a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  V4x16 a = {Poisoned<U2>(), 1, 2, 3};
39156a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  V4x16 b = {100, 101, 102, 103};
39166a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  V2x32 c = _mm_madd_pi16(a, b);
39176a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines
39186a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_POISONED(c[0]);
39196a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_NOT_POISONED(c[1]);
39206a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines
39216a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_EQ((unsigned)(2 * 102 + 3 * 103), c[1]);
39226a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines}
39236a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines#endif  // defined(__clang__)
39242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
39250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, SetGet) {
392686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  EXPECT_EQ(TrackingOrigins(), !!__msan_get_track_origins());
39270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
39280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int x;
39290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(&x, sizeof(x), 1234);
393086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  EXPECT_ORIGIN(1234U, __msan_get_origin(&x));
39310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(&x, sizeof(x), 5678);
393286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  EXPECT_ORIGIN(5678U, __msan_get_origin(&x));
39330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(&x, sizeof(x), 0);
393486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  EXPECT_ORIGIN(0U, __msan_get_origin(&x));
39350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
39360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
39370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovnamespace {
39380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct S {
39390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U4 dummy;
39400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U2 a;
39410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U2 b;
39420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
39430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
394486277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST(MemorySanitizerOrigins, InitializedStoreDoesNotChangeOrigin) {
39450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
39460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
39470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S s;
3948250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  U4 origin = rand();  // NOLINT
39490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  s.a = *GetPoisonedO<U2>(0, origin);
395086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  EXPECT_ORIGIN(origin, __msan_get_origin(&s.a));
395186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  EXPECT_ORIGIN(origin, __msan_get_origin(&s.b));
39520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
39530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  s.b = 42;
395486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  EXPECT_ORIGIN(origin, __msan_get_origin(&s.a));
395586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  EXPECT_ORIGIN(origin, __msan_get_origin(&s.b));
39560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
39570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}  // namespace
39580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
39590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T, class BinaryOp>
39600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovINLINE
39610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovvoid BinaryOpOriginTest(BinaryOp op) {
3962250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  U4 ox = rand();  //NOLINT
3963250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  U4 oy = rand();  //NOLINT
39640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *x = GetPoisonedO<T>(0, ox, 0);
39650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *y = GetPoisonedO<T>(1, oy, 0);
39660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *z = GetPoisonedO<T>(2, 0, 0);
39670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
39680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *z = op(*x, *y);
3969250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  U4 origin = __msan_get_origin(z);
397011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*z, origin);
397186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  EXPECT_EQ(true, __msan_origin_is_descendant_or_same(origin, ox) ||
397286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines                      __msan_origin_is_descendant_or_same(origin, oy));
39730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
39740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // y is poisoned, x is not.
39750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *x = 10101;
39760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *y = *GetPoisonedO<T>(1, oy);
397712c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(x);
39780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(z, sizeof(*z), 0);
39790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *z = op(*x, *y);
398011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*z, oy);
398186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  EXPECT_ORIGIN(oy, __msan_get_origin(z));
39820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
39830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // x is poisoned, y is not.
39840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *x = *GetPoisonedO<T>(0, ox);
39850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *y = 10101010;
398612c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(y);
39870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(z, sizeof(*z), 0);
39880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *z = op(*x, *y);
398911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*z, ox);
399086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  EXPECT_ORIGIN(ox, __msan_get_origin(z));
39910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
39920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
39930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> INLINE T XOR(const T &a, const T&b) { return a ^ b; }
39940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> INLINE T ADD(const T &a, const T&b) { return a + b; }
39950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> INLINE T SUB(const T &a, const T&b) { return a - b; }
39960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> INLINE T MUL(const T &a, const T&b) { return a * b; }
39970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> INLINE T AND(const T &a, const T&b) { return a & b; }
39980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> INLINE T OR (const T &a, const T&b) { return a | b; }
39990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
40000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, BinaryOp) {
40010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
40020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<S8>(XOR<S8>);
40030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<U8>(ADD<U8>);
40040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<S4>(SUB<S4>);
40050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<S4>(MUL<S4>);
40060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<U4>(OR<U4>);
40070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<U4>(AND<U4>);
40080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<double>(ADD<U4>);
40090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<float>(ADD<S4>);
40100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<double>(ADD<double>);
40110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<float>(ADD<double>);
40120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
40130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
40140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, Unary) {
40150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
401611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S8>(0, __LINE__), __LINE__);
401711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S8>(0, __LINE__), __LINE__);
401811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S8>(0, __LINE__), __LINE__);
401911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S8>(0, __LINE__), __LINE__);
40200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
402111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__);
402211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__);
402311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__);
402411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__);
40250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
402611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<U4>(0, __LINE__), __LINE__);
402711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<U4>(0, __LINE__), __LINE__);
402811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<U4>(0, __LINE__), __LINE__);
402911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<U4>(0, __LINE__), __LINE__);
40300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
403111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__);
403211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__);
403311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__);
403411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__);
40350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
403611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O((void*)*GetPoisonedO<S8>(0, __LINE__), __LINE__);
403711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O((U8)*GetPoisonedO<void*>(0, __LINE__), __LINE__);
40380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
40390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
40400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, EQ) {
40410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
404211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__) <= 11, __LINE__);
404311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__) == 11, __LINE__);
404411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<float>(0, __LINE__) == 1.1, __LINE__);
40450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
40460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
40470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, DIV) {
40480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
404911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<U8>(0, __LINE__) / 100, __LINE__);
405011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  unsigned o = __LINE__;
405111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_UMR_O(volatile unsigned y = 100 / *GetPoisonedO<S4>(0, o, 1), o);
40520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
40530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
40540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, SHIFT) {
40550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
405611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<U8>(0, __LINE__) >> 10, __LINE__);
405711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S8>(0, __LINE__) >> 10, __LINE__);
405811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S8>(0, __LINE__) << 10, __LINE__);
405911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(10U << *GetPoisonedO<U8>(0, __LINE__), __LINE__);
406011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(-10 >> *GetPoisonedO<S8>(0, __LINE__), __LINE__);
406111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(-10 << *GetPoisonedO<S8>(0, __LINE__), __LINE__);
40620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
40630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
40640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T, int N>
40650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovvoid MemCpyTest() {
40660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int ox = __LINE__;
40670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *x = new T[N];
40680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *y = new T[N];
40690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *z = new T[N];
4070353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy Stepanov  T *q = new T[N];
40710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(x, N * sizeof(T));
40720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(x, N * sizeof(T), ox);
40730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(y, N * sizeof(T), 777777);
40740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(z, N * sizeof(T), 888888);
407511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x);
407611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  memcpy(y, x, N * sizeof(T));
407711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(y[0], ox);
407811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(y[N/2], ox);
407911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(y[N-1], ox);
408011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x);
4081353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy Stepanov  void *res = mempcpy(q, x, N * sizeof(T));
4082353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy Stepanov  ASSERT_EQ(q + N, res);
4083353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy Stepanov  EXPECT_POISONED_O(q[0], ox);
4084353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy Stepanov  EXPECT_POISONED_O(q[N/2], ox);
4085353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy Stepanov  EXPECT_POISONED_O(q[N-1], ox);
4086353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy Stepanov  EXPECT_NOT_POISONED(x);
408711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  memmove(z, x, N * sizeof(T));
408811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(z[0], ox);
408911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(z[N/2], ox);
409011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(z[N-1], ox);
40910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
40920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
40930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, LargeMemCpy) {
40940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
40950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  MemCpyTest<U1, 10000>();
40960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  MemCpyTest<U8, 10000>();
40970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
40980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
40990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, SmallMemCpy) {
41000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
41010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  MemCpyTest<U8, 1>();
41020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  MemCpyTest<U8, 2>();
41030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  MemCpyTest<U8, 3>();
41040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
41050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
41060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, Select) {
41070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
410811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(g_one ? 1 : *GetPoisonedO<S4>(0, __LINE__));
410911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__);
41100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 x;
411112c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&x);
41120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x = g_1 ? *GetPoisonedO<S4>(0, __LINE__) : 0;
41130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
411411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(g_1 ? *GetPoisonedO<S4>(0, __LINE__) : 1, __LINE__);
411511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(g_0 ? 1 : *GetPoisonedO<S4>(0, __LINE__), __LINE__);
41160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
41170231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4118250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy StepanovNOINLINE int RetvalOriginTest(U4 origin) {
41190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int *a = new int;
412012c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(a);
41210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(a, sizeof(*a), origin);
41220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = *a;
41230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete a;
41240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return res;
41250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
41260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
41270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, Retval) {
41280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
412911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(RetvalOriginTest(__LINE__), __LINE__);
41300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
41310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4132250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy StepanovNOINLINE void ParamOriginTest(int param, U4 origin) {
413311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(param, origin);
41340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
41350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
41360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, Param) {
41370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
41380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int *a = new int;
4139250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  U4 origin = __LINE__;
414012c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(a);
41410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(a, sizeof(*a), origin);
41420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ParamOriginTest(*a, origin);
41430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete a;
41440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
41450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
41460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, Invoke) {
41470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
41480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StructWithDtor s;  // Will cause the calls to become invokes.
414911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(RetvalOriginTest(__LINE__), __LINE__);
41500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
41510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
41520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, strlen) {
41530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S8 alignment;
415412c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&alignment);
41550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char x[4] = {'a', 'b', 0, 0};
41560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&x[2], 1);
4157250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  U4 origin = __LINE__;
41580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(x, sizeof(x), origin);
415911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_UMR_O(volatile unsigned y = strlen(x), origin);
41600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
41610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
41620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, wcslen) {
41630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  wchar_t w[3] = {'a', 'b', 0};
4164250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  U4 origin = __LINE__;
41650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(w, sizeof(w), origin);
41660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&w[2], sizeof(wchar_t));
416711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_UMR_O(volatile unsigned y = wcslen(w), origin);
41680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
41690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
41700231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#if MSAN_HAS_M128
41710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, StoreIntrinsic) {
41720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __m128 x, y;
4173250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  U4 origin = __LINE__;
41740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(&x, sizeof(x), origin);
41750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&x, sizeof(x));
41760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __builtin_ia32_storeups((float*)&y, x);
417711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(y, origin);
41780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
41790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#endif
41800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
41810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE void RecursiveMalloc(int depth) {
41820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  static int count;
41830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  count++;
41840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if ((count % (1024 * 1024)) == 0)
41850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    printf("RecursiveMalloc: %d\n", count);
41860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int *x1 = new int;
41870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int *x2 = new int;
418812c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(x1);
418912c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(x2);
41900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (depth > 0) {
41910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    RecursiveMalloc(depth-1);
41920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    RecursiveMalloc(depth-1);
41930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  }
41940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete x1;
41950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete x2;
41960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
41970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4198204060453c823f027815cfe6d449bbd5c4f39f7fEvgeniy StepanovTEST(MemorySanitizer, Select) {
4199204060453c823f027815cfe6d449bbd5c4f39f7fEvgeniy Stepanov  int x;
4200204060453c823f027815cfe6d449bbd5c4f39f7fEvgeniy Stepanov  int volatile* p = &x;
4201204060453c823f027815cfe6d449bbd5c4f39f7fEvgeniy Stepanov  int z = *p ? 1 : 0;
4202204060453c823f027815cfe6d449bbd5c4f39f7fEvgeniy Stepanov  EXPECT_POISONED(z);
4203204060453c823f027815cfe6d449bbd5c4f39f7fEvgeniy Stepanov}
4204204060453c823f027815cfe6d449bbd5c4f39f7fEvgeniy Stepanov
42052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, SelectPartial) {
42062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  // Precise instrumentation of select.
42072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  // Some bits of the result do not depend on select condition, and must stay
42082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  // initialized even if select condition is not. These are the bits that are
42092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  // equal and initialized in both left and right select arguments.
42102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 x = 0xFFFFABCDU;
42112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 x_s = 0xFFFF0000U;
42122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_partial_poison(&x, &x_s, sizeof(x));
42132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 y = 0xAB00U;
42142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U1 cond = true;
42152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_poison(&cond, sizeof(cond));
42162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 z = cond ? x : y;
42172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_print_shadow(&z, sizeof(z));
42182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(z & 0xFFU);
42192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(z & 0xFF00U);
42202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(z & 0xFF0000U);
42212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(z & 0xFF000000U);
42222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_EQ(0xAB00U, z & 0xFF00U);
42232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
42242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
42250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerStress, DISABLED_MallocStackTrace) {
42260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  RecursiveMalloc(22);
42270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
42285c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov
42295c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy StepanovTEST(MemorySanitizerAllocator, get_estimated_allocated_size) {
42305c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  size_t sizes[] = {0, 20, 5000, 1<<20};
42315c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  for (size_t i = 0; i < sizeof(sizes) / sizeof(*sizes); ++i) {
42326a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines    size_t alloc_size = __sanitizer_get_estimated_allocated_size(sizes[i]);
42335c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov    EXPECT_EQ(alloc_size, sizes[i]);
42345c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  }
42355c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov}
42365c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov
42375c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy StepanovTEST(MemorySanitizerAllocator, get_allocated_size_and_ownership) {
42385c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  char *array = reinterpret_cast<char*>(malloc(100));
42395c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  int *int_ptr = new int;
42405c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov
42416a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_TRUE(__sanitizer_get_ownership(array));
42426a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_EQ(100U, __sanitizer_get_allocated_size(array));
42435c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov
42446a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_TRUE(__sanitizer_get_ownership(int_ptr));
42456a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_EQ(sizeof(*int_ptr), __sanitizer_get_allocated_size(int_ptr));
42465c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov
42475c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  void *wild_addr = reinterpret_cast<void*>(0x1);
42486a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_FALSE(__sanitizer_get_ownership(wild_addr));
42496a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_EQ(0U, __sanitizer_get_allocated_size(wild_addr));
42506a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines
42516a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_FALSE(__sanitizer_get_ownership(array + 50));
42526a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_EQ(0U, __sanitizer_get_allocated_size(array + 50));
42535c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov
42546a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  // NULL is a valid argument for GetAllocatedSize but is not owned.
42556a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_FALSE(__sanitizer_get_ownership(NULL));
42566a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_EQ(0U, __sanitizer_get_allocated_size(NULL));
42575c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov
42585c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  free(array);
42596a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_FALSE(__sanitizer_get_ownership(array));
42606a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines  EXPECT_EQ(0U, __sanitizer_get_allocated_size(array));
42615c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov
42625c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  delete int_ptr;
42635c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov}
4264548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov
4265548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy StepanovTEST(MemorySanitizer, MlockTest) {
4266548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov  EXPECT_EQ(0, mlockall(MCL_CURRENT));
4267548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov  EXPECT_EQ(0, mlock((void*)0x12345, 0x5678));
4268548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov  EXPECT_EQ(0, munlockall());
4269548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov  EXPECT_EQ(0, munlock((void*)0x987, 0x654));
4270548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov}
42712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
42722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// Test that LargeAllocator unpoisons memory before releasing it to the OS.
42732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, LargeAllocatorUnpoisonsOnFree) {
42742d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  void *p = malloc(1024 * 1024);
42752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  free(p);
42762d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
42772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  typedef void *(*mmap_fn)(void *, size_t, int, int, int, off_t);
42782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  mmap_fn real_mmap = (mmap_fn)dlsym(RTLD_NEXT, "mmap");
42792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
42802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  // Allocate the page that was released to the OS in free() with the real mmap,
42812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  // bypassing the interceptor.
428286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  char *q = (char *)real_mmap(p, 4096, PROT_READ | PROT_WRITE,
428386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines                              MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
42842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_NE((char *)0, q);
42852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
42862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(q <= p);
42872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(q + 4096 > p);
42882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
42892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(q[0]);
42902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(q[10]);
42912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(q[100]);
42922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
42932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  munmap(q, 4096);
42942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
42952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
42962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#if SANITIZER_TEST_HAS_MALLOC_USABLE_SIZE
42972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, MallocUsableSizeTest) {
42982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  const size_t kArraySize = 100;
42992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  char *array = Ident((char*)malloc(kArraySize));
43002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  int *int_ptr = Ident(new int);
43012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_EQ(0U, malloc_usable_size(NULL));
43022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_EQ(kArraySize, malloc_usable_size(array));
43032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_EQ(sizeof(int), malloc_usable_size(int_ptr));
43042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  free(array);
43052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  delete int_ptr;
43062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
43072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif  // SANITIZER_TEST_HAS_MALLOC_USABLE_SIZE
4308