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
215d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#include "sanitizer/allocator_interface.h"
220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include "sanitizer/msan_interface.h"
230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include "msandr_test_so.h"
240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
25ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#include <inttypes.h>
260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <stdlib.h>
270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <stdarg.h>
280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <stdio.h>
290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <wchar.h>
307cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov#include <math.h>
3197160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov#include <malloc.h>
320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
339530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov#include <arpa/inet.h>
34e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov#include <dlfcn.h>
35103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov#include <grp.h>
360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <unistd.h>
372bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov#include <link.h>
380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <limits.h>
390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <sys/time.h>
40e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov#include <poll.h>
410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <sys/types.h>
420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <sys/stat.h>
430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <fcntl.h>
440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <sys/resource.h>
450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <sys/ioctl.h>
465cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov#include <sys/statvfs.h>
47359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov#include <sys/sysinfo.h>
480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <sys/utsname.h>
490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <sys/mman.h>
500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <sys/vfs.h>
51d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov#include <dirent.h>
52e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#include <pwd.h>
53134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov#include <sys/socket.h>
540a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov#include <netdb.h>
55c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov#include <wordexp.h>
564d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov#include <mntent.h>
57369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov#include <netinet/ether.h>
5810362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov#include <sys/ipc.h>
5910362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov#include <sys/shm.h>
600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#if defined(__i386__) || defined(__x86_64__)
620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov# include <emmintrin.h>
630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov# define MSAN_HAS_M128 1
640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#else
650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov# define MSAN_HAS_M128 0
660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#endif
670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#ifdef __AVX2__
692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines# include <immintrin.h>
702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif
712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesstatic const size_t kPageSize = 4096;
7397160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov
740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef unsigned char      U1;
750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef unsigned short     U2;  // NOLINT
760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef unsigned int       U4;
770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef unsigned long long U8;  // NOLINT
780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef   signed char      S1;
790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef   signed short     S2;  // NOLINT
800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef   signed int       S4;
810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef   signed long long S8;  // NOLINT
820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#define NOINLINE      __attribute__((noinline))
830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#define INLINE      __attribute__((always_inline))
840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
8511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovstatic bool TrackingOrigins() {
8611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  S8 x;
8711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  __msan_set_origin(&x, sizeof(x), 0x1234);
88250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  U4 origin = __msan_get_origin(&x);
8911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  __msan_set_origin(&x, sizeof(x), 0);
9011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  return origin == 0x1234;
9111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov}
920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
9311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov#define EXPECT_UMR(action) \
940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    do {                        \
950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      __msan_set_expect_umr(1); \
960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      action;                   \
970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      __msan_set_expect_umr(0); \
980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    } while (0)
990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
10011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov#define EXPECT_UMR_O(action, origin) \
1010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    do {                                            \
1020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      __msan_set_expect_umr(1);                     \
1030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      action;                                       \
1040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      __msan_set_expect_umr(0);                     \
1050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      if (TrackingOrigins())                        \
10612c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov        EXPECT_EQ(origin, __msan_get_umr_origin()); \
1070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    } while (0)
1080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
10911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov#define EXPECT_POISONED(x) ExpectPoisoned(x)
11011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
11111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovtemplate<typename T>
11211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovvoid ExpectPoisoned(const T& t) {
11311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NE(-1, __msan_test_shadow((void*)&t, sizeof(t)));
11411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov}
11511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
11611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov#define EXPECT_POISONED_O(x, origin) \
11711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  ExpectPoisonedWithOrigin(x, origin)
11811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
11911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovtemplate<typename T>
12011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovvoid ExpectPoisonedWithOrigin(const T& t, unsigned origin) {
12111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NE(-1, __msan_test_shadow((void*)&t, sizeof(t)));
12211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  if (TrackingOrigins())
12311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov    EXPECT_EQ(origin, __msan_get_origin((void*)&t));
12411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov}
12511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
12611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov#define EXPECT_NOT_POISONED(x) ExpectNotPoisoned(x)
12711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
12811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovtemplate<typename T>
12911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovvoid ExpectNotPoisoned(const T& t) {
13011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_EQ(-1, __msan_test_shadow((void*)&t, sizeof(t)));
13111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov}
1320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
1330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic U8 poisoned_array[100];
1340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T>
1350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovT *GetPoisoned(int i = 0, T val = 0) {
1360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *res = (T*)&poisoned_array[i];
1370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *res = val;
1380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&poisoned_array[i], sizeof(T));
1390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return res;
1400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
1410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
1420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T>
143250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy StepanovT *GetPoisonedO(int i, U4 origin, T val = 0) {
1440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *res = (T*)&poisoned_array[i];
1450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *res = val;
1460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&poisoned_array[i], sizeof(T));
1470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(&poisoned_array[i], sizeof(T), origin);
1480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return res;
1490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
1500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
1515d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinestemplate<typename T>
1525d71de26cedae3dafc17449fe0182045c0bd20e8Stephen HinesT Poisoned(T v = 0, T s = (T)(-1)) {
1535d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  __msan_partial_poison(&v, &s, sizeof(T));
1545d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  return v;
1555d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines}
1565d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
1570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> NOINLINE T ReturnPoisoned() { return *GetPoisoned<T>(); }
1580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
1590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic volatile int g_one = 1;
1600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic volatile int g_zero = 0;
1610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic volatile int g_0 = 0;
1620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic volatile int g_1 = 1;
1630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
1640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovS4 a_s4[100];
1650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovS8 a_s8[100];
1660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
16712c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov// Check that malloc poisons memory.
16812c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov// A lot of tests below depend on this.
16912c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy StepanovTEST(MemorySanitizerSanity, PoisonInMalloc) {
17012c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  int *x = (int*)malloc(sizeof(int));
17112c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  EXPECT_POISONED(*x);
17212c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  free(x);
17312c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov}
17412c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov
1750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, NegativeTest1) {
1760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 *x = GetPoisoned<S4>();
1770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (g_one)
1780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    *x = 0;
17911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*x);
1800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
1810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
1820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, PositiveTest1) {
1830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // Load to store.
18411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S1>());
18511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S2>());
18611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S4>());
18711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S8>());
1880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
1890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // S->S conversions.
19011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S1>());
19111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S1>());
19211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S1>());
1930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
19411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S2>());
19511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S2>());
19611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S2>());
1970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
19811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S4>());
19911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S4>());
20011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S4>());
2010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
20211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S8>());
20311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S8>());
20411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S8>());
2050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // ZExt
20711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<U1>());
20811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<U1>());
20911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<U1>());
21011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<U2>());
21111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<U2>());
21211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<U4>());
2130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // Unary ops.
21511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(- *GetPoisoned<S4>());
2160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
21711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_UMR(a_s4[g_zero] = 100 / *GetPoisoned<S4>(0, 1));
2180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  a_s4[g_zero] = 1 - *GetPoisoned<S4>();
2210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  a_s4[g_zero] = 1 + *GetPoisoned<S4>();
2220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
2230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Phi1) {
2250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 c;
2260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (g_one) {
2270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    c = *GetPoisoned<S4>();
2280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  } else {
22912c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov    break_optimization(0);
2300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    c = 0;
2310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  }
23211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(c);
2330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
2340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Phi2) {
2360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 i = *GetPoisoned<S4>();
2370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 n = g_one;
23811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_UMR(for (; i < g_one; i++););
23911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(i);
2400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
2410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
24211929000ec2919192b3be457f5a44c71ed55215eEvgeniy StepanovNOINLINE void Arg1ExpectUMR(S4 a1) { EXPECT_POISONED(a1); }
24311929000ec2919192b3be457f5a44c71ed55215eEvgeniy StepanovNOINLINE void Arg2ExpectUMR(S4 a1, S4 a2) { EXPECT_POISONED(a2); }
24411929000ec2919192b3be457f5a44c71ed55215eEvgeniy StepanovNOINLINE void Arg3ExpectUMR(S1 a1, S4 a2, S8 a3) { EXPECT_POISONED(a3); }
2450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, ArgTest) {
2470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  Arg1ExpectUMR(*GetPoisoned<S4>());
2480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  Arg2ExpectUMR(0, *GetPoisoned<S4>());
2490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  Arg3ExpectUMR(0, 1, *GetPoisoned<S8>());
2500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
2510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, CallAndRet) {
2540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!__msan_has_dynamic_component()) return;
2550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ReturnPoisoned<S1>();
2560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ReturnPoisoned<S2>();
2570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ReturnPoisoned<S4>();
2580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ReturnPoisoned<S8>();
2590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
26011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(ReturnPoisoned<S1>());
26111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(ReturnPoisoned<S2>());
26211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(ReturnPoisoned<S4>());
26311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(ReturnPoisoned<S8>());
2640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
2650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// malloc() in the following test may be optimized to produce a compile-time
2670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// undef value. Check that we trap on the volatile assignment anyway.
2680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, DISABLED_MallocNoIdent) {
2690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 *x = (int*)malloc(sizeof(S4));
27011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*x);
2710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  free(x);
2720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
2730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Malloc) {
2750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 *x = (int*)Ident(malloc(sizeof(S4)));
27611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*x);
2770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  free(x);
2780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
2790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Realloc) {
2810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 *x = (int*)Ident(realloc(0, sizeof(S4)));
28211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(x[0]);
2830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[0] = 1;
2840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x = (int*)Ident(realloc(x, 2 * sizeof(S4)));
28511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);  // Ok, was inited before.
28611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(x[1]);
2870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x = (int*)Ident(realloc(x, 3 * sizeof(S4)));
28811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);  // Ok, was inited before.
28911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(x[2]);
29011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(x[1]);
2910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[2] = 1;  // Init this here. Check that after realloc it is poisoned again.
2920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x = (int*)Ident(realloc(x, 2 * sizeof(S4)));
29311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);  // Ok, was inited before.
29411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(x[1]);
2950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x = (int*)Ident(realloc(x, 3 * sizeof(S4)));
29611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(x[1]);
29711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(x[2]);
2980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  free(x);
2990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
3000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
3010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Calloc) {
3020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 *x = (int*)Ident(calloc(1, sizeof(S4)));
30311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*x);  // Should not be poisoned.
3042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_EQ(0, *x);
3050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  free(x);
3060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
3070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
3082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, CallocReturnsZeroMem) {
3092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  size_t sizes[] = {16, 1000, 10000, 100000, 2100000};
3102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  for (size_t s = 0; s < sizeof(sizes)/sizeof(sizes[0]); s++) {
3112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    size_t size = sizes[s];
3122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    for (size_t iter = 0; iter < 5; iter++) {
3132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      char *x = Ident((char*)calloc(1, size));
3142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      EXPECT_EQ(x[0], 0);
3152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      EXPECT_EQ(x[size - 1], 0);
3162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      EXPECT_EQ(x[size / 2], 0);
3172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      EXPECT_EQ(x[size / 3], 0);
3182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      EXPECT_EQ(x[size / 4], 0);
3192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      memset(x, 0x42, size);
3202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      free(Ident(x));
3212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    }
3222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  }
3232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
3242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
3250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, AndOr) {
3260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U4 *p = GetPoisoned<U4>();
3270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // We poison two bytes in the midle of a 4-byte word to make the test
3280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // correct regardless of endianness.
3290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ((U1*)p)[1] = 0;
3300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ((U1*)p)[2] = 0xff;
33111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*p & 0x00ffff00);
33211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*p & 0x00ff0000);
33311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*p & 0x0000ff00);
33411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*p & 0xff000000);
33511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*p & 0x000000ff);
33611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*p & 0x0000ffff);
33711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*p & 0xffff0000);
3380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
33911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*p | 0xff0000ff);
34011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*p | 0xff00ffff);
34111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*p | 0xffff00ff);
34211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*p | 0xff000000);
34311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*p | 0x000000ff);
34411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*p | 0x0000ffff);
34511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*p | 0xffff0000);
3460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
34711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<bool>() & *GetPoisoned<bool>());
3480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
3490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
3500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T>
35111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovstatic bool applyNot(T value, T shadow) {
3520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_partial_poison(&value, &shadow, sizeof(T));
35311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  return !value;
3540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
3550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
3560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Not) {
35711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U4>(0x0, 0x0));
35811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U4>(0xFFFFFFFF, 0x0));
35911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(applyNot<U4>(0xFFFFFFFF, 0xFFFFFFFF));
36011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U4>(0xFF000000, 0x0FFFFFFF));
36111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U4>(0xFF000000, 0x00FFFFFF));
36211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U4>(0xFF000000, 0x0000FFFF));
36311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U4>(0xFF000000, 0x00000000));
36411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(applyNot<U4>(0xFF000000, 0xFF000000));
36511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U4>(0xFF800000, 0xFF000000));
36611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(applyNot<U4>(0x00008000, 0x00008000));
36711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
36811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U1>(0x0, 0x0));
36911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U1>(0xFF, 0xFE));
37011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U1>(0xFF, 0x0));
37111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(applyNot<U1>(0xFF, 0xFF));
37211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
37311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(applyNot<void*>((void*)0xFFFFFF, (void*)(-1)));
37411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<void*>((void*)0xFFFFFF, (void*)(-2)));
3750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
3760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
3770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Shift) {
3780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U4 *up = GetPoisoned<U4>();
3790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ((U1*)up)[0] = 0;
3800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ((U1*)up)[3] = 0xff;
38111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*up >> 30);
38211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*up >> 24);
38311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*up >> 23);
38411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*up >> 10);
3850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
38611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*up << 30);
38711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*up << 24);
38811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*up << 23);
38911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*up << 10);
3900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
3910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 *sp = (S4*)up;
39211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*sp >> 30);
39311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*sp >> 24);
39411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*sp >> 23);
39511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*sp >> 10);
3960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
3970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  sp = GetPoisoned<S4>();
3980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ((S1*)sp)[1] = 0;
3990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ((S1*)sp)[2] = 0;
40011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*sp >> 31);
4010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
40211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(100 >> *GetPoisoned<S4>());
40311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(100U >> *GetPoisoned<S4>());
4040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE static int GetPoisonedZero() {
4070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int *zero = new int;
4080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *zero = 0;
4090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(zero, sizeof(*zero));
4100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = *zero;
4110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete zero;
4120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return res;
4130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, LoadFromDirtyAddress) {
4160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int *a = new int;
4170231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *a = 0;
41812c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  EXPECT_UMR(break_optimization((void*)(U8)a[GetPoisonedZero()]));
4190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete a;
4200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, StoreToDirtyAddress) {
4230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int *a = new int;
42411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_UMR(a[GetPoisonedZero()] = 0);
42512c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(a);
4260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete a;
4270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE void StackTestFunc() {
4310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 p4;
4320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 ok4 = 1;
4330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S2 p2;
4340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S2 ok2 = 1;
4350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S1 p1;
4360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S1 ok1 = 1;
43712c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&p4);
43812c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&ok4);
43912c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&p2);
44012c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&ok2);
44112c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&p1);
44212c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&ok1);
4430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
44411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(p4);
44511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(p2);
44611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(p1);
44711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(ok1);
44811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(ok2);
44911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(ok4);
4500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, StackTest) {
4530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StackTestFunc();
4540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE void StackStressFunc() {
4570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int foo[10000];
45812c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(foo);
4590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, DISABLED_StackStressTest) {
4620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  for (int i = 0; i < 1000000; i++)
4630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    StackStressFunc();
4640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T>
4670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovvoid TestFloatingPoint() {
4680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  static volatile T v;
4690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  static T g[100];
47012c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&g);
4710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *x = GetPoisoned<T>();
4720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *y = GetPoisoned<T>(1);
47311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*x);
47411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED((long long)*x);
47511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED((int)*x);
4760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  g[0] = *x;
4770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  g[1] = *x + *y;
4780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  g[2] = *x - *y;
4790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  g[3] = *x * *y;
4800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, FloatingPointTest) {
4830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestFloatingPoint<float>();
4840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestFloatingPoint<double>();
4850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, DynMem) {
4880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 x = 0;
4890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 *y = GetPoisoned<S4>();
4900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  memcpy(y, &x, g_one * sizeof(S4));
49111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*y);
4920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic char *DynRetTestStr;
4950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, DynRet) {
4970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!__msan_has_dynamic_component()) return;
4980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ReturnPoisoned<S8>();
49911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(clearenv());
5000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
5010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, DynRet1) {
5040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!__msan_has_dynamic_component()) return;
5050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ReturnPoisoned<S8>();
5060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
5070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct LargeStruct {
5090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 x[10];
5100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
5110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE
5130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovLargeStruct LargeRetTest() {
5140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  LargeStruct res;
5150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[0] = *GetPoisoned<S4>();
5160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[1] = *GetPoisoned<S4>();
5170231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[2] = *GetPoisoned<S4>();
5180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[3] = *GetPoisoned<S4>();
5190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[4] = *GetPoisoned<S4>();
5200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[5] = *GetPoisoned<S4>();
5210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[6] = *GetPoisoned<S4>();
5220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[7] = *GetPoisoned<S4>();
5230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[8] = *GetPoisoned<S4>();
5240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[9] = *GetPoisoned<S4>();
5250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return res;
5260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
5270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
52867505a8a0cf9621243ed21b67dfa041224c78e4bAlexey SamsonovTEST(MemorySanitizer, strcmp) {
52967505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov  char s1[10];
53067505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov  char s2[10];
53167505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov  strncpy(s1, "foo", 10);
53267505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov  s2[0] = 'f';
53367505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov  s2[1] = 'n';
53467505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov  EXPECT_GT(strcmp(s1, s2), 0);
53567505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov  s2[1] = 'o';
53667505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov  int res;
53767505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov  EXPECT_UMR(res = strcmp(s1, s2));
53867505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov  EXPECT_NOT_POISONED(res);
53967505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov  EXPECT_EQ(strncmp(s1, s2, 1), 0);
54067505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov}
54167505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov
5420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, LargeRet) {
5430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  LargeStruct a = LargeRetTest();
54411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(a.x[0]);
54511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(a.x[9]);
5460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
5470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5481204979804868728edb6edfe3ae018465191a85cEvgeniy StepanovTEST(MemorySanitizer, strerror) {
5491204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov  char *buf = strerror(EINVAL);
5501204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov  EXPECT_NOT_POISONED(strlen(buf));
5511204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov  buf = strerror(123456);
5521204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov  EXPECT_NOT_POISONED(strlen(buf));
5531204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov}
5541204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov
5551204979804868728edb6edfe3ae018465191a85cEvgeniy StepanovTEST(MemorySanitizer, strerror_r) {
5561204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov  errno = 0;
5571204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov  char buf[1000];
5581204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov  char *res = strerror_r(EINVAL, buf, sizeof(buf));
5591204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov  ASSERT_EQ(0, errno);
5601204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov  if (!res) res = buf; // POSIX version success.
5611204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov  EXPECT_NOT_POISONED(strlen(res));
5621204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov}
5631204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov
5640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, fread) {
5650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char *x = new char[32];
5660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  FILE *f = fopen("/proc/self/stat", "r");
5672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(f != NULL);
5680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  fread(x, 1, 32, f);
56911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);
57011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[16]);
57111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[31]);
5720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  fclose(f);
5730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete x;
5740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
5750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, read) {
5770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char *x = new char[32];
5780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int fd = open("/proc/self/stat", O_RDONLY);
5792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_GT(fd, 0);
5800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int sz = read(fd, x, 32);
5812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(sz, 32);
58211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);
58311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[16]);
58411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[31]);
5850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  close(fd);
5860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete x;
5870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
5880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, pread) {
5900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char *x = new char[32];
5910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int fd = open("/proc/self/stat", O_RDONLY);
5922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_GT(fd, 0);
5930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int sz = pread(fd, x, 32, 0);
5942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(sz, 32);
59511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);
59611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[16]);
59711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[31]);
5980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  close(fd);
5990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete x;
6000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
6010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
602b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy StepanovTEST(MemorySanitizer, readv) {
603b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  char buf[2011];
604b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  struct iovec iov[2];
605b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  iov[0].iov_base = buf + 1;
606b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  iov[0].iov_len = 5;
607b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  iov[1].iov_base = buf + 10;
608b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  iov[1].iov_len = 2000;
609b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  int fd = open("/proc/self/stat", O_RDONLY);
6102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_GT(fd, 0);
611b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  int sz = readv(fd, iov, 2);
6122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_GE(sz, 0);
613b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  ASSERT_LT(sz, 5 + 2000);
6142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_GT((size_t)sz, iov[0].iov_len);
615b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_POISONED(buf[0]);
616b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[1]);
617b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[5]);
618b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_POISONED(buf[6]);
619b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_POISONED(buf[9]);
620b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[10]);
621b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[10 + (sz - 1) - 5]);
622b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_POISONED(buf[11 + (sz - 1) - 5]);
623b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  close(fd);
624b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov}
625b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov
626b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy StepanovTEST(MemorySanitizer, preadv) {
627b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  char buf[2011];
628b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  struct iovec iov[2];
629b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  iov[0].iov_base = buf + 1;
630b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  iov[0].iov_len = 5;
631b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  iov[1].iov_base = buf + 10;
632b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  iov[1].iov_len = 2000;
633b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  int fd = open("/proc/self/stat", O_RDONLY);
6342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_GT(fd, 0);
635b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  int sz = preadv(fd, iov, 2, 3);
6362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_GE(sz, 0);
637b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  ASSERT_LT(sz, 5 + 2000);
6382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_GT((size_t)sz, iov[0].iov_len);
639b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_POISONED(buf[0]);
640b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[1]);
641b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[5]);
642b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_POISONED(buf[6]);
643b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_POISONED(buf[9]);
644b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[10]);
645b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[10 + (sz - 1) - 5]);
646b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_POISONED(buf[11 + (sz - 1) - 5]);
647b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  close(fd);
648b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov}
649b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov
6500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// FIXME: fails now.
6510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, DISABLED_ioctl) {
6520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  struct winsize ws;
6530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(ioctl(2, TIOCGWINSZ, &ws), 0);
65411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(ws.ws_col);
6550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
6560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
6570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, readlink) {
6580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char *x = new char[1000];
6590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  readlink("/proc/self/exe", x, 1000);
66011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);
6610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete [] x;
6620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
6630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
6640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
6650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, stat) {
6660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  struct stat* st = new struct stat;
6670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = stat("/proc/self/stat", st);
6682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
66911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(st->st_dev);
67011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(st->st_mode);
67111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(st->st_size);
6720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
6730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
674bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy StepanovTEST(MemorySanitizer, fstatat) {
675bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov  struct stat* st = new struct stat;
676bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov  int dirfd = open("/proc/self", O_RDONLY);
6772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_GT(dirfd, 0);
678bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov  int res = fstatat(dirfd, "stat", st, 0);
6792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
680bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov  EXPECT_NOT_POISONED(st->st_dev);
681bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov  EXPECT_NOT_POISONED(st->st_mode);
682bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov  EXPECT_NOT_POISONED(st->st_size);
683bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov  close(dirfd);
684bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov}
685bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov
6860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, statfs) {
6875cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  struct statfs st;
6885cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  int res = statfs("/", &st);
6892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
6905cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  EXPECT_NOT_POISONED(st.f_type);
6915cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  EXPECT_NOT_POISONED(st.f_bfree);
6925cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  EXPECT_NOT_POISONED(st.f_namelen);
6935cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov}
6945cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov
6955cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy StepanovTEST(MemorySanitizer, statvfs) {
6965cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  struct statvfs st;
6975cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  int res = statvfs("/", &st);
6982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
6995cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  EXPECT_NOT_POISONED(st.f_bsize);
7005cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  EXPECT_NOT_POISONED(st.f_blocks);
7015cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  EXPECT_NOT_POISONED(st.f_bfree);
7025cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  EXPECT_NOT_POISONED(st.f_namemax);
7035cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov}
7045cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov
7055cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy StepanovTEST(MemorySanitizer, fstatvfs) {
7065cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  struct statvfs st;
7075cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  int fd = open("/", O_RDONLY | O_DIRECTORY);
7085cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  int res = fstatvfs(fd, &st);
7092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
7105cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  EXPECT_NOT_POISONED(st.f_bsize);
7115cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  EXPECT_NOT_POISONED(st.f_blocks);
7125cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  EXPECT_NOT_POISONED(st.f_bfree);
7135cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  EXPECT_NOT_POISONED(st.f_namemax);
7145cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  close(fd);
7150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
7160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
7170231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, pipe) {
7180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* pipefd = new int[2];
7190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = pipe(pipefd);
7202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
72111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(pipefd[0]);
72211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(pipefd[1]);
7230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  close(pipefd[0]);
7240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  close(pipefd[1]);
7250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
7260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
727134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy StepanovTEST(MemorySanitizer, pipe2) {
728134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov  int* pipefd = new int[2];
729134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov  int res = pipe2(pipefd, O_NONBLOCK);
7302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
731134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov  EXPECT_NOT_POISONED(pipefd[0]);
732134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov  EXPECT_NOT_POISONED(pipefd[1]);
733134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov  close(pipefd[0]);
734134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov  close(pipefd[1]);
735134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov}
736134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov
737134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy StepanovTEST(MemorySanitizer, socketpair) {
738134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov  int sv[2];
739134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov  int res = socketpair(AF_UNIX, SOCK_STREAM, 0, sv);
7402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
741134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov  EXPECT_NOT_POISONED(sv[0]);
742134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov  EXPECT_NOT_POISONED(sv[1]);
743134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov  close(sv[0]);
744134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov  close(sv[1]);
745134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov}
746134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov
747e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy StepanovTEST(MemorySanitizer, poll) {
748e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  int* pipefd = new int[2];
749e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  int res = pipe(pipefd);
750e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  ASSERT_EQ(0, res);
751e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov
752e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  char data = 42;
753e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  res = write(pipefd[1], &data, 1);
754e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  ASSERT_EQ(1, res);
755e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov
756e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  pollfd fds[2];
757e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  fds[0].fd = pipefd[0];
758e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  fds[0].events = POLLIN;
759e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  fds[1].fd = pipefd[1];
760e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  fds[1].events = POLLIN;
761e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  res = poll(fds, 2, 500);
762e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  ASSERT_EQ(1, res);
763e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  EXPECT_NOT_POISONED(fds[0].revents);
764e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  EXPECT_NOT_POISONED(fds[1].revents);
765e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov
766e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  close(pipefd[0]);
767e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  close(pipefd[1]);
768e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov}
769e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov
77047177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy StepanovTEST(MemorySanitizer, ppoll) {
77147177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  int* pipefd = new int[2];
77247177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  int res = pipe(pipefd);
77347177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  ASSERT_EQ(0, res);
77447177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov
77547177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  char data = 42;
77647177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  res = write(pipefd[1], &data, 1);
77747177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  ASSERT_EQ(1, res);
77847177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov
77947177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  pollfd fds[2];
78047177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  fds[0].fd = pipefd[0];
78147177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  fds[0].events = POLLIN;
78247177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  fds[1].fd = pipefd[1];
78347177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  fds[1].events = POLLIN;
78447177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  sigset_t ss;
78547177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  sigemptyset(&ss);
78647177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  res = ppoll(fds, 2, NULL, &ss);
78747177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  ASSERT_EQ(1, res);
78847177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  EXPECT_NOT_POISONED(fds[0].revents);
78947177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  EXPECT_NOT_POISONED(fds[1].revents);
79047177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov
79147177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  close(pipefd[0]);
79247177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  close(pipefd[1]);
79347177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov}
79447177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov
795e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy StepanovTEST(MemorySanitizer, poll_positive) {
796e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  int* pipefd = new int[2];
797e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  int res = pipe(pipefd);
798e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  ASSERT_EQ(0, res);
799e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov
800e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  pollfd fds[2];
801e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  fds[0].fd = pipefd[0];
802e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  fds[0].events = POLLIN;
803e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  // fds[1].fd uninitialized
804e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  fds[1].events = POLLIN;
805e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  EXPECT_UMR(poll(fds, 2, 0));
806e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov
807e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  close(pipefd[0]);
808e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  close(pipefd[1]);
809e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov}
810e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov
8119f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy StepanovTEST(MemorySanitizer, bind_getsockname) {
8129f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  int sock = socket(AF_UNIX, SOCK_STREAM, 0);
8139f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov
8149f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  struct sockaddr_in sai;
8159f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  memset(&sai, 0, sizeof(sai));
8169f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  sai.sin_family = AF_UNIX;
8179f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  int res = bind(sock, (struct sockaddr *)&sai, sizeof(sai));
8189f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov
8192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
8209f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  char buf[200];
8219f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  socklen_t addrlen;
8229f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  EXPECT_UMR(getsockname(sock, (struct sockaddr *)&buf, &addrlen));
8239f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov
8249f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  addrlen = sizeof(buf);
8259f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  res = getsockname(sock, (struct sockaddr *)&buf, &addrlen);
8269f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  EXPECT_NOT_POISONED(addrlen);
8279f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[0]);
8289f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[addrlen - 1]);
8299f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  EXPECT_POISONED(buf[addrlen]);
8309f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  close(sock);
8319f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov}
8329f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov
8339d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy StepanovTEST(MemorySanitizer, accept) {
8349d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  int listen_socket = socket(AF_INET, SOCK_STREAM, 0);
8359d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  ASSERT_LT(0, listen_socket);
8369d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov
8379d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  struct sockaddr_in sai;
838ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  memset(&sai, 0, sizeof(sai));
8399d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  sai.sin_family = AF_INET;
8409d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  sai.sin_port = 0;
8419d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  sai.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
8429d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  int res = bind(listen_socket, (struct sockaddr *)&sai, sizeof(sai));
8439d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  ASSERT_EQ(0, res);
8449d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov
8459d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  res = listen(listen_socket, 1);
8469d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  ASSERT_EQ(0, res);
8479d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov
8489d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  socklen_t sz = sizeof(sai);
8499d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  res = getsockname(listen_socket, (struct sockaddr *)&sai, &sz);
8509d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  ASSERT_EQ(0, res);
8519d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  ASSERT_EQ(sizeof(sai), sz);
852bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov
8539d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  int connect_socket = socket(AF_INET, SOCK_STREAM, 0);
8549d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  ASSERT_LT(0, connect_socket);
8559d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  res = fcntl(connect_socket, F_SETFL, O_NONBLOCK);
8569d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  ASSERT_EQ(0, res);
8579d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  res = connect(connect_socket, (struct sockaddr *)&sai, sizeof(sai));
8589d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  ASSERT_EQ(-1, res);
8599d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  ASSERT_EQ(EINPROGRESS, errno);
8609d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov
8619d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  __msan_poison(&sai, sizeof(sai));
862bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov  int new_sock = accept(listen_socket, (struct sockaddr *)&sai, &sz);
8639d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  ASSERT_LT(0, new_sock);
8649d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  ASSERT_EQ(sizeof(sai), sz);
8659d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  EXPECT_NOT_POISONED(sai);
8669d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov
867bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov  __msan_poison(&sai, sizeof(sai));
868bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov  res = getpeername(new_sock, (struct sockaddr *)&sai, &sz);
869bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov  ASSERT_EQ(0, res);
870bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov  ASSERT_EQ(sizeof(sai), sz);
871bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov  EXPECT_NOT_POISONED(sai);
872bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov
8739d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  close(new_sock);
8749d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  close(connect_socket);
8759d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  close(listen_socket);
8769d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov}
8779d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov
878512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy StepanovTEST(MemorySanitizer, getaddrinfo) {
879512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov  struct addrinfo *ai;
880512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov  struct addrinfo hints;
881512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov  memset(&hints, 0, sizeof(hints));
882512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov  hints.ai_family = AF_INET;
883512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov  int res = getaddrinfo("localhost", NULL, &hints, &ai);
884512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov  ASSERT_EQ(0, res);
885512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov  EXPECT_NOT_POISONED(*ai);
886512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov  ASSERT_EQ(sizeof(sockaddr_in), ai->ai_addrlen);
887512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov  EXPECT_NOT_POISONED(*(sockaddr_in*)ai->ai_addr);
888512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov}
889512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov
8909eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy StepanovTEST(MemorySanitizer, getnameinfo) {
8919eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov  struct sockaddr_in sai;
892ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  memset(&sai, 0, sizeof(sai));
8939eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov  sai.sin_family = AF_INET;
8949eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov  sai.sin_port = 80;
8959eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov  sai.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
8969eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov  char host[500];
8979eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov  char serv[500];
8989eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov  int res = getnameinfo((struct sockaddr *)&sai, sizeof(sai), host,
8999eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov                        sizeof(host), serv, sizeof(serv), 0);
9009eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov  ASSERT_EQ(0, res);
9019eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov  EXPECT_NOT_POISONED(host[0]);
9029eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov  EXPECT_POISONED(host[sizeof(host) - 1]);
9039eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov
9042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_NE(0U, strlen(host));
9059eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov  EXPECT_NOT_POISONED(serv[0]);
9069eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov  EXPECT_POISONED(serv[sizeof(serv) - 1]);
9072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_NE(0U, strlen(serv));
9089eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov}
9099eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov
9100a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov#define EXPECT_HOSTENT_NOT_POISONED(he)        \
9110a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  do {                                         \
9120a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov    EXPECT_NOT_POISONED(*(he));                \
9130a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov    ASSERT_NE((void *) 0, (he)->h_name);       \
9140a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov    ASSERT_NE((void *) 0, (he)->h_aliases);    \
9150a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov    ASSERT_NE((void *) 0, (he)->h_addr_list);  \
9160a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov    EXPECT_NOT_POISONED(strlen((he)->h_name)); \
9170a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov    char **p = (he)->h_aliases;                \
9180a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov    while (*p) {                               \
9190a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov      EXPECT_NOT_POISONED(strlen(*p));         \
9200a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov      ++p;                                     \
9210a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov    }                                          \
9220a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov    char **q = (he)->h_addr_list;              \
9230a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov    while (*q) {                               \
9240a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov      EXPECT_NOT_POISONED(*q[0]);              \
9250a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov      ++q;                                     \
9260a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov    }                                          \
9270a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov    EXPECT_NOT_POISONED(*q);                   \
9280a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  } while (0)
9290a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov
9300a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovTEST(MemorySanitizer, gethostent) {
9310a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  struct hostent *he = gethostent();
9320a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  ASSERT_NE((void *)NULL, he);
9330a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_HOSTENT_NOT_POISONED(he);
9340a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov}
9350a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov
936263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov#ifndef MSAN_TEST_DISABLE_GETHOSTBYNAME
937263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov
9380a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovTEST(MemorySanitizer, gethostbyname) {
9390a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  struct hostent *he = gethostbyname("localhost");
9400a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  ASSERT_NE((void *)NULL, he);
9410a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_HOSTENT_NOT_POISONED(he);
9420a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov}
9430a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov
944263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov#endif // MSAN_TEST_DISABLE_GETHOSTBYNAME
945263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov
946ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy StepanovTEST(MemorySanitizer, recvmsg) {
947ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  int server_socket = socket(AF_INET, SOCK_DGRAM, 0);
948ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  ASSERT_LT(0, server_socket);
949ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov
950ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  struct sockaddr_in sai;
951ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  memset(&sai, 0, sizeof(sai));
952ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  sai.sin_family = AF_INET;
953ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  sai.sin_port = 0;
954ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  sai.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
955ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  int res = bind(server_socket, (struct sockaddr *)&sai, sizeof(sai));
956ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  ASSERT_EQ(0, res);
957ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov
958ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  socklen_t sz = sizeof(sai);
959ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  res = getsockname(server_socket, (struct sockaddr *)&sai, &sz);
960ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  ASSERT_EQ(0, res);
961ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  ASSERT_EQ(sizeof(sai), sz);
962ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov
963ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov
964ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  int client_socket = socket(AF_INET, SOCK_DGRAM, 0);
965ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  ASSERT_LT(0, client_socket);
966ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov
967ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  struct sockaddr_in client_sai;
968ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  memset(&client_sai, 0, sizeof(client_sai));
969ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  client_sai.sin_family = AF_INET;
970ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  client_sai.sin_port = 0;
971ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  client_sai.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
972ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  res = bind(client_socket, (struct sockaddr *)&client_sai, sizeof(client_sai));
973ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  ASSERT_EQ(0, res);
974ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov
975ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  sz = sizeof(client_sai);
976ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  res = getsockname(client_socket, (struct sockaddr *)&client_sai, &sz);
977ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  ASSERT_EQ(0, res);
978ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  ASSERT_EQ(sizeof(client_sai), sz);
979ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov
980ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov
981ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  const char *s = "message text";
982ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  struct iovec iov;
983ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  iov.iov_base = (void *)s;
984ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  iov.iov_len = strlen(s) + 1;
985ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  struct msghdr msg;
986ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  memset(&msg, 0, sizeof(msg));
987ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  msg.msg_name = &sai;
988ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  msg.msg_namelen = sizeof(sai);
989ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  msg.msg_iov = &iov;
990ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  msg.msg_iovlen = 1;
991ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  res = sendmsg(client_socket, &msg, 0);
992ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  ASSERT_LT(0, res);
993ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov
994ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov
995ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  char buf[1000];
996ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  struct iovec recv_iov;
997ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  recv_iov.iov_base = (void *)&buf;
998ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  recv_iov.iov_len = sizeof(buf);
999ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  struct sockaddr_in recv_sai;
1000ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  struct msghdr recv_msg;
1001ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  memset(&recv_msg, 0, sizeof(recv_msg));
1002ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  recv_msg.msg_name = &recv_sai;
1003ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  recv_msg.msg_namelen = sizeof(recv_sai);
1004ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  recv_msg.msg_iov = &recv_iov;
1005ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  recv_msg.msg_iovlen = 1;
1006ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  res = recvmsg(server_socket, &recv_msg, 0);
1007ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  ASSERT_LT(0, res);
1008ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov
1009ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  ASSERT_EQ(sizeof(recv_sai), recv_msg.msg_namelen);
1010ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  EXPECT_NOT_POISONED(*(struct sockaddr_in *)recv_msg.msg_name);
1011ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  EXPECT_STREQ(s, buf);
1012ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov
1013ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  close(server_socket);
1014ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  close(client_socket);
1015ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov}
1016ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov
10170a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovTEST(MemorySanitizer, gethostbyname2) {
10180a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  struct hostent *he = gethostbyname2("localhost", AF_INET);
10190a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  ASSERT_NE((void *)NULL, he);
10200a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_HOSTENT_NOT_POISONED(he);
10210a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov}
10220a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov
10230a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovTEST(MemorySanitizer, gethostbyaddr) {
10240a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  in_addr_t addr = inet_addr("127.0.0.1");
10250a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_NOT_POISONED(addr);
10260a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  struct hostent *he = gethostbyaddr(&addr, sizeof(addr), AF_INET);
10270a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  ASSERT_NE((void *)NULL, he);
10280a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_HOSTENT_NOT_POISONED(he);
10290a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov}
10300a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov
10310a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovTEST(MemorySanitizer, gethostent_r) {
10320a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  char buf[2000];
10330a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  struct hostent he;
10340a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  struct hostent *result;
10350a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  int err;
10360a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  int res = gethostent_r(&he, buf, sizeof(buf), &result, &err);
10370a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  ASSERT_EQ(0, res);
10380a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_NOT_POISONED(result);
10390a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  ASSERT_NE((void *)NULL, result);
10400a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_HOSTENT_NOT_POISONED(result);
10410a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_NOT_POISONED(err);
10420a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov}
10430a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov
10440a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovTEST(MemorySanitizer, gethostbyname_r) {
10450a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  char buf[2000];
10460a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  struct hostent he;
10470a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  struct hostent *result;
10480a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  int err;
10490a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  int res = gethostbyname_r("localhost", &he, buf, sizeof(buf), &result, &err);
10500a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  ASSERT_EQ(0, res);
10510a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_NOT_POISONED(result);
10520a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  ASSERT_NE((void *)NULL, result);
10530a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_HOSTENT_NOT_POISONED(result);
10540a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_NOT_POISONED(err);
10550a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov}
10560a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov
10572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, gethostbyname_r_bad_host_name) {
10582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  char buf[2000];
10592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  struct hostent he;
10602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  struct hostent *result;
10612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  int err;
10622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  int res = gethostbyname_r("bad-host-name", &he, buf, sizeof(buf), &result, &err);
10632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ((struct hostent *)0, result);
10642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(err);
10652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
10662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
10672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, gethostbyname_r_erange) {
10682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  char buf[5];
10692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  struct hostent he;
10702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  struct hostent *result;
10712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  int err;
10722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  int res = gethostbyname_r("localhost", &he, buf, sizeof(buf), &result, &err);
10732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(ERANGE, res);
10742d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(err);
10752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
10762d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
10770a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovTEST(MemorySanitizer, gethostbyname2_r) {
10780a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  char buf[2000];
10790a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  struct hostent he;
10800a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  struct hostent *result;
10810a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  int err;
10820a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  int res = gethostbyname2_r("localhost", AF_INET, &he, buf, sizeof(buf),
10830a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov                             &result, &err);
10840a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  ASSERT_EQ(0, res);
10850a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_NOT_POISONED(result);
10860a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  ASSERT_NE((void *)NULL, result);
10870a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_HOSTENT_NOT_POISONED(result);
10880a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_NOT_POISONED(err);
10890a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov}
10900a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov
10910a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovTEST(MemorySanitizer, gethostbyaddr_r) {
10920a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  char buf[2000];
10930a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  struct hostent he;
10940a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  struct hostent *result;
10950a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  int err;
10960a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  in_addr_t addr = inet_addr("127.0.0.1");
10970a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_NOT_POISONED(addr);
10980a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  int res = gethostbyaddr_r(&addr, sizeof(addr), AF_INET, &he, buf, sizeof(buf),
10990a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov                            &result, &err);
11000a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  ASSERT_EQ(0, res);
11010a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_NOT_POISONED(result);
11020a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  ASSERT_NE((void *)NULL, result);
11030a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_HOSTENT_NOT_POISONED(result);
11040a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_NOT_POISONED(err);
11050a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov}
11060a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov
1107f32be42523a199674ea665a499db131591e64e08Evgeniy StepanovTEST(MemorySanitizer, getsockopt) {
1108f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov  int sock = socket(AF_UNIX, SOCK_STREAM, 0);
1109f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov  struct linger l[2];
1110f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov  socklen_t sz = sizeof(l[0]);
1111f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov  int res = getsockopt(sock, SOL_SOCKET, SO_LINGER, &l[0], &sz);
1112f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov  ASSERT_EQ(0, res);
1113f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov  ASSERT_EQ(sizeof(l[0]), sz);
1114f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov  EXPECT_NOT_POISONED(l[0]);
1115f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov  EXPECT_POISONED(*(char *)(l + 1));
1116f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov}
1117f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov
11180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, getcwd) {
11190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char path[PATH_MAX + 1];
11200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* res = getcwd(path, sizeof(path));
11212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(res != NULL);
112211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(path[0]);
11230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
11240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
11257eed04c4dce69ad1e485edbf6dd963e176b52e0dEvgeniy StepanovTEST(MemorySanitizer, getcwd_gnu) {
11267eed04c4dce69ad1e485edbf6dd963e176b52e0dEvgeniy Stepanov  char* res = getcwd(NULL, 0);
11272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(res != NULL);
11287eed04c4dce69ad1e485edbf6dd963e176b52e0dEvgeniy Stepanov  EXPECT_NOT_POISONED(res[0]);
11297eed04c4dce69ad1e485edbf6dd963e176b52e0dEvgeniy Stepanov  free(res);
11307eed04c4dce69ad1e485edbf6dd963e176b52e0dEvgeniy Stepanov}
11317eed04c4dce69ad1e485edbf6dd963e176b52e0dEvgeniy Stepanov
1132801448950d645813efb398575bbc62b48e5b1dfcEvgeniy StepanovTEST(MemorySanitizer, get_current_dir_name) {
1133801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  char* res = get_current_dir_name();
11342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(res != NULL);
1135801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  EXPECT_NOT_POISONED(res[0]);
1136801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  free(res);
1137801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov}
1138801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov
113910362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy StepanovTEST(MemorySanitizer, shmctl) {
114010362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  int id = shmget(IPC_PRIVATE, 4096, 0644 | IPC_CREAT);
114110362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  ASSERT_GT(id, -1);
114210362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov
114310362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  struct shmid_ds ds;
114410362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  int res = shmctl(id, IPC_STAT, &ds);
114510362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  ASSERT_GT(res, -1);
114610362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  EXPECT_NOT_POISONED(ds);
114710362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov
114810362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  struct shminfo si;
114910362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  res = shmctl(id, IPC_INFO, (struct shmid_ds *)&si);
115010362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  ASSERT_GT(res, -1);
115110362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  EXPECT_NOT_POISONED(si);
115210362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov
115310362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  struct shm_info s_i;
115410362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  res = shmctl(id, SHM_INFO, (struct shmid_ds *)&s_i);
115510362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  ASSERT_GT(res, -1);
115610362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  EXPECT_NOT_POISONED(s_i);
115710362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov
115810362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  res = shmctl(id, IPC_RMID, 0);
115910362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  ASSERT_GT(res, -1);
116010362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov}
116110362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov
1162f3603890015c130420def39d67a02c2fdafc6f84Evgeniy StepanovTEST(MemorySanitizer, shmat) {
1163f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov  void *p = mmap(NULL, 4096, PROT_READ | PROT_WRITE,
1164f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov                 MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
1165f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov  ASSERT_NE(MAP_FAILED, p);
1166f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov
1167f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov  ((char *)p)[10] = *GetPoisoned<U1>();
1168f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov  ((char *)p)[4095] = *GetPoisoned<U1>();
1169f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov
1170f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov  int res = munmap(p, 4096);
1171f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov  ASSERT_EQ(0, res);
1172f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov
1173f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov  int id = shmget(IPC_PRIVATE, 4096, 0644 | IPC_CREAT);
1174f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov  ASSERT_GT(id, -1);
1175f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov
1176f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov  void *q = shmat(id, p, 0);
1177f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov  ASSERT_EQ(p, q);
1178f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov
1179f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov  EXPECT_NOT_POISONED(((char *)q)[0]);
1180f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov  EXPECT_NOT_POISONED(((char *)q)[10]);
1181f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov  EXPECT_NOT_POISONED(((char *)q)[4095]);
1182f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov
1183f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov  res = shmdt(q);
1184f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov  ASSERT_EQ(0, res);
1185f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov
1186f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov  res = shmctl(id, IPC_RMID, 0);
1187f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov  ASSERT_GT(res, -1);
1188f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov}
1189f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov
1190aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy StepanovTEST(MemorySanitizer, random_r) {
1191aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov  int32_t x;
1192aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov  char z[64];
1193e46ecb155b22c8ea37235ebe317e0de1edf6b001Evgeniy Stepanov  memset(z, 0, sizeof(z));
1194e46ecb155b22c8ea37235ebe317e0de1edf6b001Evgeniy Stepanov
1195aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov  struct random_data buf;
1196e46ecb155b22c8ea37235ebe317e0de1edf6b001Evgeniy Stepanov  memset(&buf, 0, sizeof(buf));
1197aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov
1198aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov  int res = initstate_r(0, z, sizeof(z), &buf);
1199aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov  ASSERT_EQ(0, res);
1200aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov
1201aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov  res = random_r(&buf, &x);
1202aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov  ASSERT_EQ(0, res);
1203aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov  EXPECT_NOT_POISONED(x);
1204aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov}
120510362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov
12065ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy StepanovTEST(MemorySanitizer, confstr) {
12075ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov  char buf[3];
12085ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov  size_t res = confstr(_CS_PATH, buf, sizeof(buf));
12095ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov  ASSERT_GT(res, sizeof(buf));
12105ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[0]);
12115ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[sizeof(buf) - 1]);
12125ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov
12135ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov  char buf2[1000];
12145ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov  res = confstr(_CS_PATH, buf2, sizeof(buf2));
12155ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov  ASSERT_LT(res, sizeof(buf2));
12165ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov  EXPECT_NOT_POISONED(buf2[0]);
12175ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov  EXPECT_NOT_POISONED(buf2[res - 1]);
12185ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov  EXPECT_POISONED(buf2[res]);
12195ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov  ASSERT_EQ(res, strlen(buf2) + 1);
12205ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov}
12215ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov
1222d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy StepanovTEST(MemorySanitizer, readdir) {
1223d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov  DIR *dir = opendir(".");
1224d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov  struct dirent *d = readdir(dir);
12252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(d != NULL);
1226d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov  EXPECT_NOT_POISONED(d->d_name[0]);
1227d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov  closedir(dir);
1228d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov}
1229d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov
1230b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy StepanovTEST(MemorySanitizer, readdir_r) {
1231b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov  DIR *dir = opendir(".");
1232b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov  struct dirent d;
1233b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov  struct dirent *pd;
1234b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov  int res = readdir_r(dir, &d, &pd);
12352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
1236b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov  EXPECT_NOT_POISONED(pd);
1237b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov  EXPECT_NOT_POISONED(d.d_name[0]);
1238b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov  closedir(dir);
1239b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov}
1240b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov
12410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, realpath) {
12420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  const char* relpath = ".";
12430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char path[PATH_MAX + 1];
12440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* res = realpath(relpath, path);
12452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(res != NULL);
124611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(path[0]);
12470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
12480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
124912eb79dd701d9d40551759330a9257316601373bEvgeniy StepanovTEST(MemorySanitizer, realpath_null) {
125012eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov  const char* relpath = ".";
125112eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov  char* res = realpath(relpath, NULL);
125212eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov  printf("%d, %s\n", errno, strerror(errno));
12532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(res != NULL);
125412eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov  EXPECT_NOT_POISONED(res[0]);
125512eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov  free(res);
125612eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov}
125712eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov
125812eb79dd701d9d40551759330a9257316601373bEvgeniy StepanovTEST(MemorySanitizer, canonicalize_file_name) {
125912eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov  const char* relpath = ".";
126012eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov  char* res = canonicalize_file_name(relpath);
12612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(res != NULL);
126212eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov  EXPECT_NOT_POISONED(res[0]);
126312eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov  free(res);
1264534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov}
1265534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov
1266534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanovextern char **environ;
1267534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov
1268534e2ba5188e1a74b340f9507755806357835f62Evgeniy StepanovTEST(MemorySanitizer, setenv) {
1269534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov  setenv("AAA", "BBB", 1);
1270534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov  for (char **envp = environ; *envp; ++envp) {
1271534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov    EXPECT_NOT_POISONED(*envp);
1272534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov    EXPECT_NOT_POISONED(*envp[0]);
1273534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov  }
1274534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov}
1275534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov
1276534e2ba5188e1a74b340f9507755806357835f62Evgeniy StepanovTEST(MemorySanitizer, putenv) {
1277534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov  char s[] = "AAA=BBB";
1278534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov  putenv(s);
1279534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov  for (char **envp = environ; *envp; ++envp) {
1280534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov    EXPECT_NOT_POISONED(*envp);
1281534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov    EXPECT_NOT_POISONED(*envp[0]);
1282534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov  }
128312eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov}
128412eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov
12850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, memcpy) {
12860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* x = new char[2];
12870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* y = new char[2];
12880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[0] = 1;
12890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[1] = *GetPoisoned<char>();
12900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  memcpy(y, x, 2);
129111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(y[0]);
129211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(y[1]);
12930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
12940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
12955d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesvoid TestUnalignedMemcpy(unsigned left, unsigned right, bool src_is_aligned,
12965d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines                         bool src_is_poisoned, bool dst_is_poisoned) {
12975d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  fprintf(stderr, "%s(%d, %d, %d, %d, %d)\n", __func__, left, right,
12985d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines          src_is_aligned, src_is_poisoned, dst_is_poisoned);
12995d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
13005d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  const unsigned sz = 20;
13015d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  U4 dst_origin, src_origin;
1302450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov  char *dst = (char *)malloc(sz);
13035d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  if (dst_is_poisoned)
13045d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines    dst_origin = __msan_get_origin(dst);
13055d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  else
13065d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines    memset(dst, 0, sz);
1307450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov
1308450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov  char *src = (char *)malloc(sz);
13095d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  if (src_is_poisoned)
13105d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines    src_origin = __msan_get_origin(src);
13115d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  else
13125d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines    memset(src, 0, sz);
1313450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov
1314450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov  memcpy(dst + left, src_is_aligned ? src + left : src, sz - left - right);
13155d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
13165d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  for (unsigned i = 0; i < (left & (~3U)); ++i)
13175d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines    if (dst_is_poisoned)
13185d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines      EXPECT_POISONED_O(dst[i], dst_origin);
13195d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines    else
13205d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines      EXPECT_NOT_POISONED(dst[i]);
13215d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
13225d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  for (unsigned i = 0; i < (right & (~3U)); ++i)
13235d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines    if (dst_is_poisoned)
13245d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines      EXPECT_POISONED_O(dst[sz - i - 1], dst_origin);
13255d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines    else
13265d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines      EXPECT_NOT_POISONED(dst[sz - i - 1]);
13275d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
13285d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  for (unsigned i = left; i < sz - right; ++i)
13295d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines    if (src_is_poisoned)
13305d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines      EXPECT_POISONED_O(dst[i], src_origin);
13315d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines    else
13325d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines      EXPECT_NOT_POISONED(dst[i]);
1333450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov
1334450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov  free(dst);
1335450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov  free(src);
1336450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov}
1337450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov
1338450eee655289a622ab9acf87d863f38991b184c9Evgeniy StepanovTEST(MemorySanitizer, memcpy_unaligned) {
13395d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  for (int i = 0; i < 10; ++i)
13405d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines    for (int j = 0; j < 10; ++j)
13415d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines      for (int aligned = 0; aligned < 2; ++aligned)
13425d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines        for (int srcp = 0; srcp < 2; ++srcp)
13435d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines          for (int dstp = 0; dstp < 2; ++dstp)
13445d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines            TestUnalignedMemcpy(i, j, aligned, srcp, dstp);
1345450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov}
1346450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov
13470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, memmove) {
13480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* x = new char[2];
13490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* y = new char[2];
13500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[0] = 1;
13510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[1] = *GetPoisoned<char>();
13520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  memmove(y, x, 2);
135311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(y[0]);
135411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(y[1]);
13550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
13560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
13575492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy StepanovTEST(MemorySanitizer, memccpy_nomatch) {
13585492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  char* x = new char[5];
13595492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  char* y = new char[5];
13605492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  strcpy(x, "abc");
13615492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  memccpy(y, x, 'd', 4);
13625492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  EXPECT_NOT_POISONED(y[0]);
13635492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  EXPECT_NOT_POISONED(y[1]);
13645492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  EXPECT_NOT_POISONED(y[2]);
13655492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  EXPECT_NOT_POISONED(y[3]);
13665492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  EXPECT_POISONED(y[4]);
13675492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  delete[] x;
13685492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  delete[] y;
13695492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov}
13705492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov
13715492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy StepanovTEST(MemorySanitizer, memccpy_match) {
13725492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  char* x = new char[5];
13735492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  char* y = new char[5];
13745492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  strcpy(x, "abc");
13755492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  memccpy(y, x, 'b', 4);
13765492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  EXPECT_NOT_POISONED(y[0]);
13775492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  EXPECT_NOT_POISONED(y[1]);
13785492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  EXPECT_POISONED(y[2]);
13795492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  EXPECT_POISONED(y[3]);
13805492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  EXPECT_POISONED(y[4]);
13815492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  delete[] x;
13825492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  delete[] y;
13835492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov}
13845492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov
13855492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy StepanovTEST(MemorySanitizer, memccpy_nomatch_positive) {
13865492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  char* x = new char[5];
13875492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  char* y = new char[5];
13885492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  strcpy(x, "abc");
13895492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  EXPECT_UMR(memccpy(y, x, 'd', 5));
13905492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  delete[] x;
13915492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  delete[] y;
13925492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov}
13935492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov
13945492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy StepanovTEST(MemorySanitizer, memccpy_match_positive) {
13955492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  char* x = new char[5];
13965492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  char* y = new char[5];
13975492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  x[0] = 'a';
13985492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  x[2] = 'b';
13995492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  EXPECT_UMR(memccpy(y, x, 'b', 5));
14005492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  delete[] x;
14015492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov  delete[] y;
14025492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov}
14035492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov
1404ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy StepanovTEST(MemorySanitizer, bcopy) {
1405ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  char* x = new char[2];
1406ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  char* y = new char[2];
1407ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  x[0] = 1;
1408ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  x[1] = *GetPoisoned<char>();
1409ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  bcopy(x, y, 2);
1410ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  EXPECT_NOT_POISONED(y[0]);
1411ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  EXPECT_POISONED(y[1]);
1412ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov}
1413ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov
14140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, strdup) {
14158aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  char buf[4] = "abc";
14168aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  __msan_poison(buf + 2, sizeof(*buf));
14178aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  char *x = strdup(buf);
14188aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);
14198aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_NOT_POISONED(x[1]);
14208aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_POISONED(x[2]);
14218aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_NOT_POISONED(x[3]);
14228aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  free(x);
14238aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov}
14248aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov
14258aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy StepanovTEST(MemorySanitizer, strndup) {
14268aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  char buf[4] = "abc";
14278aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  __msan_poison(buf + 2, sizeof(*buf));
14288aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  char *x = strndup(buf, 3);
14298aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);
14308aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_NOT_POISONED(x[1]);
14318aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_POISONED(x[2]);
14328aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_NOT_POISONED(x[3]);
14330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  free(x);
14340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
14350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
14368aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy StepanovTEST(MemorySanitizer, strndup_short) {
14378aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  char buf[4] = "abc";
14388aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  __msan_poison(buf + 1, sizeof(*buf));
14398aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  __msan_poison(buf + 2, sizeof(*buf));
14408aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  char *x = strndup(buf, 2);
14418aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);
14428aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_POISONED(x[1]);
14431d21bd159c3830dd7a6c05854408442d91a336adEvgeniy Stepanov  EXPECT_NOT_POISONED(x[2]);
14448aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  free(x);
14458aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov}
14468aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov
14478aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov
14480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T, int size>
14490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovvoid TestOverlapMemmove() {
14500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *x = new T[size];
14512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_GE(size, 3);
14520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[2] = 0;
14530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  memmove(x, x + 1, (size - 1) * sizeof(T));
145411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[1]);
14550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!__msan_has_dynamic_component()) {
14560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    // FIXME: under DR we will lose this information
14570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    // because accesses in memmove will unpoisin the shadow.
14580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    // We need to use our own memove implementation instead of libc's.
145911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov    EXPECT_POISONED(x[0]);
146011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov    EXPECT_POISONED(x[2]);
14610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  }
14620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete [] x;
14630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
14640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
14650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, overlap_memmove) {
14660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestOverlapMemmove<U1, 10>();
14670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestOverlapMemmove<U1, 1000>();
14680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestOverlapMemmove<U8, 4>();
14690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestOverlapMemmove<U8, 1000>();
14700231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
14710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
14720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, strcpy) {  // NOLINT
14730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* x = new char[3];
14740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* y = new char[3];
14750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[0] = 'a';
14760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[1] = *GetPoisoned<char>(1, 1);
14770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[2] = 0;
14780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  strcpy(y, x);  // NOLINT
147911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(y[0]);
148011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(y[1]);
148111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(y[2]);
14820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
14830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
14840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, strncpy) {  // NOLINT
14850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* x = new char[3];
14860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* y = new char[3];
14870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[0] = 'a';
14880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[1] = *GetPoisoned<char>(1, 1);
14890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[2] = 0;
14900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  strncpy(y, x, 2);  // NOLINT
149111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(y[0]);
149211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(y[1]);
149311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(y[2]);
14940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
14950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
14964bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy StepanovTEST(MemorySanitizer, stpcpy) {  // NOLINT
14974bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov  char* x = new char[3];
14984bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov  char* y = new char[3];
14994bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov  x[0] = 'a';
15004bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov  x[1] = *GetPoisoned<char>(1, 1);
15014bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov  x[2] = 0;
15024bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov  char *res = stpcpy(y, x);  // NOLINT
15034bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov  ASSERT_EQ(res, y + 2);
15044bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov  EXPECT_NOT_POISONED(y[0]);
15054bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov  EXPECT_POISONED(y[1]);
15064bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov  EXPECT_NOT_POISONED(y[2]);
15074bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov}
15084bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov
15092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, strcat) {  // NOLINT
15102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  char a[10];
15112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  char b[] = "def";
15122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  strcpy(a, "abc");
15132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_poison(b + 1, 1);
15142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  strcat(a, b);
15152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(a[3]);
15162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(a[4]);
15172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(a[5]);
15182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(a[6]);
15192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(a[7]);
15202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
15212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
15222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, strncat) {  // NOLINT
15232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  char a[10];
15242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  char b[] = "def";
15252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  strcpy(a, "abc");
15262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_poison(b + 1, 1);
15272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  strncat(a, b, 5);
15282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(a[3]);
15292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(a[4]);
15302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(a[5]);
15312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(a[6]);
15322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(a[7]);
15332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
15342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
15352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, strncat_overflow) {  // NOLINT
15362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  char a[10];
15372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  char b[] = "def";
15382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  strcpy(a, "abc");
15392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_poison(b + 1, 1);
15402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  strncat(a, b, 2);
15412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(a[3]);
15422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(a[4]);
15432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(a[5]);
15442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(a[6]);
15452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(a[7]);
15462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
15472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
15482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#define TEST_STRTO_INT(func_name)          \
15492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  TEST(MemorySanitizer, func_name) {       \
15502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    char *e;                               \
15512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    EXPECT_EQ(1U, func_name("1", &e, 10)); \
15522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    EXPECT_NOT_POISONED((S8)e);            \
15532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  }
15540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
15552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#define TEST_STRTO_FLOAT(func_name)     \
15562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  TEST(MemorySanitizer, func_name) {    \
15572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    char *e;                            \
15582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    EXPECT_NE(0, func_name("1.5", &e)); \
15592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    EXPECT_NOT_POISONED((S8)e);         \
15602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  }
15610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
15622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#define TEST_STRTO_FLOAT_LOC(func_name)                          \
15632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  TEST(MemorySanitizer, func_name) {                             \
15642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    locale_t loc = newlocale(LC_NUMERIC_MASK, "C", (locale_t)0); \
15652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    char *e;                                                     \
15662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    EXPECT_NE(0, func_name("1.5", &e, loc));                     \
15672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    EXPECT_NOT_POISONED((S8)e);                                  \
15682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    freelocale(loc);                                             \
15692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  }
15700231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
15712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#define TEST_STRTO_INT_LOC(func_name)                            \
15722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  TEST(MemorySanitizer, func_name) {                             \
15732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    locale_t loc = newlocale(LC_NUMERIC_MASK, "C", (locale_t)0); \
15742d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    char *e;                                                     \
15752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    ASSERT_EQ(1U, func_name("1", &e, 10, loc));                  \
15762d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    EXPECT_NOT_POISONED((S8)e);                                  \
15772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    freelocale(loc);                                             \
15782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  }
15790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
15802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST_STRTO_INT(strtol)
15812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST_STRTO_INT(strtoll)
15822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST_STRTO_INT(strtoul)
15832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST_STRTO_INT(strtoull)
1584ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov
15852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST_STRTO_FLOAT(strtof)
15862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST_STRTO_FLOAT(strtod)
15872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST_STRTO_FLOAT(strtold)
15882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
15892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST_STRTO_FLOAT_LOC(strtof_l)
15902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST_STRTO_FLOAT_LOC(strtod_l)
15912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST_STRTO_FLOAT_LOC(strtold_l)
15922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
15932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST_STRTO_INT_LOC(strtol_l)
15942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST_STRTO_INT_LOC(strtoll_l)
15952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST_STRTO_INT_LOC(strtoul_l)
15962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST_STRTO_INT_LOC(strtoull_l)
15972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
15985d71de26cedae3dafc17449fe0182045c0bd20e8Stephen HinesTEST(MemorySanitizer, strtoimax) {
1599ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  char *e;
16002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(1, strtoimax("1", &e, 10));
1601ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  EXPECT_NOT_POISONED((S8) e);
1602ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov}
1603ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov
16045d71de26cedae3dafc17449fe0182045c0bd20e8Stephen HinesTEST(MemorySanitizer, strtoumax) {
1605e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  char *e;
16062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(1U, strtoumax("1", &e, 10));
160711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED((S8) e);
1608e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov}
1609e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov
16103f4beff5efdd0d30844ca8b270876f7d59a608e7Evgeniy Stepanov#ifdef __GLIBC__
16112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesextern "C" float __strtof_l(const char *nptr, char **endptr, locale_t loc);
16122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST_STRTO_FLOAT_LOC(__strtof_l)
16133f4beff5efdd0d30844ca8b270876f7d59a608e7Evgeniy Stepanovextern "C" double __strtod_l(const char *nptr, char **endptr, locale_t loc);
16142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST_STRTO_FLOAT_LOC(__strtod_l)
16152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesextern "C" long double __strtold_l(const char *nptr, char **endptr,
16162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines                                   locale_t loc);
16172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST_STRTO_FLOAT_LOC(__strtold_l)
16183f4beff5efdd0d30844ca8b270876f7d59a608e7Evgeniy Stepanov#endif  // __GLIBC__
16193f4beff5efdd0d30844ca8b270876f7d59a608e7Evgeniy Stepanov
1620c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy StepanovTEST(MemorySanitizer, modf) {
1621c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov  double x, y;
1622c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov  x = modf(2.1, &y);
1623c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov  EXPECT_NOT_POISONED(y);
1624c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov}
1625c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov
1626c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy StepanovTEST(MemorySanitizer, modff) {
1627c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov  float x, y;
1628c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov  x = modff(2.1, &y);
1629c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov  EXPECT_NOT_POISONED(y);
1630c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov}
1631c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov
1632c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy StepanovTEST(MemorySanitizer, modfl) {
1633c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov  long double x, y;
1634c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov  x = modfl(2.1, &y);
1635c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov  EXPECT_NOT_POISONED(y);
1636c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov}
1637c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov
1638f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy StepanovTEST(MemorySanitizer, sincos) {
1639f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  double s, c;
1640f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  sincos(0.2, &s, &c);
1641f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  EXPECT_NOT_POISONED(s);
1642f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  EXPECT_NOT_POISONED(c);
1643f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov}
1644f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov
1645f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy StepanovTEST(MemorySanitizer, sincosf) {
1646f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  float s, c;
1647f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  sincosf(0.2, &s, &c);
1648f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  EXPECT_NOT_POISONED(s);
1649f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  EXPECT_NOT_POISONED(c);
1650f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov}
1651f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov
1652f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy StepanovTEST(MemorySanitizer, sincosl) {
1653f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  long double s, c;
1654f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  sincosl(0.2, &s, &c);
1655f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  EXPECT_NOT_POISONED(s);
1656f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  EXPECT_NOT_POISONED(c);
1657f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov}
1658f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov
1659f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy StepanovTEST(MemorySanitizer, remquo) {
1660f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  int quo;
1661f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  double res = remquo(29.0, 3.0, &quo);
1662f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  ASSERT_NE(0.0, res);
1663f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  EXPECT_NOT_POISONED(quo);
1664f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov}
1665f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov
1666f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy StepanovTEST(MemorySanitizer, remquof) {
1667f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  int quo;
1668f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  float res = remquof(29.0, 3.0, &quo);
1669f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  ASSERT_NE(0.0, res);
1670f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  EXPECT_NOT_POISONED(quo);
1671f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov}
1672f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov
1673f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy StepanovTEST(MemorySanitizer, remquol) {
1674f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  int quo;
1675f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  long double res = remquof(29.0, 3.0, &quo);
1676f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  ASSERT_NE(0.0, res);
1677f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  EXPECT_NOT_POISONED(quo);
1678f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov}
1679f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov
1680f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy StepanovTEST(MemorySanitizer, lgamma) {
1681f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  double res = lgamma(1.1);
1682f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  ASSERT_NE(0.0, res);
1683f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  EXPECT_NOT_POISONED(signgam);
1684f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov}
1685f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov
1686f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy StepanovTEST(MemorySanitizer, lgammaf) {
1687f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  float res = lgammaf(1.1);
1688f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  ASSERT_NE(0.0, res);
1689f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  EXPECT_NOT_POISONED(signgam);
1690f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov}
1691f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov
1692f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy StepanovTEST(MemorySanitizer, lgammal) {
1693f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  long double res = lgammal(1.1);
1694f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  ASSERT_NE(0.0, res);
1695f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  EXPECT_NOT_POISONED(signgam);
1696f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov}
1697f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov
1698f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy StepanovTEST(MemorySanitizer, lgamma_r) {
1699f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  int sgn;
1700f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  double res = lgamma_r(1.1, &sgn);
1701f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  ASSERT_NE(0.0, res);
1702f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  EXPECT_NOT_POISONED(sgn);
1703f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov}
1704f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov
1705f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy StepanovTEST(MemorySanitizer, lgammaf_r) {
1706f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  int sgn;
1707f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  float res = lgammaf_r(1.1, &sgn);
1708f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  ASSERT_NE(0.0, res);
1709f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  EXPECT_NOT_POISONED(sgn);
1710f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov}
1711f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov
1712f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy StepanovTEST(MemorySanitizer, lgammal_r) {
1713f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  int sgn;
1714f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  long double res = lgammal_r(1.1, &sgn);
1715f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  ASSERT_NE(0.0, res);
1716f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov  EXPECT_NOT_POISONED(sgn);
1717f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov}
1718f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov
171978d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy StepanovTEST(MemorySanitizer, drand48_r) {
172078d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov  struct drand48_data buf;
172178d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov  srand48_r(0, &buf);
172278d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov  double d;
172378d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov  drand48_r(&buf, &d);
172478d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov  EXPECT_NOT_POISONED(d);
172578d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov}
172678d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov
172778d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy StepanovTEST(MemorySanitizer, lrand48_r) {
172878d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov  struct drand48_data buf;
172978d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov  srand48_r(0, &buf);
173078d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov  long d;
173178d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov  lrand48_r(&buf, &d);
173278d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov  EXPECT_NOT_POISONED(d);
173378d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov}
173478d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov
17350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, sprintf) {  // NOLINT
17360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char buff[10];
173712c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(buff);
173811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(buff[0]);
17390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = sprintf(buff, "%d", 1234567);  // NOLINT
17402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(res, 7);
17412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(buff[0], '1');
17422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(buff[1], '2');
17432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(buff[2], '3');
17442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(buff[6], '7');
17452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(buff[7], 0);
174611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(buff[8]);
17470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
17480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
17490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, snprintf) {
17500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char buff[10];
175112c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(buff);
175211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(buff[0]);
17530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = snprintf(buff, sizeof(buff), "%d", 1234567);
17542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(res, 7);
17552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(buff[0], '1');
17562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(buff[1], '2');
17572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(buff[2], '3');
17582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(buff[6], '7');
17592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(buff[7], 0);
176011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(buff[8]);
17610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
17620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
17630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, swprintf) {
17640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  wchar_t buff[10];
17652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(4U, sizeof(wchar_t));
176612c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(buff);
176711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(buff[0]);
17680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = swprintf(buff, 9, L"%d", 1234567);
17692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(res, 7);
17702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(buff[0], '1');
17712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(buff[1], '2');
17722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(buff[2], '3');
17732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(buff[6], '7');
17742d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(buff[7], 0);
177511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(buff[8]);
17760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
17770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
17780797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy StepanovTEST(MemorySanitizer, asprintf) {  // NOLINT
17790797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov  char *pbuf;
17800797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov  EXPECT_POISONED(pbuf);
17810797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov  int res = asprintf(&pbuf, "%d", 1234567);  // NOLINT
17822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(res, 7);
17830797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov  EXPECT_NOT_POISONED(pbuf);
17842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(pbuf[0], '1');
17852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(pbuf[1], '2');
17862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(pbuf[2], '3');
17872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(pbuf[6], '7');
17882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(pbuf[7], 0);
17890797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov  free(pbuf);
17900797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov}
17910797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov
1792e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey SamsonovTEST(MemorySanitizer, mbstowcs) {
1793e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov  const char *x = "abc";
1794e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov  wchar_t buff[10];
1795e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov  int res = mbstowcs(buff, x, 2);
1796e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov  EXPECT_EQ(2, res);
1797e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov  EXPECT_EQ(L'a', buff[0]);
1798e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov  EXPECT_EQ(L'b', buff[1]);
1799e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov  EXPECT_POISONED(buff[2]);
1800e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov  res = mbstowcs(buff, x, 10);
1801e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov  EXPECT_EQ(3, res);
1802e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov  EXPECT_NOT_POISONED(buff[3]);
1803e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov}
1804e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov
18050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, wcstombs) {
18060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  const wchar_t *x = L"abc";
18070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char buff[10];
18080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = wcstombs(buff, x, 4);
18090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(res, 3);
18100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(buff[0], 'a');
18110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(buff[1], 'b');
18120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(buff[2], 'c');
18130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
18140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
1815ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy StepanovTEST(MemorySanitizer, wcsrtombs) {
1816ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  const wchar_t *x = L"abc";
1817ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  const wchar_t *p = x;
1818ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  char buff[10];
1819ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  mbstate_t mbs;
182057a1095fca7b95db8a0ec87fce7a6f0e331a5b99Evgeniy Stepanov  memset(&mbs, 0, sizeof(mbs));
1821ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  int res = wcsrtombs(buff, &p, 4, &mbs);
1822ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  EXPECT_EQ(res, 3);
1823ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  EXPECT_EQ(buff[0], 'a');
1824ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  EXPECT_EQ(buff[1], 'b');
1825ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  EXPECT_EQ(buff[2], 'c');
18269b21ba6f661a6b14e3e81bb4f06ffb769be028c4Evgeniy Stepanov  EXPECT_EQ(buff[3], '\0');
18279b21ba6f661a6b14e3e81bb4f06ffb769be028c4Evgeniy Stepanov  EXPECT_POISONED(buff[4]);
1828ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov}
1829ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov
1830ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy StepanovTEST(MemorySanitizer, wcsnrtombs) {
1831ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  const wchar_t *x = L"abc";
1832ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  const wchar_t *p = x;
1833ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  char buff[10];
1834ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  mbstate_t mbs;
183557a1095fca7b95db8a0ec87fce7a6f0e331a5b99Evgeniy Stepanov  memset(&mbs, 0, sizeof(mbs));
1836ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  int res = wcsnrtombs(buff, &p, 2, 4, &mbs);
1837ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  EXPECT_EQ(res, 2);
1838ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  EXPECT_EQ(buff[0], 'a');
1839ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  EXPECT_EQ(buff[1], 'b');
18409b21ba6f661a6b14e3e81bb4f06ffb769be028c4Evgeniy Stepanov  EXPECT_POISONED(buff[2]);
1841ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov}
1842ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov
1843801448950d645813efb398575bbc62b48e5b1dfcEvgeniy StepanovTEST(MemorySanitizer, mbtowc) {
1844801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  const char *x = "abc";
1845801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  wchar_t wx;
1846801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  int res = mbtowc(&wx, x, 3);
1847801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  EXPECT_GT(res, 0);
1848801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  EXPECT_NOT_POISONED(wx);
1849801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov}
1850801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov
1851801448950d645813efb398575bbc62b48e5b1dfcEvgeniy StepanovTEST(MemorySanitizer, mbrtowc) {
1852801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  const char *x = "abc";
1853801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  wchar_t wx;
1854801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  mbstate_t mbs;
1855801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  memset(&mbs, 0, sizeof(mbs));
1856801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  int res = mbrtowc(&wx, x, 3, &mbs);
1857801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  EXPECT_GT(res, 0);
1858801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  EXPECT_NOT_POISONED(wx);
1859801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov}
1860801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov
18612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, wcsftime) {
18622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  wchar_t x[100];
18632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  time_t t = time(NULL);
18642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  struct tm tms;
18652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  struct tm *tmres = localtime_r(&t, &tms);
18662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_NE((void *)0, tmres);
18672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  size_t res = wcsftime(x, sizeof(x) / sizeof(x[0]), L"%Y-%m-%d", tmres);
18682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_GT(res, 0UL);
18692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_EQ(res, wcslen(x));
18702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
18712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
18720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, gettimeofday) {
18730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  struct timeval tv;
18740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  struct timezone tz;
187512c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&tv);
187612c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&tz);
18772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(16U, sizeof(tv));
18782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(8U, sizeof(tz));
187911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(tv.tv_sec);
188011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(tv.tv_usec);
188111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(tz.tz_minuteswest);
188211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(tz.tz_dsttime);
18832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, gettimeofday(&tv, &tz));
188411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(tv.tv_sec);
188511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(tv.tv_usec);
188611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(tz.tz_minuteswest);
188711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(tz.tz_dsttime);
18880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
18890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
1890e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovTEST(MemorySanitizer, clock_gettime) {
1891e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  struct timespec tp;
1892e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_POISONED(tp.tv_sec);
1893e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_POISONED(tp.tv_nsec);
18942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, clock_gettime(CLOCK_REALTIME, &tp));
1895e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(tp.tv_sec);
1896e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(tp.tv_nsec);
1897e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov}
1898e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov
18997cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy StepanovTEST(MemorySanitizer, clock_getres) {
19007cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov  struct timespec tp;
19017cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov  EXPECT_POISONED(tp.tv_sec);
19027cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov  EXPECT_POISONED(tp.tv_nsec);
19032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, clock_getres(CLOCK_REALTIME, 0));
19047cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov  EXPECT_POISONED(tp.tv_sec);
19057cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov  EXPECT_POISONED(tp.tv_nsec);
19062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, clock_getres(CLOCK_REALTIME, &tp));
19077cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov  EXPECT_NOT_POISONED(tp.tv_sec);
19087cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov  EXPECT_NOT_POISONED(tp.tv_nsec);
19097cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov}
19107cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov
1911e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovTEST(MemorySanitizer, getitimer) {
1912e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  struct itimerval it1, it2;
1913e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  int res;
1914e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_POISONED(it1.it_interval.tv_sec);
1915e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_POISONED(it1.it_interval.tv_usec);
1916e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_POISONED(it1.it_value.tv_sec);
1917e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_POISONED(it1.it_value.tv_usec);
1918e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  res = getitimer(ITIMER_VIRTUAL, &it1);
19192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
1920e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(it1.it_interval.tv_sec);
1921e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(it1.it_interval.tv_usec);
1922e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(it1.it_value.tv_sec);
1923e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(it1.it_value.tv_usec);
1924e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov
1925e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  it1.it_interval.tv_sec = it1.it_value.tv_sec = 10000;
1926e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  it1.it_interval.tv_usec = it1.it_value.tv_usec = 0;
1927e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov
1928e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  res = setitimer(ITIMER_VIRTUAL, &it1, &it2);
19292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
1930e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(it2.it_interval.tv_sec);
1931e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(it2.it_interval.tv_usec);
1932e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(it2.it_value.tv_sec);
1933e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(it2.it_value.tv_usec);
1934e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov
1935e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  // Check that old_value can be 0, and disable the timer.
1936e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  memset(&it1, 0, sizeof(it1));
1937e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  res = setitimer(ITIMER_VIRTUAL, &it1, 0);
19382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
1939e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov}
1940e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov
194139d68edd461abb5058a4b96fd16f1741ad89bba7Evgeniy StepanovTEST(MemorySanitizer, setitimer_null) {
194239d68edd461abb5058a4b96fd16f1741ad89bba7Evgeniy Stepanov  setitimer(ITIMER_VIRTUAL, 0, 0);
194339d68edd461abb5058a4b96fd16f1741ad89bba7Evgeniy Stepanov  // Not testing the return value, since it the behaviour seems to differ
194439d68edd461abb5058a4b96fd16f1741ad89bba7Evgeniy Stepanov  // between libc implementations and POSIX.
194539d68edd461abb5058a4b96fd16f1741ad89bba7Evgeniy Stepanov  // Should never crash, though.
194639d68edd461abb5058a4b96fd16f1741ad89bba7Evgeniy Stepanov}
194739d68edd461abb5058a4b96fd16f1741ad89bba7Evgeniy Stepanov
1948fef660506e9e5703fedfee01d614abd4b741c738Evgeniy StepanovTEST(MemorySanitizer, time) {
1949fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov  time_t t;
1950fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov  EXPECT_POISONED(t);
1951fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov  time_t t2 = time(&t);
19522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_NE(t2, (time_t)-1);
1953fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov  EXPECT_NOT_POISONED(t);
1954fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov}
1955fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov
1956e4f9f8a1296768a7a6b6646a3b241a379f4a5e15Evgeniy StepanovTEST(MemorySanitizer, strptime) {
1957e4f9f8a1296768a7a6b6646a3b241a379f4a5e15Evgeniy Stepanov  struct tm time;
1958e4f9f8a1296768a7a6b6646a3b241a379f4a5e15Evgeniy Stepanov  char *p = strptime("11/1/2013-05:39", "%m/%d/%Y-%H:%M", &time);
19592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(p != NULL);
1960e4f9f8a1296768a7a6b6646a3b241a379f4a5e15Evgeniy Stepanov  EXPECT_NOT_POISONED(time.tm_sec);
1961e4f9f8a1296768a7a6b6646a3b241a379f4a5e15Evgeniy Stepanov  EXPECT_NOT_POISONED(time.tm_hour);
1962e4f9f8a1296768a7a6b6646a3b241a379f4a5e15Evgeniy Stepanov  EXPECT_NOT_POISONED(time.tm_year);
1963e4f9f8a1296768a7a6b6646a3b241a379f4a5e15Evgeniy Stepanov}
1964e4f9f8a1296768a7a6b6646a3b241a379f4a5e15Evgeniy Stepanov
19659358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy StepanovTEST(MemorySanitizer, localtime) {
19669358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  time_t t = 123;
19679358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  struct tm *time = localtime(&t);
19682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(time != NULL);
19699358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  EXPECT_NOT_POISONED(time->tm_sec);
19709358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  EXPECT_NOT_POISONED(time->tm_hour);
19719358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  EXPECT_NOT_POISONED(time->tm_year);
19729358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  EXPECT_NOT_POISONED(time->tm_isdst);
19732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NE(0U, strlen(time->tm_zone));
19749358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov}
19759358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov
19769358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy StepanovTEST(MemorySanitizer, localtime_r) {
19779358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  time_t t = 123;
19789358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  struct tm time;
19799358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  struct tm *res = localtime_r(&t, &time);
19802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(res != NULL);
19819358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  EXPECT_NOT_POISONED(time.tm_sec);
19829358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  EXPECT_NOT_POISONED(time.tm_hour);
19839358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  EXPECT_NOT_POISONED(time.tm_year);
19849358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  EXPECT_NOT_POISONED(time.tm_isdst);
19852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NE(0U, strlen(time.tm_zone));
19869358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov}
19879358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov
19884d7297daef90ad59446250617b72d184141436fcEvgeniy StepanovTEST(MemorySanitizer, getmntent) {
19894d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  FILE *fp = setmntent("/etc/fstab", "r");
19904d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  struct mntent *mnt = getmntent(fp);
19912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(mnt != NULL);
19922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_NE(0U, strlen(mnt->mnt_fsname));
19932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_NE(0U, strlen(mnt->mnt_dir));
19942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_NE(0U, strlen(mnt->mnt_type));
19952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_NE(0U, strlen(mnt->mnt_opts));
19964d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  EXPECT_NOT_POISONED(mnt->mnt_freq);
19974d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  EXPECT_NOT_POISONED(mnt->mnt_passno);
19984d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  fclose(fp);
19994d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov}
20004d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov
20014d7297daef90ad59446250617b72d184141436fcEvgeniy StepanovTEST(MemorySanitizer, getmntent_r) {
20024d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  FILE *fp = setmntent("/etc/fstab", "r");
20034d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  struct mntent mntbuf;
20044d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  char buf[1000];
20054d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  struct mntent *mnt = getmntent_r(fp, &mntbuf, buf, sizeof(buf));
20062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(mnt != NULL);
20072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_NE(0U, strlen(mnt->mnt_fsname));
20082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_NE(0U, strlen(mnt->mnt_dir));
20092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_NE(0U, strlen(mnt->mnt_type));
20102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_NE(0U, strlen(mnt->mnt_opts));
20114d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  EXPECT_NOT_POISONED(mnt->mnt_freq);
20124d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  EXPECT_NOT_POISONED(mnt->mnt_passno);
20134d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  fclose(fp);
20144d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov}
20154d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov
2016369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy StepanovTEST(MemorySanitizer, ether) {
2017369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov  const char *asc = "11:22:33:44:55:66";
2018369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov  struct ether_addr *paddr = ether_aton(asc);
2019369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov  EXPECT_NOT_POISONED(*paddr);
2020369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov
2021369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov  struct ether_addr addr;
2022369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov  paddr = ether_aton_r(asc, &addr);
2023369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov  ASSERT_EQ(paddr, &addr);
2024369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov  EXPECT_NOT_POISONED(addr);
2025369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov
2026369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov  char *s = ether_ntoa(&addr);
20272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_NE(0U, strlen(s));
2028369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov
2029369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov  char buf[100];
2030369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov  s = ether_ntoa_r(&addr, buf);
2031369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov  ASSERT_EQ(s, buf);
20322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_NE(0U, strlen(buf));
2033369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov}
2034369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov
20350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, mmap) {
20360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  const int size = 4096;
20370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  void *p1, *p2;
20380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  p1 = mmap(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0);
20390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(p1, size);
20400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  munmap(p1, size);
20410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  for (int i = 0; i < 1000; i++) {
20420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    p2 = mmap(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0);
20430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    if (p2 == p1)
20440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      break;
20450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    else
20460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      munmap(p2, size);
20470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  }
20480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (p1 == p2) {
204911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov    EXPECT_NOT_POISONED(*(char*)p2);
20500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    munmap(p2, size);
20510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  }
20520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
20530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
20540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// FIXME: enable and add ecvt.
20550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// FIXME: check why msandr does nt handle fcvt.
20560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, fcvt) {
20570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int a, b;
205812c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&a);
205912c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&b);
206011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(a);
206111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(b);
20620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char *str = fcvt(12345.6789, 10, &a, &b);
206311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(a);
206411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(b);
20650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
20660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
20672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, memchr) {
20682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  char x[10];
20692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  break_optimization(x);
20702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(x[0]);
20712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  x[2] = '2';
20722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  void *res;
20732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_UMR(res = memchr(x, '2', 10));
20742d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(res);
20752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  x[0] = '0';
20762d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  x[1] = '1';
20772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  res = memchr(x, '2', 10);
20782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_EQ(&x[2], res);
20792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_UMR(res = memchr(x, '3', 10));
20802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(res);
20812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
20822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
20832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, memrchr) {
20842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  char x[10];
20852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  break_optimization(x);
20862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(x[0]);
20872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  x[9] = '9';
20882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  void *res;
20892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_UMR(res = memrchr(x, '9', 10));
20902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(res);
20912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  x[0] = '0';
20922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  x[1] = '1';
20932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  res = memrchr(x, '0', 2);
20942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_EQ(&x[0], res);
20952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_UMR(res = memrchr(x, '7', 10));
20962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(res);
20972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
20982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
20997cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy StepanovTEST(MemorySanitizer, frexp) {
21007cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  int x;
21017cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  x = *GetPoisoned<int>();
21027cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  double r = frexp(1.1, &x);
21037cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  EXPECT_NOT_POISONED(r);
21047cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  EXPECT_NOT_POISONED(x);
21057cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov
21067cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  x = *GetPoisoned<int>();
21077cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  float rf = frexpf(1.1, &x);
21087cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  EXPECT_NOT_POISONED(rf);
21097cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  EXPECT_NOT_POISONED(x);
21107cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov
21117cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  x = *GetPoisoned<int>();
21127cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  double rl = frexpl(1.1, &x);
21137cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  EXPECT_NOT_POISONED(rl);
21147cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  EXPECT_NOT_POISONED(x);
21157cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov}
21167cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov
211706658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanovnamespace {
211806658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov
211906658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanovstatic int cnt;
212006658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov
212106658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanovvoid SigactionHandler(int signo, siginfo_t* si, void* uc) {
21222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(signo, SIGPROF);
21232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(si != NULL);
212406658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  EXPECT_NOT_POISONED(si->si_errno);
212506658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  EXPECT_NOT_POISONED(si->si_pid);
212606658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov#if __linux__
212706658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov# if defined(__x86_64__)
212806658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  EXPECT_NOT_POISONED(((ucontext_t*)uc)->uc_mcontext.gregs[REG_RIP]);
212906658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov# elif defined(__i386__)
213006658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  EXPECT_NOT_POISONED(((ucontext_t*)uc)->uc_mcontext.gregs[REG_EIP]);
213106658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov# endif
213206658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov#endif
213306658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  ++cnt;
213406658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov}
213506658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov
213606658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy StepanovTEST(MemorySanitizer, sigaction) {
213706658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  struct sigaction act = {};
2138cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov  struct sigaction oldact = {};
21396d0b7f6c41bed64419dd74a8daf83de5e9f54de9Evgeniy Stepanov  struct sigaction origact = {};
21406d0b7f6c41bed64419dd74a8daf83de5e9f54de9Evgeniy Stepanov
21416d0b7f6c41bed64419dd74a8daf83de5e9f54de9Evgeniy Stepanov  sigaction(SIGPROF, 0, &origact);
21426d0b7f6c41bed64419dd74a8daf83de5e9f54de9Evgeniy Stepanov
214306658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  act.sa_flags |= SA_SIGINFO;
214406658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  act.sa_sigaction = &SigactionHandler;
214506658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  sigaction(SIGPROF, &act, 0);
214606658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov
214706658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  kill(getpid(), SIGPROF);
214806658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov
214906658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  act.sa_flags &= ~SA_SIGINFO;
215006658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  act.sa_handler = SIG_DFL;
215106658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  sigaction(SIGPROF, &act, 0);
215206658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov
215306658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  act.sa_flags &= ~SA_SIGINFO;
215406658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  act.sa_handler = SIG_IGN;
2155cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov  sigaction(SIGPROF, &act, &oldact);
2156cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov  EXPECT_FALSE(oldact.sa_flags & SA_SIGINFO);
2157cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov  EXPECT_EQ(SIG_DFL, oldact.sa_handler);
215806658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  kill(getpid(), SIGPROF);
215906658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov
216006658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  act.sa_flags |= SA_SIGINFO;
216106658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  act.sa_sigaction = &SigactionHandler;
2162cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov  sigaction(SIGPROF, &act, &oldact);
2163cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov  EXPECT_FALSE(oldact.sa_flags & SA_SIGINFO);
2164cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov  EXPECT_EQ(SIG_IGN, oldact.sa_handler);
216506658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  kill(getpid(), SIGPROF);
216606658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov
216706658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  act.sa_flags &= ~SA_SIGINFO;
216806658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  act.sa_handler = SIG_DFL;
2169cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov  sigaction(SIGPROF, &act, &oldact);
2170cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov  EXPECT_TRUE(oldact.sa_flags & SA_SIGINFO);
2171cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov  EXPECT_EQ(&SigactionHandler, oldact.sa_sigaction);
217206658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  EXPECT_EQ(2, cnt);
21736d0b7f6c41bed64419dd74a8daf83de5e9f54de9Evgeniy Stepanov
21746d0b7f6c41bed64419dd74a8daf83de5e9f54de9Evgeniy Stepanov  sigaction(SIGPROF, &origact, 0);
217506658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov}
217606658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov
217706658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov} // namespace
217806658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov
21799a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov
21809a949a8909f652b28e9084de785c848743139fd5Evgeniy StepanovTEST(MemorySanitizer, sigemptyset) {
21819a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  sigset_t s;
21829a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  EXPECT_POISONED(s);
21839a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  int res = sigemptyset(&s);
21849a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  ASSERT_EQ(0, res);
21859a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  EXPECT_NOT_POISONED(s);
21869a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov}
21879a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov
21889a949a8909f652b28e9084de785c848743139fd5Evgeniy StepanovTEST(MemorySanitizer, sigfillset) {
21899a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  sigset_t s;
21909a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  EXPECT_POISONED(s);
21919a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  int res = sigfillset(&s);
21929a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  ASSERT_EQ(0, res);
21939a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  EXPECT_NOT_POISONED(s);
21949a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov}
21959a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov
21969a949a8909f652b28e9084de785c848743139fd5Evgeniy StepanovTEST(MemorySanitizer, sigpending) {
21979a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  sigset_t s;
21989a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  EXPECT_POISONED(s);
21999a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  int res = sigpending(&s);
22009a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  ASSERT_EQ(0, res);
22019a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  EXPECT_NOT_POISONED(s);
22029a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov}
22039a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov
22049a949a8909f652b28e9084de785c848743139fd5Evgeniy StepanovTEST(MemorySanitizer, sigprocmask) {
22059a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  sigset_t s;
22069a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  EXPECT_POISONED(s);
22079a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  int res = sigprocmask(SIG_BLOCK, 0, &s);
22089a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  ASSERT_EQ(0, res);
22099a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  EXPECT_NOT_POISONED(s);
22109a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov}
22119a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov
22120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct StructWithDtor {
22130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ~StructWithDtor();
22140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
22150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
22160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE StructWithDtor::~StructWithDtor() {
221712c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(0);
22180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
22190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
22200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Invoke) {
22210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StructWithDtor s;  // Will cause the calls to become invokes.
222211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(0);
222311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<int>());
222411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(0);
222511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<int>());
222611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(ReturnPoisoned<S4>());
22270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
22280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
22290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, ptrtoint) {
22300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // Test that shadow is propagated through pointer-to-integer conversion.
22310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  void* p = (void*)0xABCD;
22320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(((char*)&p) + 1, sizeof(p));
2233250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  EXPECT_NOT_POISONED((((uintptr_t)p) & 0xFF) == 0);
22340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
22350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  void* q = (void*)0xABCD;
22360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&q, sizeof(q) - 1);
2237250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  EXPECT_POISONED((((uintptr_t)q) & 0xFF) == 0);
22380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
22390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
22400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn2(int guard, ...) {
22410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl;
22420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_start(vl, guard);
224311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
224411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
224511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
224611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, double));
22470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_end(vl);
22480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
22490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
22500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn(int guard, ...) {
22510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl;
22520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_start(vl, guard);
225311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
225411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
22550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // The following call will overwrite __msan_param_tls.
22560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // Checks after it test that arg shadow was somehow saved across the call.
22570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  vaargsfn2(1, 2, 3, 4, *GetPoisoned<double>());
225811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
225911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
22600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_end(vl);
22610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
22620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
22630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, VAArgTest) {
22640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* x = GetPoisoned<int>();
22650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* y = GetPoisoned<int>(4);
22660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  vaargsfn(1, 13, *x, 42, *y);
22670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
22680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
22690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_many(int guard, ...) {
22700231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl;
22710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_start(vl, guard);
227211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
227311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
227411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
227511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
227611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
227711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
227811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
227911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
228011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
228111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
22820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_end(vl);
22830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
22840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
22850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, VAArgManyTest) {
22860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* x = GetPoisoned<int>();
22870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* y = GetPoisoned<int>(4);
22880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  vaargsfn_many(1, 2, *x, 3, 4, 5, 6, 7, 8, 9, *y);
22890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
22900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
22910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_pass2(va_list vl) {
229211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
229311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
229411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
22950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
22960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
22970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_pass(int guard, ...) {
22980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl;
22990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_start(vl, guard);
230011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
23010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  vaargsfn_pass2(vl);
23020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_end(vl);
23030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
23040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
23050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, VAArgPass) {
23060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* x = GetPoisoned<int>();
23070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* y = GetPoisoned<int>(4);
23080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  vaargsfn_pass(1, *x, 2, 3, *y);
23090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
23100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
23110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_copy2(va_list vl) {
231211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
231311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
23140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
23150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
23160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_copy(int guard, ...) {
23170231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl;
23180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_start(vl, guard);
231911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
232011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
23210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl2;
23220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_copy(vl2, vl);
23230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  vaargsfn_copy2(vl2);
232411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
232511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
23260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_end(vl);
23270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
23280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
23290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, VAArgCopy) {
23300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* x = GetPoisoned<int>();
23310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* y = GetPoisoned<int>(4);
23320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  vaargsfn_copy(1, 2, *x, 3, *y);
23330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
23340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
23350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_ptr(int guard, ...) {
23360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl;
23370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_start(vl, guard);
233811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int*));
233911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int*));
234011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int*));
234111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, double*));
23420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_end(vl);
23430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
23440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
23450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, VAArgPtr) {
23460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int** x = GetPoisoned<int*>();
23470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  double** y = GetPoisoned<double*>(8);
23480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int z;
23490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  vaargsfn_ptr(1, &z, *x, &z, *y);
23500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
23510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
23520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_overflow(int guard, ...) {
23530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl;
23540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_start(vl, guard);
235511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
235611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
235711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
235811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
235911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
236011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
236111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
236211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, double));
236311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, double));
236411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, double));
236511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, double));
236611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, double));
236711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int*));
236811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, double));
236911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, double));
237011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
237111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
237211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, double));
237311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int*));
237411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
237511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
237611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, double));
237711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int*));
237811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
237911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
238011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, double));
238111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int*));
23820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
23830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_end(vl);
23840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
23850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
23860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, VAArgOverflow) {
23870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* x = GetPoisoned<int>();
23880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  double* y = GetPoisoned<double>(8);
23890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int** p = GetPoisoned<int*>(16);
23900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int z;
23910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  vaargsfn_overflow(1,
23920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      1, 2, *x, 4, 5, 6,
23930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      1.1, 2.2, 3.3, *y, 5.5, *p, 7.7, 8.8,
23940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      // the following args will overflow for sure
23950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      *x, *y, *p,
23960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      7, 9.9, &z,
23970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      *x, *y, *p);
23980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
23990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
24000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_tlsoverwrite2(int guard, ...) {
24010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl;
24020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_start(vl, guard);
24033c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov  for (int i = 0; i < 20; ++i)
24043c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov    EXPECT_NOT_POISONED(va_arg(vl, int));
24050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_end(vl);
24060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
24070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
24080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_tlsoverwrite(int guard, ...) {
24090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // This call will overwrite TLS contents unless it's backed up somewhere.
24103c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov  vaargsfn_tlsoverwrite2(2,
24113c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov      42, 42, 42, 42, 42,
24123c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov      42, 42, 42, 42, 42,
24133c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov      42, 42, 42, 42, 42,
24143c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov      42, 42, 42, 42, 42); // 20x
24150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl;
24160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_start(vl, guard);
24173c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov  for (int i = 0; i < 20; ++i)
24183c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov    EXPECT_POISONED(va_arg(vl, int));
24190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_end(vl);
24200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
24210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
24220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, VAArgTLSOverwrite) {
24230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* x = GetPoisoned<int>();
24243c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov  vaargsfn_tlsoverwrite(1,
24253c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov      *x, *x, *x, *x, *x,
24263c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov      *x, *x, *x, *x, *x,
24273c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov      *x, *x, *x, *x, *x,
24283c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov      *x, *x, *x, *x, *x); // 20x
24293c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov
24300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
24310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
24320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct StructByVal {
24330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int a, b, c, d, e, f;
24340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
24350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
24362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesstatic void vaargsfn_structbyval(int guard, ...) {
24372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  va_list vl;
24382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  va_start(vl, guard);
24392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  {
24402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    StructByVal s = va_arg(vl, StructByVal);
24412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    EXPECT_NOT_POISONED(s.a);
24422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    EXPECT_POISONED(s.b);
24432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    EXPECT_NOT_POISONED(s.c);
24442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    EXPECT_POISONED(s.d);
24452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    EXPECT_NOT_POISONED(s.e);
24462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    EXPECT_POISONED(s.f);
24472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  }
24482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  {
24492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    StructByVal s = va_arg(vl, StructByVal);
24502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    EXPECT_NOT_POISONED(s.a);
24512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    EXPECT_POISONED(s.b);
24522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    EXPECT_NOT_POISONED(s.c);
24532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    EXPECT_POISONED(s.d);
24542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    EXPECT_NOT_POISONED(s.e);
24552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    EXPECT_POISONED(s.f);
24562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  }
24572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  va_end(vl);
24582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
24592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
24602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, VAArgStructByVal) {
24612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  StructByVal s;
24622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  s.a = 1;
24632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  s.b = *GetPoisoned<int>();
24642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  s.c = 2;
24652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  s.d = *GetPoisoned<int>();
24662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  s.e = 3;
24672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  s.f = *GetPoisoned<int>();
24682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  vaargsfn_structbyval(0, s, s);
24692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
24702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
24710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE void StructByValTestFunc(struct StructByVal s) {
247211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s.a);
247311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s.b);
247411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s.c);
247511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s.d);
247611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s.e);
247711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s.f);
24780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
24790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
24800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE void StructByValTestFunc1(struct StructByVal s) {
24810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StructByValTestFunc(s);
24820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
24830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
24840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE void StructByValTestFunc2(int z, struct StructByVal s) {
24850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StructByValTestFunc(s);
24860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
24870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
24880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, StructByVal) {
24890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // Large aggregates are passed as "byval" pointer argument in LLVM.
24900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  struct StructByVal s;
24910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  s.a = 1;
24920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  s.b = *GetPoisoned<int>();
24930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  s.c = 2;
24940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  s.d = *GetPoisoned<int>();
24950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  s.e = 3;
24960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  s.f = *GetPoisoned<int>();
24970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StructByValTestFunc(s);
24980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StructByValTestFunc1(s);
24990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StructByValTestFunc2(0, s);
25000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
25010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
25020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
25030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#if MSAN_HAS_M128
2504b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy StepanovNOINLINE __m128i m128Eq(__m128i *a, __m128i *b) { return _mm_cmpeq_epi16(*a, *b); }
2505b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy StepanovNOINLINE __m128i m128Lt(__m128i *a, __m128i *b) { return _mm_cmplt_epi16(*a, *b); }
25060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, m128) {
25070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __m128i a = _mm_set1_epi16(0x1234);
25080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __m128i b = _mm_set1_epi16(0x7890);
250911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(m128Eq(&a, &b));
251011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(m128Lt(&a, &b));
25110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
25120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// FIXME: add more tests for __m128i.
25130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#endif  // MSAN_HAS_M128
25140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
25150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// We should not complain when copying this poisoned hole.
25160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct StructWithHole {
25170231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U4  a;
25180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // 4-byte hole.
25190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U8  b;
25200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
25210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
25220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE StructWithHole ReturnStructWithHole() {
25230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StructWithHole res;
25240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&res, sizeof(res));
25250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.a = 1;
25260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.b = 2;
25270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return res;
25280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
25290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
25300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, StructWithHole) {
25310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StructWithHole a = ReturnStructWithHole();
253212c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&a);
25330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
25340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
25350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate <class T>
25360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE T ReturnStruct() {
25370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T res;
25380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&res, sizeof(res));
25390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.a = 1;
25400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return res;
25410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
25420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
25430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate <class T>
25440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE void TestReturnStruct() {
25450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T s1 = ReturnStruct<T>();
254611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s1.a);
254711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s1.b);
25480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
25490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
25500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS1 {
25510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int a, b, c;
25520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
25530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS2 {
25540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int b, a, c;
25550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
25560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS3 {
25570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int b, c, a;
25580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
25590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS4 {
25600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int c, b, a;
25610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
25620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
25630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS5 {
25640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int a;
25650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  float b;
25660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
25670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS6 {
25680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int a;
25690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  double b;
25700231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
25710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS7 {
25720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S8 b;
25730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int a;
25740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
25750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS8 {
25760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S2 b;
25770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S8 a;
25780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
25790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
25800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, IntStruct3) {
25810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestReturnStruct<SSS1>();
25820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestReturnStruct<SSS2>();
25830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestReturnStruct<SSS3>();
25840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestReturnStruct<SSS4>();
25850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestReturnStruct<SSS5>();
25860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestReturnStruct<SSS6>();
25870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestReturnStruct<SSS7>();
25880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestReturnStruct<SSS8>();
25890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
25900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
25910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct LongStruct {
25920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U1 a1, b1;
25930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U2 a2, b2;
25940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U4 a4, b4;
25950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U8 a8, b8;
25960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
25970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
25980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE LongStruct ReturnLongStruct1() {
25990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  LongStruct res;
26000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&res, sizeof(res));
26010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.a1 = res.a2 = res.a4 = res.a8 = 111;
26020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // leaves b1, .., b8 poisoned.
26030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return res;
26040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
26050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
26060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE LongStruct ReturnLongStruct2() {
26070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  LongStruct res;
26080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&res, sizeof(res));
26090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.b1 = res.b2 = res.b4 = res.b8 = 111;
26100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // leaves a1, .., a8 poisoned.
26110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return res;
26120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
26130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
26140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, LongStruct) {
26150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  LongStruct s1 = ReturnLongStruct1();
26160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_print_shadow(&s1, sizeof(s1));
261711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s1.a1);
261811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s1.a2);
261911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s1.a4);
262011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s1.a8);
26210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
262211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s1.b1);
262311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s1.b2);
262411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s1.b4);
262511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s1.b8);
26260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
26270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  LongStruct s2 = ReturnLongStruct2();
26280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_print_shadow(&s2, sizeof(s2));
262911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s2.b1);
263011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s2.b2);
263111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s2.b4);
263211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s2.b8);
26330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
263411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s2.a1);
263511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s2.a2);
263611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s2.a4);
263711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s2.a8);
26380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
26390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
26400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, getrlimit) {
26410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  struct rlimit limit;
26420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&limit, sizeof(limit));
26430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int result = getrlimit(RLIMIT_DATA, &limit);
26442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(result, 0);
26452bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov  EXPECT_NOT_POISONED(limit.rlim_cur);
26462bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov  EXPECT_NOT_POISONED(limit.rlim_max);
26470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
26480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2649e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy StepanovTEST(MemorySanitizer, getrusage) {
2650e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  struct rusage usage;
2651e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  __msan_poison(&usage, sizeof(usage));
2652e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  int result = getrusage(RUSAGE_SELF, &usage);
26532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(result, 0);
265411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_utime.tv_sec);
265511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_utime.tv_usec);
265611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_stime.tv_sec);
265711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_stime.tv_usec);
265811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_maxrss);
265911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_minflt);
266011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_majflt);
266111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_inblock);
266211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_oublock);
266311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_nvcsw);
266411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_nivcsw);
2665e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov}
2666e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov
26671aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov#ifdef __GLIBC__
2668e6c62f2271c25567ac0bbbe68c7323b49330373cEvgeniy Stepanovextern char *program_invocation_name;
26691aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov#else  // __GLIBC__
26701aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov# error "TODO: port this"
26711aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov#endif
26721aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov
2673e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanovstatic void dladdr_testfn() {}
2674e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov
2675e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy StepanovTEST(MemorySanitizer, dladdr) {
2676e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  Dl_info info;
2677e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  __msan_poison(&info, sizeof(info));
2678e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  int result = dladdr((const void*)dladdr_testfn, &info);
26792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_NE(result, 0);
268011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED((unsigned long)info.dli_fname);
2681e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  if (info.dli_fname)
268211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov    EXPECT_NOT_POISONED(strlen(info.dli_fname));
268311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED((unsigned long)info.dli_fbase);
268411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED((unsigned long)info.dli_sname);
2685e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  if (info.dli_sname)
268611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov    EXPECT_NOT_POISONED(strlen(info.dli_sname));
268711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED((unsigned long)info.dli_saddr);
2688e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov}
2689e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov
269008104e6f77f4e5279f8cb4a74784ffb7afd5073fEvgeniy Stepanov#ifndef MSAN_TEST_DISABLE_DLOPEN
269108104e6f77f4e5279f8cb4a74784ffb7afd5073fEvgeniy Stepanov
26922bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanovstatic int dl_phdr_callback(struct dl_phdr_info *info, size_t size, void *data) {
26932bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov  (*(int *)data)++;
26942bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov  EXPECT_NOT_POISONED(info->dlpi_addr);
26952bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov  EXPECT_NOT_POISONED(strlen(info->dlpi_name));
26962bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov  EXPECT_NOT_POISONED(info->dlpi_phnum);
26972bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov  for (int i = 0; i < info->dlpi_phnum; ++i)
26982bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov    EXPECT_NOT_POISONED(info->dlpi_phdr[i]);
26992bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov  return 0;
27002bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov}
27012bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov
2702263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov// Compute the path to our loadable DSO.  We assume it's in the same
2703263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov// directory.  Only use string routines that we intercept so far to do this.
2704263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanovstatic int PathToLoadable(char *buf, size_t sz) {
2705263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov  const char *basename = "libmsan_loadable.x86_64.so";
2706263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov  char *argv0 = program_invocation_name;
2707263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov  char *last_slash = strrchr(argv0, '/');
2708263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov  assert(last_slash);
2709263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov  int res =
2710263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov      snprintf(buf, sz, "%.*s/%s", int(last_slash - argv0), argv0, basename);
27112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  assert(res >= 0);
27122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  return (size_t)res < sz ? 0 : res;
2713263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov}
2714263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov
27152bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy StepanovTEST(MemorySanitizer, dl_iterate_phdr) {
27161aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov  char path[4096];
27171aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov  int res = PathToLoadable(path, sizeof(path));
27182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
27191aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov
27201aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov  // Having at least one dlopen'ed library in the process makes this more
27211aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov  // entertaining.
27221aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov  void *lib = dlopen(path, RTLD_LAZY);
27231aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov  ASSERT_NE((void*)0, lib);
27241aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov
27252bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov  int count = 0;
27262bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov  int result = dl_iterate_phdr(dl_phdr_callback, &count);
27272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_GT(count, 0);
27281aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov
27291aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov  dlclose(lib);
27302bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov}
27312bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov
27320f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner
27330f92deb81207c80481ff0257fbaba640fe669633Reid KlecknerTEST(MemorySanitizer, dlopen) {
27341aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov  char path[4096];
27351aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov  int res = PathToLoadable(path, sizeof(path));
27362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
27370f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner
27380f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  // We need to clear shadow for globals when doing dlopen.  In order to test
27390f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  // this, we have to poison the shadow for the DSO before we load it.  In
27400f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  // general this is difficult, but the loader tends to reload things in the
27410f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  // same place, so we open, close, and then reopen.  The global should always
27420f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  // start out clean after dlopen.
27430f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  for (int i = 0; i < 2; i++) {
27440f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner    void *lib = dlopen(path, RTLD_LAZY);
27450f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner    if (lib == NULL) {
27460f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner      printf("dlerror: %s\n", dlerror());
27472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      ASSERT_TRUE(lib != NULL);
27480f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner    }
27490f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner    void **(*get_dso_global)() = (void **(*)())dlsym(lib, "get_dso_global");
27502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    ASSERT_TRUE(get_dso_global != NULL);
27510f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner    void **dso_global = get_dso_global();
27520f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner    EXPECT_NOT_POISONED(*dso_global);
27530f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner    __msan_poison(dso_global, sizeof(*dso_global));
27540f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner    EXPECT_POISONED(*dso_global);
27550f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner    dlclose(lib);
27560f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  }
27570f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner}
27586c503b9c7b0ad08fba74dbed309447d75de9a157Evgeniy Stepanov
27596c503b9c7b0ad08fba74dbed309447d75de9a157Evgeniy Stepanov// Regression test for a crash in dlopen() interceptor.
27606c503b9c7b0ad08fba74dbed309447d75de9a157Evgeniy StepanovTEST(MemorySanitizer, dlopenFailed) {
27616c503b9c7b0ad08fba74dbed309447d75de9a157Evgeniy Stepanov  const char *path = "/libmsan_loadable_does_not_exist.x86_64.so";
27626c503b9c7b0ad08fba74dbed309447d75de9a157Evgeniy Stepanov  void *lib = dlopen(path, RTLD_LAZY);
27632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(lib == NULL);
27646c503b9c7b0ad08fba74dbed309447d75de9a157Evgeniy Stepanov}
27650f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner
2766263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov#endif // MSAN_TEST_DISABLE_DLOPEN
2767263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov
276884ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy StepanovTEST(MemorySanitizer, sched_getaffinity) {
276984ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov  cpu_set_t mask;
277084ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov  int res = sched_getaffinity(getpid(), sizeof(mask), &mask);
277184ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov  ASSERT_EQ(0, res);
277284ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov  EXPECT_NOT_POISONED(mask);
277384ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov}
277484ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov
2775996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy StepanovTEST(MemorySanitizer, scanf) {
2776996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  const char *input = "42 hello";
2777996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  int* d = new int;
2778996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  char* s = new char[7];
2779996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  int res = sscanf(input, "%d %5s", d, s);
2780996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  printf("res %d\n", res);
27812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(res, 2);
278211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*d);
278311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s[0]);
278411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s[1]);
278511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s[2]);
278611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s[3]);
278711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s[4]);
278811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s[5]);
278911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s[6]);
2790996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  delete s;
2791996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  delete d;
2792996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov}
2793996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov
2794b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanovstatic void *SimpleThread_threadfn(void* data) {
27950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return new int;
27960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
27970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
27980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, SimpleThread) {
27990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  pthread_t t;
2800b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  void *p;
28010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = pthread_create(&t, NULL, SimpleThread_threadfn, NULL);
28022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
2803e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(t);
28040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res = pthread_join(t, &p);
28052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
28066567092b06b37195cd93d57204bcbfe6843b2a48Evgeniy Stepanov  EXPECT_NOT_POISONED(p);
28070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete (int*)p;
28080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
28090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2810b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanovstatic void *SmallStackThread_threadfn(void* data) {
281110fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  return 0;
281210fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov}
281310fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov
281410fd3227546d17c7411241a45ebc143b2031c78dEvgeniy StepanovTEST(MemorySanitizer, SmallStackThread) {
281510fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  pthread_attr_t attr;
281610fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  pthread_t t;
2817b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  void *p;
281810fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  int res;
281910fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  res = pthread_attr_init(&attr);
282010fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  ASSERT_EQ(0, res);
282110fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  res = pthread_attr_setstacksize(&attr, 64 * 1024);
282210fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  ASSERT_EQ(0, res);
2823b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  res = pthread_create(&t, &attr, SmallStackThread_threadfn, NULL);
282410fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  ASSERT_EQ(0, res);
282510fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  res = pthread_join(t, &p);
282610fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  ASSERT_EQ(0, res);
282710fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  res = pthread_attr_destroy(&attr);
2828b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  ASSERT_EQ(0, res);
2829b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov}
2830b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov
28312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, SmallPreAllocatedStackThread) {
2832b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  pthread_attr_t attr;
2833b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  pthread_t t;
2834b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  int res;
2835b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  res = pthread_attr_init(&attr);
2836b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  ASSERT_EQ(0, res);
2837b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  void *stack;
28382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  const size_t kStackSize = 16 * 1024;
2839b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  res = posix_memalign(&stack, 4096, kStackSize);
2840b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  ASSERT_EQ(0, res);
2841b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  res = pthread_attr_setstack(&attr, stack, kStackSize);
2842b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  ASSERT_EQ(0, res);
2843b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  res = pthread_create(&t, &attr, SmallStackThread_threadfn, NULL);
28442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_EQ(0, res);
28452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  res = pthread_join(t, NULL);
28462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
2847b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  res = pthread_attr_destroy(&attr);
284810fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  ASSERT_EQ(0, res);
284910fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov}
285010fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov
2851e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy StepanovTEST(MemorySanitizer, pthread_attr_get) {
2852e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  pthread_attr_t attr;
2853e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  int res;
2854e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  res = pthread_attr_init(&attr);
2855e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  ASSERT_EQ(0, res);
2856e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  {
2857e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    int v;
2858e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    res = pthread_attr_getdetachstate(&attr, &v);
2859e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    ASSERT_EQ(0, res);
2860e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    EXPECT_NOT_POISONED(v);
2861e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  }
2862e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  {
2863e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    size_t v;
2864e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    res = pthread_attr_getguardsize(&attr, &v);
2865e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    ASSERT_EQ(0, res);
2866e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    EXPECT_NOT_POISONED(v);
2867e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  }
2868e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  {
2869e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    struct sched_param v;
2870e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    res = pthread_attr_getschedparam(&attr, &v);
2871e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    ASSERT_EQ(0, res);
2872e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    EXPECT_NOT_POISONED(v);
2873e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  }
2874e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  {
2875e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    int v;
2876e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    res = pthread_attr_getschedpolicy(&attr, &v);
2877e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    ASSERT_EQ(0, res);
2878e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    EXPECT_NOT_POISONED(v);
2879e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  }
2880e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  {
2881e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    int v;
2882e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    res = pthread_attr_getinheritsched(&attr, &v);
2883e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    ASSERT_EQ(0, res);
2884e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    EXPECT_NOT_POISONED(v);
2885e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  }
2886e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  {
2887e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    int v;
2888e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    res = pthread_attr_getscope(&attr, &v);
2889e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    ASSERT_EQ(0, res);
2890e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    EXPECT_NOT_POISONED(v);
2891e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  }
2892e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  {
2893e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    size_t v;
2894e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    res = pthread_attr_getstacksize(&attr, &v);
2895e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    ASSERT_EQ(0, res);
2896e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    EXPECT_NOT_POISONED(v);
2897e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  }
2898e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  {
2899e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    void *v;
2900e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    size_t w;
2901e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    res = pthread_attr_getstack(&attr, &v, &w);
2902e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    ASSERT_EQ(0, res);
2903e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    EXPECT_NOT_POISONED(v);
2904e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    EXPECT_NOT_POISONED(w);
2905e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  }
2906e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  {
2907e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    cpu_set_t v;
2908e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    res = pthread_attr_getaffinity_np(&attr, sizeof(v), &v);
2909e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    ASSERT_EQ(0, res);
2910e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov    EXPECT_NOT_POISONED(v);
2911e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  }
2912e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  res = pthread_attr_destroy(&attr);
2913e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov  ASSERT_EQ(0, res);
2914e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov}
2915e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov
291656d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy StepanovTEST(MemorySanitizer, pthread_getschedparam) {
291756d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov  int policy;
291856d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov  struct sched_param param;
291956d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov  int res = pthread_getschedparam(pthread_self(), &policy, &param);
292056d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov  ASSERT_EQ(0, res);
292156d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov  EXPECT_NOT_POISONED(policy);
292256d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov  EXPECT_NOT_POISONED(param.sched_priority);
292356d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov}
292456d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov
2925737da2f031badfad5bc5b762cc50d789fbcb6ef8Evgeniy StepanovTEST(MemorySanitizer, pthread_key_create) {
2926737da2f031badfad5bc5b762cc50d789fbcb6ef8Evgeniy Stepanov  pthread_key_t key;
2927737da2f031badfad5bc5b762cc50d789fbcb6ef8Evgeniy Stepanov  int res = pthread_key_create(&key, NULL);
29282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
2929737da2f031badfad5bc5b762cc50d789fbcb6ef8Evgeniy Stepanov  EXPECT_NOT_POISONED(key);
2930737da2f031badfad5bc5b762cc50d789fbcb6ef8Evgeniy Stepanov  res = pthread_key_delete(key);
29312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
2932737da2f031badfad5bc5b762cc50d789fbcb6ef8Evgeniy Stepanov}
2933737da2f031badfad5bc5b762cc50d789fbcb6ef8Evgeniy Stepanov
29345e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonovnamespace {
29355e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonovstruct SignalCondArg {
29365e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_cond_t* cond;
29375e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_mutex_t* mu;
2938fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov  bool broadcast;
29395e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov};
29405e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov
29415e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonovvoid *SignalCond(void *param) {
29425e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  SignalCondArg *arg = reinterpret_cast<SignalCondArg *>(param);
29435e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_mutex_lock(arg->mu);
2944fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov  if (arg->broadcast)
2945fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov    pthread_cond_broadcast(arg->cond);
2946fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov  else
2947fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov    pthread_cond_signal(arg->cond);
29485e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_mutex_unlock(arg->mu);
29495e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  return 0;
29505e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov}
29515e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov}  // namespace
29525e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov
29535e2d3776a314629680921abd1d55d89d95a2da90Alexey SamsonovTEST(MemorySanitizer, pthread_cond_wait) {
29545e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_cond_t cond;
29555e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_mutex_t mu;
2956fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov  SignalCondArg args = {&cond, &mu, false};
29575e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_cond_init(&cond, 0);
29585e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_mutex_init(&mu, 0);
29595e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_mutex_lock(&mu);
2960fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov
2961fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov  // signal
29625e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_t thr;
29635e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_create(&thr, 0, SignalCond, &args);
29645e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  int res = pthread_cond_wait(&cond, &mu);
29652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
29665e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_join(thr, 0);
2967fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov
2968fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov  // broadcast
2969fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov  args.broadcast = true;
2970fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov  pthread_create(&thr, 0, SignalCond, &args);
2971fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov  res = pthread_cond_wait(&cond, &mu);
29722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
2973fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov  pthread_join(thr, 0);
2974fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov
29755e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_mutex_unlock(&mu);
29765e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_mutex_destroy(&mu);
29775e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_cond_destroy(&cond);
29785e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov}
29795e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov
2980eada1a81188329b3f011311caed12ca4be4f639eEvgeniy StepanovTEST(MemorySanitizer, tmpnam) {
2981eada1a81188329b3f011311caed12ca4be4f639eEvgeniy Stepanov  char s[L_tmpnam];
2982eada1a81188329b3f011311caed12ca4be4f639eEvgeniy Stepanov  char *res = tmpnam(s);
2983eada1a81188329b3f011311caed12ca4be4f639eEvgeniy Stepanov  ASSERT_EQ(s, res);
2984eada1a81188329b3f011311caed12ca4be4f639eEvgeniy Stepanov  EXPECT_NOT_POISONED(strlen(res));
2985eada1a81188329b3f011311caed12ca4be4f639eEvgeniy Stepanov}
2986eada1a81188329b3f011311caed12ca4be4f639eEvgeniy Stepanov
2987eada1a81188329b3f011311caed12ca4be4f639eEvgeniy StepanovTEST(MemorySanitizer, tempnam) {
2988eada1a81188329b3f011311caed12ca4be4f639eEvgeniy Stepanov  char *res = tempnam(NULL, "zzz");
2989eada1a81188329b3f011311caed12ca4be4f639eEvgeniy Stepanov  EXPECT_NOT_POISONED(strlen(res));
2990eada1a81188329b3f011311caed12ca4be4f639eEvgeniy Stepanov  free(res);
2991eada1a81188329b3f011311caed12ca4be4f639eEvgeniy Stepanov}
2992eada1a81188329b3f011311caed12ca4be4f639eEvgeniy Stepanov
2993b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy StepanovTEST(MemorySanitizer, posix_memalign) {
2994b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy Stepanov  void *p;
2995b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy Stepanov  EXPECT_POISONED(p);
2996b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy Stepanov  int res = posix_memalign(&p, 4096, 13);
2997b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy Stepanov  ASSERT_EQ(0, res);
2998b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy Stepanov  EXPECT_NOT_POISONED(p);
299997160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  EXPECT_EQ(0U, (uintptr_t)p % 4096);
300097160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  free(p);
300197160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov}
300297160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov
300397160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy StepanovTEST(MemorySanitizer, memalign) {
300497160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  void *p = memalign(4096, 13);
300597160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  EXPECT_EQ(0U, (uintptr_t)p % kPageSize);
300697160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  free(p);
300797160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov}
300897160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov
300997160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy StepanovTEST(MemorySanitizer, valloc) {
301097160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  void *a = valloc(100);
301197160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  EXPECT_EQ(0U, (uintptr_t)a % kPageSize);
301297160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  free(a);
301397160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov}
301497160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov
301597160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy StepanovTEST(MemorySanitizer, pvalloc) {
301697160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  void *p = pvalloc(kPageSize + 100);
301797160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  EXPECT_EQ(0U, (uintptr_t)p % kPageSize);
30185d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_EQ(2 * kPageSize, __sanitizer_get_allocated_size(p));
301997160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  free(p);
302097160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov
302197160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  p = pvalloc(0);  // pvalloc(0) should allocate at least one page.
302297160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  EXPECT_EQ(0U, (uintptr_t)p % kPageSize);
30235d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_EQ(kPageSize, __sanitizer_get_allocated_size(p));
3024b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy Stepanov  free(p);
3025b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy Stepanov}
3026b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy Stepanov
30279530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy StepanovTEST(MemorySanitizer, inet_pton) {
30289530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov  const char *s = "1:0:0:0:0:0:0:8";
30299530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov  unsigned char buf[sizeof(struct in6_addr)];
30309530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov  int res = inet_pton(AF_INET6, s, buf);
30319530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov  ASSERT_EQ(1, res);
30329530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[0]);
30339530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[sizeof(struct in6_addr) - 1]);
30349530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov
30359530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov  char s_out[INET6_ADDRSTRLEN];
30369530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov  EXPECT_POISONED(s_out[3]);
30379530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov  const char *q = inet_ntop(AF_INET6, buf, s_out, INET6_ADDRSTRLEN);
30389530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov  ASSERT_NE((void*)0, q);
30399530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov  EXPECT_NOT_POISONED(s_out[3]);
30409530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov}
30419530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov
30429d60087654f89e3452841350d9eca97644edca9dEvgeniy StepanovTEST(MemorySanitizer, inet_aton) {
30439d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov  const char *s = "127.0.0.1";
30449d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov  struct in_addr in[2];
30459d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov  int res = inet_aton(s, in);
30469d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov  ASSERT_NE(0, res);
30479d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov  EXPECT_NOT_POISONED(in[0]);
30489d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov  EXPECT_POISONED(*(char *)(in + 1));
30499d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov}
30509d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov
30510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, uname) {
30520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  struct utsname u;
30530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = uname(&u);
30542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
305511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(strlen(u.sysname));
305611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(strlen(u.nodename));
305711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(strlen(u.release));
305811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(strlen(u.version));
305911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(strlen(u.machine));
30600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
30610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
306295d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy StepanovTEST(MemorySanitizer, gethostname) {
306395d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov  char buf[100];
306495d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov  int res = gethostname(buf, 100);
30652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
306695d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov  EXPECT_NOT_POISONED(strlen(buf));
306795d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov}
306895d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov
3069359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy StepanovTEST(MemorySanitizer, sysinfo) {
3070359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov  struct sysinfo info;
3071359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov  int res = sysinfo(&info);
30722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
3073359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov  EXPECT_NOT_POISONED(info);
3074359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov}
3075359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov
3076e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovTEST(MemorySanitizer, getpwuid) {
3077e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  struct passwd *p = getpwuid(0); // root
30782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(p != NULL);
3079e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(p->pw_name);
30802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(p->pw_name != NULL);
3081e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(p->pw_name[0]);
3082e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(p->pw_uid);
30832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0U, p->pw_uid);
30842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
30852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
30862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, getpwuid_r) {
30872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  struct passwd pwd;
30882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  struct passwd *pwdres;
30892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  char buf[10000];
30902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  int res = getpwuid_r(0, &pwd, buf, sizeof(buf), &pwdres);
30912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
30922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(pwd.pw_name);
30932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(pwd.pw_name != NULL);
30942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(pwd.pw_name[0]);
30952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(pwd.pw_uid);
30962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0U, pwd.pw_uid);
30972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(pwdres);
3098e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov}
3099e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov
3100e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovTEST(MemorySanitizer, getpwnam_r) {
3101e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  struct passwd pwd;
3102e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  struct passwd *pwdres;
3103e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  char buf[10000];
3104e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  int res = getpwnam_r("root", &pwd, buf, sizeof(buf), &pwdres);
31052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
3106e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(pwd.pw_name);
31072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(pwd.pw_name != NULL);
3108e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(pwd.pw_name[0]);
3109e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(pwd.pw_uid);
31102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0U, pwd.pw_uid);
31112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(pwdres);
3112e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov}
3113e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov
3114e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovTEST(MemorySanitizer, getpwnam_r_positive) {
3115e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  struct passwd pwd;
3116e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  struct passwd *pwdres;
3117e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  char s[5];
3118e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  strncpy(s, "abcd", 5);
3119e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  __msan_poison(s, 5);
3120e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  char buf[10000];
3121e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  int res;
3122e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_UMR(res = getpwnam_r(s, &pwd, buf, sizeof(buf), &pwdres));
3123e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov}
3124e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov
3125103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy StepanovTEST(MemorySanitizer, getgrnam_r) {
3126103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov  struct group grp;
3127103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov  struct group *grpres;
3128103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov  char buf[10000];
3129103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov  int res = getgrnam_r("root", &grp, buf, sizeof(buf), &grpres);
31302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
31312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(grp.gr_name);
31322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(grp.gr_name != NULL);
31332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(grp.gr_name[0]);
31342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(grp.gr_gid);
31352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(grpres);
31362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
31372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
31382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, getpwent) {
31392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  setpwent();
31402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  struct passwd *p = getpwent();
31412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(p != NULL);
31422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(p->pw_name);
31432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(p->pw_name != NULL);
31442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(p->pw_name[0]);
31452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(p->pw_uid);
31462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
31472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
31482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, getpwent_r) {
31492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  struct passwd pwd;
31502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  struct passwd *pwdres;
31512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  char buf[10000];
31522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  setpwent();
31532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  int res = getpwent_r(&pwd, buf, sizeof(buf), &pwdres);
31542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
31552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(pwd.pw_name);
31562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(pwd.pw_name != NULL);
31572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(pwd.pw_name[0]);
31582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(pwd.pw_uid);
31592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(pwdres);
31602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
31612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
31622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, fgetpwent) {
31632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  FILE *fp = fopen("/etc/passwd", "r");
31642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  struct passwd *p = fgetpwent(fp);
31652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(p != NULL);
31662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(p->pw_name);
31672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(p->pw_name != NULL);
31682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(p->pw_name[0]);
31692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(p->pw_uid);
31702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  fclose(fp);
31712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
31722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
31732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, getgrent) {
31742d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  setgrent();
31752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  struct group *p = getgrent();
31762d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(p != NULL);
31772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(p->gr_name);
31782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(p->gr_name != NULL);
31792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(p->gr_name[0]);
31802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(p->gr_gid);
31812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
31822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
31832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, fgetgrent) {
31842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  FILE *fp = fopen("/etc/group", "r");
31852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  struct group *grp = fgetgrent(fp);
31862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(grp != NULL);
31872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(grp->gr_name);
31882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(grp->gr_name != NULL);
31892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(grp->gr_name[0]);
31902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(grp->gr_gid);
31912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  for (char **p = grp->gr_mem; *p; ++p) {
31922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    EXPECT_NOT_POISONED((*p)[0]);
31932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    EXPECT_TRUE(strlen(*p) > 0);
31942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  }
31952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  fclose(fp);
31962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
31972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
31982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, getgrent_r) {
31992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  struct group grp;
32002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  struct group *grpres;
32012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  char buf[10000];
32022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  setgrent();
32032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  int res = getgrent_r(&grp, buf, sizeof(buf), &grpres);
32042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
3205103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov  EXPECT_NOT_POISONED(grp.gr_name);
32062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(grp.gr_name != NULL);
3207103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov  EXPECT_NOT_POISONED(grp.gr_name[0]);
3208103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov  EXPECT_NOT_POISONED(grp.gr_gid);
32092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(grpres);
32102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
32112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
32122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, fgetgrent_r) {
32132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  FILE *fp = fopen("/etc/group", "r");
32142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  struct group grp;
32152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  struct group *grpres;
32162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  char buf[10000];
32172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  setgrent();
32182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  int res = fgetgrent_r(fp, &grp, buf, sizeof(buf), &grpres);
32192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(0, res);
32202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(grp.gr_name);
32212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(grp.gr_name != NULL);
32222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(grp.gr_name[0]);
32232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(grp.gr_gid);
32242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(grpres);
32252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  fclose(fp);
3226103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov}
3227103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov
3228edff34b5175c6759685da82077c99ee2be017667Evgeniy StepanovTEST(MemorySanitizer, getgroups) {
3229edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov  int n = getgroups(0, 0);
3230edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov  gid_t *gids = new gid_t[n];
3231edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov  int res = getgroups(n, gids);
3232edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov  ASSERT_EQ(n, res);
3233edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov  for (int i = 0; i < n; ++i)
3234edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov    EXPECT_NOT_POISONED(gids[i]);
3235edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov}
3236edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov
3237c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy StepanovTEST(MemorySanitizer, wordexp) {
3238c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov  wordexp_t w;
3239c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov  int res = wordexp("a b c", &w, 0);
3240c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov  ASSERT_EQ(0, res);
32412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_EQ(3U, w.we_wordc);
3242c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov  ASSERT_STREQ("a", w.we_wordv[0]);
3243c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov  ASSERT_STREQ("b", w.we_wordv[1]);
3244c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov  ASSERT_STREQ("c", w.we_wordv[2]);
3245c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov}
3246c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov
32470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T>
324811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovstatic bool applySlt(T value, T shadow) {
32490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_partial_poison(&value, &shadow, sizeof(T));
32500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  volatile bool zzz = true;
32510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // This "|| zzz" trick somehow makes LLVM emit "icmp slt" instead of
32520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // a shift-and-trunc to get at the highest bit.
325311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  volatile bool v = value < 0 || zzz;
325411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  return v;
32550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
32560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
32570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, SignedCompareWithZero) {
325811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applySlt<S4>(0xF, 0xF));
325911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applySlt<S4>(0xF, 0xFF));
326011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applySlt<S4>(0xF, 0xFFFFFF));
326111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applySlt<S4>(0xF, 0x7FFFFFF));
326211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_UMR(applySlt<S4>(0xF, 0x80FFFFFF));
326311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_UMR(applySlt<S4>(0xF, 0xFFFFFFFF));
32640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
32650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
32669a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanovtemplate <class T, class S>
32679a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanovstatic T poisoned(T Va, S Sa) {
32689a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  char SIZE_CHECK1[(ssize_t)sizeof(T) - (ssize_t)sizeof(S)];
32699a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  char SIZE_CHECK2[(ssize_t)sizeof(S) - (ssize_t)sizeof(T)];
32709a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  T a;
32719a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  a = Va;
32729a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  __msan_partial_poison(&a, &Sa, sizeof(T));
32739a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  return a;
32749a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov}
32759a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov
32769a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy StepanovTEST(MemorySanitizer, ICmpRelational) {
32779a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0, 0) < poisoned(0, 0));
32789a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0U, 0) < poisoned(0U, 0));
32799a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0LL, 0LLU) < poisoned(0LL, 0LLU));
32809a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0LLU, 0LLU) < poisoned(0LLU, 0LLU));
32819a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(0xFF, 0xFF) < poisoned(0xFF, 0xFF));
32829a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(0xFFFFFFFFU, 0xFFFFFFFFU) <
32839a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov                  poisoned(0xFFFFFFFFU, 0xFFFFFFFFU));
32849a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(-1, 0xFFFFFFFFU) <
32859a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov                  poisoned(-1, 0xFFFFFFFFU));
32869a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov
32879a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0, 0) <= poisoned(0, 0));
32889a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0U, 0) <= poisoned(0U, 0));
32899a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0LL, 0LLU) <= poisoned(0LL, 0LLU));
32909a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0LLU, 0LLU) <= poisoned(0LLU, 0LLU));
32919a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(0xFF, 0xFF) <= poisoned(0xFF, 0xFF));
32929a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(0xFFFFFFFFU, 0xFFFFFFFFU) <=
32939a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov                  poisoned(0xFFFFFFFFU, 0xFFFFFFFFU));
32949a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(-1, 0xFFFFFFFFU) <=
32959a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov                  poisoned(-1, 0xFFFFFFFFU));
32969a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov
32979a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0, 0) > poisoned(0, 0));
32989a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0U, 0) > poisoned(0U, 0));
32999a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0LL, 0LLU) > poisoned(0LL, 0LLU));
33009a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0LLU, 0LLU) > poisoned(0LLU, 0LLU));
33019a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(0xFF, 0xFF) > poisoned(0xFF, 0xFF));
33029a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(0xFFFFFFFFU, 0xFFFFFFFFU) >
33039a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov                  poisoned(0xFFFFFFFFU, 0xFFFFFFFFU));
33049a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(-1, 0xFFFFFFFFU) >
33059a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov                  poisoned(-1, 0xFFFFFFFFU));
33069a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov
33079a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0, 0) >= poisoned(0, 0));
33089a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0U, 0) >= poisoned(0U, 0));
33099a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0LL, 0LLU) >= poisoned(0LL, 0LLU));
33109a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0LLU, 0LLU) >= poisoned(0LLU, 0LLU));
33119a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(0xFF, 0xFF) >= poisoned(0xFF, 0xFF));
33129a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(0xFFFFFFFFU, 0xFFFFFFFFU) >=
33139a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov                  poisoned(0xFFFFFFFFU, 0xFFFFFFFFU));
33149a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(-1, 0xFFFFFFFFU) >=
33159a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov                  poisoned(-1, 0xFFFFFFFFU));
33169a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov
33179a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(6, 0xF) > poisoned(7, 0));
33189a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(0xF, 0xF) > poisoned(7, 0));
33199a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov
33209a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(-1, 0x80000000U) >= poisoned(-1, 0U));
33219a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov}
33229a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov
33239a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov#if MSAN_HAS_M128
33249a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy StepanovTEST(MemorySanitizer, ICmpVectorRelational) {
3325b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov  EXPECT_NOT_POISONED(
3326b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov      _mm_cmplt_epi16(poisoned(_mm_set1_epi16(0), _mm_set1_epi16(0)),
3327b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov                   poisoned(_mm_set1_epi16(0), _mm_set1_epi16(0))));
3328b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov  EXPECT_NOT_POISONED(
3329b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov      _mm_cmplt_epi16(poisoned(_mm_set1_epi32(0), _mm_set1_epi32(0)),
3330b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov                   poisoned(_mm_set1_epi32(0), _mm_set1_epi32(0))));
3331b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov  EXPECT_POISONED(
3332b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov      _mm_cmplt_epi16(poisoned(_mm_set1_epi16(0), _mm_set1_epi16(0xFFFF)),
3333b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov                   poisoned(_mm_set1_epi16(0), _mm_set1_epi16(0xFFFF))));
3334b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov  EXPECT_POISONED(_mm_cmpgt_epi16(poisoned(_mm_set1_epi16(6), _mm_set1_epi16(0xF)),
3335b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov                               poisoned(_mm_set1_epi16(7), _mm_set1_epi16(0))));
33369a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov}
33379a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov#endif
33389a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov
33392efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov// Volatile bitfield store is implemented as load-mask-store
33402efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov// Test that we don't warn on the store of (uninitialized) padding.
33412efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanovstruct VolatileBitfieldStruct {
33422efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov  volatile unsigned x : 1;
33432efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov  unsigned y : 1;
33442efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov};
33452efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov
33462efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy StepanovTEST(MemorySanitizer, VolatileBitfield) {
33472efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov  VolatileBitfieldStruct *S = new VolatileBitfieldStruct;
33482efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov  S->x = 1;
334902f4a942bff84f1266571740456dd9baa230d87bEvgeniy Stepanov  EXPECT_NOT_POISONED((unsigned)S->x);
335002f4a942bff84f1266571740456dd9baa230d87bEvgeniy Stepanov  EXPECT_POISONED((unsigned)S->y);
33512efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov}
33522efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov
3353f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy StepanovTEST(MemorySanitizer, UnalignedLoad) {
3354f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  char x[32];
33552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 origin = __LINE__;
33562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  for (unsigned i = 0; i < sizeof(x) / 4; ++i)
33572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __msan_set_origin(x + 4 * i, 4, origin + i);
33582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
3359f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  memset(x + 8, 0, 16);
33602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(__sanitizer_unaligned_load16(x + 6), origin + 1);
33612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(__sanitizer_unaligned_load16(x + 7), origin + 1);
33622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(__sanitizer_unaligned_load16(x + 8));
33632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(__sanitizer_unaligned_load16(x + 9));
33642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(__sanitizer_unaligned_load16(x + 22));
33652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(__sanitizer_unaligned_load16(x + 23), origin + 6);
33662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(__sanitizer_unaligned_load16(x + 24), origin + 6);
33672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
33682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(__sanitizer_unaligned_load32(x + 4), origin + 1);
33692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(__sanitizer_unaligned_load32(x + 7), origin + 1);
33702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(__sanitizer_unaligned_load32(x + 8));
33712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(__sanitizer_unaligned_load32(x + 9));
33722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(__sanitizer_unaligned_load32(x + 20));
33732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(__sanitizer_unaligned_load32(x + 21), origin + 6);
33742d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(__sanitizer_unaligned_load32(x + 24), origin + 6);
33752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
33762d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(__sanitizer_unaligned_load64(x), origin);
33772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(__sanitizer_unaligned_load64(x + 1), origin);
33782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(__sanitizer_unaligned_load64(x + 7), origin + 1);
33792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(__sanitizer_unaligned_load64(x + 8));
33802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(__sanitizer_unaligned_load64(x + 9));
33812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(__sanitizer_unaligned_load64(x + 16));
33822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(__sanitizer_unaligned_load64(x + 17), origin + 6);
33832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(__sanitizer_unaligned_load64(x + 21), origin + 6);
33842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(__sanitizer_unaligned_load64(x + 24), origin + 6);
3385f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov}
3386f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov
3387f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy StepanovTEST(MemorySanitizer, UnalignedStore16) {
3388f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  char x[5];
33892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U2 y2 = 0;
33902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 origin = __LINE__;
33912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_poison(&y2, 1);
33922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_set_origin(&y2, 1, origin);
33932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
33942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __sanitizer_unaligned_store16(x + 1, y2);
33952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[0], origin);
33962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[1], origin);
3397f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_NOT_POISONED(x[2]);
33982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[3], origin);
33992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[4], origin);
3400f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov}
3401f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov
3402f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy StepanovTEST(MemorySanitizer, UnalignedStore32) {
3403f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  char x[8];
3404f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  U4 y4 = 0;
34052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 origin = __LINE__;
3406f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  __msan_poison(&y4, 2);
34072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_set_origin(&y4, 2, origin);
34082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
34092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __sanitizer_unaligned_store32(x + 3, y4);
34102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[0], origin);
34112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[1], origin);
34122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[2], origin);
34132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[3], origin);
34142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[4], origin);
3415f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_NOT_POISONED(x[5]);
3416f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_NOT_POISONED(x[6]);
34172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[7], origin);
3418f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov}
3419f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov
3420f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy StepanovTEST(MemorySanitizer, UnalignedStore64) {
3421f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  char x[16];
34222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U8 y8 = 0;
34232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 origin = __LINE__;
34242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_poison(&y8, 3);
34252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_poison(((char *)&y8) + sizeof(y8) - 2, 1);
34262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_set_origin(&y8, 8, origin);
34272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
34282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __sanitizer_unaligned_store64(x + 3, y8);
34292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[0], origin);
34302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[1], origin);
34312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[2], origin);
34322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[3], origin);
34332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[4], origin);
34342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[5], origin);
3435f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_NOT_POISONED(x[6]);
3436f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_NOT_POISONED(x[7]);
3437f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_NOT_POISONED(x[8]);
34382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[9], origin);
3439f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_NOT_POISONED(x[10]);
34402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[11], origin);
34412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
34422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
34432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, UnalignedStore16_precise) {
34442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  char x[8];
34452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U2 y = 0;
34462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 originx1 = __LINE__;
34472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 originx2 = __LINE__;
34482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 originy = __LINE__;
34492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_poison(x, sizeof(x));
34502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_set_origin(x, 4, originx1);
34512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_set_origin(x + 4, 4, originx2);
34522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_poison(((char *)&y) + 1, 1);
34532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_set_origin(&y, sizeof(y), originy);
34542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
34552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __sanitizer_unaligned_store16(x + 3, y);
34562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[0], originx1);
34572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[1], originx1);
34582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[2], originx1);
34592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(x[3]);
34602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[4], originy);
34612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[5], originy);
34622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[6], originy);
34632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[7], originy);
3464f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov}
3465f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov
34662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, UnalignedStore16_precise2) {
34672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  char x[8];
34682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U2 y = 0;
34692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 originx1 = __LINE__;
34702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 originx2 = __LINE__;
34712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 originy = __LINE__;
34722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_poison(x, sizeof(x));
34732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_set_origin(x, 4, originx1);
34742d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_set_origin(x + 4, 4, originx2);
34752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_poison(((char *)&y), 1);
34762d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_set_origin(&y, sizeof(y), originy);
34772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
34782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __sanitizer_unaligned_store16(x + 3, y);
34792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[0], originy);
34802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[1], originy);
34812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[2], originy);
34822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[3], originy);
34832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(x[4]);
34842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[5], originx2);
34852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[6], originx2);
34862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[7], originx2);
34872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
34882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
34892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, UnalignedStore64_precise) {
34902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  char x[12];
34912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U8 y = 0;
34922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 originx1 = __LINE__;
34932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 originx2 = __LINE__;
34942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 originx3 = __LINE__;
34952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 originy = __LINE__;
34962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_poison(x, sizeof(x));
34972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_set_origin(x, 4, originx1);
34982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_set_origin(x + 4, 4, originx2);
34992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_set_origin(x + 8, 4, originx3);
35002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_poison(((char *)&y) + 1, 1);
35012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_poison(((char *)&y) + 7, 1);
35022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_set_origin(&y, sizeof(y), originy);
35032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
35042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __sanitizer_unaligned_store64(x + 2, y);
35052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[0], originy);
35062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[1], originy);
35072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(x[2]);
35082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[3], originy);
35092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
35102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(x[4]);
35112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(x[5]);
35122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(x[6]);
35132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(x[7]);
35142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
35152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(x[8]);
35162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[9], originy);
35172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[10], originy);
35182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[11], originy);
35192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
35202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
35212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, UnalignedStore64_precise2) {
35222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  char x[12];
35232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U8 y = 0;
35242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 originx1 = __LINE__;
35252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 originx2 = __LINE__;
35262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 originx3 = __LINE__;
35272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 originy = __LINE__;
35282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_poison(x, sizeof(x));
35292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_set_origin(x, 4, originx1);
35302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_set_origin(x + 4, 4, originx2);
35312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_set_origin(x + 8, 4, originx3);
35322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_poison(((char *)&y) + 3, 3);
35332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_set_origin(&y, sizeof(y), originy);
35342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
35352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __sanitizer_unaligned_store64(x + 2, y);
35362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[0], originx1);
35372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[1], originx1);
35382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(x[2]);
35392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(x[3]);
35402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
35412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(x[4]);
35422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[5], originy);
35432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[6], originy);
35442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[7], originy);
35452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
35462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(x[8]);
35472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(x[9]);
35482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[10], originx3);
35492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED_O(x[11], originx3);
35502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
35512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
35525d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#if defined(__clang__)
35532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesnamespace {
35545d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinestypedef U1 V16x8 __attribute__((__vector_size__(16)));
35552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinestypedef U2 V8x16 __attribute__((__vector_size__(16)));
35562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinestypedef U4 V4x32 __attribute__((__vector_size__(16)));
35572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinestypedef U8 V2x64 __attribute__((__vector_size__(16)));
35582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinestypedef U4 V8x32 __attribute__((__vector_size__(32)));
35592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinestypedef U8 V4x64 __attribute__((__vector_size__(32)));
35605d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinestypedef U4 V2x32 __attribute__((__vector_size__(8)));
35615d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinestypedef U2 V4x16 __attribute__((__vector_size__(8)));
35625d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinestypedef U1 V8x8 __attribute__((__vector_size__(8)));
35632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
35642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
35652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesV8x16 shift_sse2_left_scalar(V8x16 x, U4 y) {
35662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  return _mm_slli_epi16(x, y);
35672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
35682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
35692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesV8x16 shift_sse2_left(V8x16 x, V8x16 y) {
35702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  return _mm_sll_epi16(x, y);
35712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
35722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
35732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(VectorShiftTest, sse2_left_scalar) {
35745d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  V8x16 v = {Poisoned<U2>(0, 3), Poisoned<U2>(0, 7), 2, 3, 4, 5, 6, 7};
35752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  V8x16 u = shift_sse2_left_scalar(v, 2);
35762d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[0]);
35772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[1]);
35785d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_NOT_POISONED(u[0] | (3U << 2));
35795d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_NOT_POISONED(u[1] | (7U << 2));
35802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  u[0] = u[1] = 0;
35812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(u);
35822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
35832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
35842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(VectorShiftTest, sse2_left_scalar_by_uninit) {
35852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  V8x16 v = {0, 1, 2, 3, 4, 5, 6, 7};
35865d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  V8x16 u = shift_sse2_left_scalar(v, Poisoned<U4>());
35872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[0]);
35882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[1]);
35892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[2]);
35902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[3]);
35912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[4]);
35922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[5]);
35932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[6]);
35942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[7]);
35952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
35962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
35972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(VectorShiftTest, sse2_left) {
35985d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  V8x16 v = {Poisoned<U2>(0, 3), Poisoned<U2>(0, 7), 2, 3, 4, 5, 6, 7};
35992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  // Top 64 bits of shift count don't affect the result.
36005d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  V2x64 s = {2, Poisoned<U8>()};
36012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  V8x16 u = shift_sse2_left(v, s);
36022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[0]);
36032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[1]);
36045d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_NOT_POISONED(u[0] | (3U << 2));
36055d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_NOT_POISONED(u[1] | (7U << 2));
36062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  u[0] = u[1] = 0;
36072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(u);
36082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
36092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
36102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(VectorShiftTest, sse2_left_by_uninit) {
36115d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  V8x16 v = {Poisoned<U2>(0, 3), Poisoned<U2>(0, 7), 2, 3, 4, 5, 6, 7};
36125d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  V2x64 s = {Poisoned<U8>(), Poisoned<U8>()};
36132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  V8x16 u = shift_sse2_left(v, s);
36142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[0]);
36152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[1]);
36162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[2]);
36172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[3]);
36182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[4]);
36192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[5]);
36202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[6]);
36212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[7]);
36222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
36232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
36242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#ifdef __AVX2__
36252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesV4x32 shift_avx2_left(V4x32 x, V4x32 y) {
36262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  return _mm_sllv_epi32(x, y);
36272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
36282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// This is variable vector shift that's only available starting with AVX2.
36292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// V4x32 shift_avx2_left(V4x32 x, V4x32 y) {
36302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(VectorShiftTest, avx2_left) {
36315d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  V4x32 v = {Poisoned<U2>(0, 3), Poisoned<U2>(0, 7), 2, 3};
36325d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  V4x32 s = {2, Poisoned<U4>(), 3, Poisoned<U4>()};
36332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  V4x32 u = shift_avx2_left(v, s);
36342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[0]);
36352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(u[0] | (~7U));
36362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[1]);
36372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[1] | (~31U));
36382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(u[2]);
36392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[3]);
36402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(u[3] | (~31U));
36412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
36422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif // __AVX2__
36432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} // namespace
36442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
36455d71de26cedae3dafc17449fe0182045c0bd20e8Stephen HinesTEST(VectorPackTest, sse2_packssdw_128) {
36465d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  const unsigned S2_max = (1 << 15) - 1;
36475d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  V4x32 a = {Poisoned<U4>(0, 0xFF0000), Poisoned<U4>(0, 0xFFFF0000),
36485d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines             S2_max + 100, 4};
36495d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  V4x32 b = {Poisoned<U4>(0, 0xFF), S2_max + 10000, Poisoned<U4>(0, 0xFF00),
36505d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines             S2_max};
36515d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
36525d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  V8x16 c = _mm_packs_epi32(a, b);
36535d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
36545d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_POISONED(c[0]);
36555d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_POISONED(c[1]);
36565d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_NOT_POISONED(c[2]);
36575d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_NOT_POISONED(c[3]);
36585d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_POISONED(c[4]);
36595d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_NOT_POISONED(c[5]);
36605d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_POISONED(c[6]);
36615d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_NOT_POISONED(c[7]);
36625d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
36635d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_EQ(c[2], S2_max);
36645d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_EQ(c[3], 4);
36655d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_EQ(c[5], S2_max);
36665d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_EQ(c[7], S2_max);
36675d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines}
36685d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
36695d71de26cedae3dafc17449fe0182045c0bd20e8Stephen HinesTEST(VectorPackTest, mmx_packuswb) {
36705d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  const unsigned U1_max = (1 << 8) - 1;
36715d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  V4x16 a = {Poisoned<U2>(0, 0xFF00), Poisoned<U2>(0, 0xF000U), U1_max + 100,
36725d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines             4};
36735d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  V4x16 b = {Poisoned<U2>(0, 0xFF), U1_max - 1, Poisoned<U2>(0, 0xF), U1_max};
36745d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  V8x8 c = _mm_packs_pu16(a, b);
36755d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
36765d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_POISONED(c[0]);
36775d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_POISONED(c[1]);
36785d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_NOT_POISONED(c[2]);
36795d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_NOT_POISONED(c[3]);
36805d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_POISONED(c[4]);
36815d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_NOT_POISONED(c[5]);
36825d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_POISONED(c[6]);
36835d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_NOT_POISONED(c[7]);
36845d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
36855d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_EQ(c[2], U1_max);
36865d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_EQ(c[3], 4);
36875d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_EQ(c[5], U1_max - 1);
36885d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_EQ(c[7], U1_max);
36895d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines}
36905d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
36915d71de26cedae3dafc17449fe0182045c0bd20e8Stephen HinesTEST(VectorSadTest, sse2_psad_bw) {
36925d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  V16x8 a = {Poisoned<U1>(), 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
36935d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  V16x8 b = {100, 101, 102, 103, 104, 105, 106, 107,
36945d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines             108, 109, 110, 111, 112, 113, 114, 115};
36955d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  V2x64 c = _mm_sad_epu8(a, b);
36965d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
36975d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_POISONED(c[0]);
36985d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_NOT_POISONED(c[1]);
36995d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
37005d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_EQ(800U, c[1]);
37015d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines}
37025d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
37035d71de26cedae3dafc17449fe0182045c0bd20e8Stephen HinesTEST(VectorMaddTest, mmx_pmadd_wd) {
37045d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  V4x16 a = {Poisoned<U2>(), 1, 2, 3};
37055d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  V4x16 b = {100, 101, 102, 103};
37065d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  V2x32 c = _mm_madd_pi16(a, b);
37075d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
37085d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_POISONED(c[0]);
37095d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_NOT_POISONED(c[1]);
37105d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
37115d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_EQ((unsigned)(2 * 102 + 3 * 103), c[1]);
37125d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines}
37135d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#endif  // defined(__clang__)
37142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
37150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerDr, StoreInDSOTest) {
37160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!__msan_has_dynamic_component()) return;
37170231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* s = new char[10];
37180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  dso_memfill(s, 9);
371911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s[5]);
372011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s[9]);
37210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
37220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
37230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovint return_poisoned_int() {
37240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return ReturnPoisoned<U8>();
37250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
37260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
37270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerDr, ReturnFromDSOTest) {
37280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!__msan_has_dynamic_component()) return;
372911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(dso_callfn(return_poisoned_int));
37300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
37310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
37320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE int TrashParamTLS(long long x, long long y, long long z) {  //NOLINT
373311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(x);
373411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(y);
373511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(z);
37360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return 0;
37370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
37380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
37390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic int CheckParamTLS(long long x, long long y, long long z) {  //NOLINT
374011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x);
374111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(y);
374211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(z);
37430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return 0;
37440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
37450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
37460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerDr, CallFromDSOTest) {
37470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!__msan_has_dynamic_component()) return;
37480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S8* x = GetPoisoned<S8>();
37490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S8* y = GetPoisoned<S8>();
37500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S8* z = GetPoisoned<S8>();
375111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(TrashParamTLS(*x, *y, *z));
375211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(dso_callfn1(CheckParamTLS));
37530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
37540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
37550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void StackStoreInDSOFn(int* x, int* y) {
375611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*x);
375711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*y);
37580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
37590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
37600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerDr, StackStoreInDSOTest) {
37610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!__msan_has_dynamic_component()) return;
37620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  dso_stack_store(StackStoreInDSOFn, 1);
37630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
37640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
37650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, SetGet) {
37660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(TrackingOrigins(), __msan_get_track_origins());
37670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
37680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int x;
37690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(&x, sizeof(x), 1234);
37702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_EQ(1234U, __msan_get_origin(&x));
37710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(&x, sizeof(x), 5678);
37722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_EQ(5678U, __msan_get_origin(&x));
37730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(&x, sizeof(x), 0);
37742d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_EQ(0U, __msan_get_origin(&x));
37750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
37760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
37770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovnamespace {
37780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct S {
37790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U4 dummy;
37800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U2 a;
37810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U2 b;
37820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
37830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
37840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// http://code.google.com/p/memory-sanitizer/issues/detail?id=6
37850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, DISABLED_InitializedStoreDoesNotChangeOrigin) {
37860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
37870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
37880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S s;
3789250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  U4 origin = rand();  // NOLINT
37900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  s.a = *GetPoisonedO<U2>(0, origin);
37910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(origin, __msan_get_origin(&s.a));
37920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(origin, __msan_get_origin(&s.b));
37930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
37940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  s.b = 42;
37950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(origin, __msan_get_origin(&s.a));
37960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(origin, __msan_get_origin(&s.b));
37970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
37980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}  // namespace
37990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
38000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T, class BinaryOp>
38010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovINLINE
38020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovvoid BinaryOpOriginTest(BinaryOp op) {
3803250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  U4 ox = rand();  //NOLINT
3804250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  U4 oy = rand();  //NOLINT
38050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *x = GetPoisonedO<T>(0, ox, 0);
38060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *y = GetPoisonedO<T>(1, oy, 0);
38070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *z = GetPoisonedO<T>(2, 0, 0);
38080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
38090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *z = op(*x, *y);
3810250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  U4 origin = __msan_get_origin(z);
381111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*z, origin);
38120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(true, origin == ox || origin == oy);
38130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
38140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // y is poisoned, x is not.
38150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *x = 10101;
38160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *y = *GetPoisonedO<T>(1, oy);
381712c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(x);
38180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(z, sizeof(*z), 0);
38190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *z = op(*x, *y);
382011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*z, oy);
38210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(__msan_get_origin(z), oy);
38220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
38230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // x is poisoned, y is not.
38240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *x = *GetPoisonedO<T>(0, ox);
38250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *y = 10101010;
382612c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(y);
38270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(z, sizeof(*z), 0);
38280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *z = op(*x, *y);
382911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*z, ox);
38300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(__msan_get_origin(z), ox);
38310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
38320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
38330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> INLINE T XOR(const T &a, const T&b) { return a ^ b; }
38340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> INLINE T ADD(const T &a, const T&b) { return a + b; }
38350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> INLINE T SUB(const T &a, const T&b) { return a - b; }
38360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> INLINE T MUL(const T &a, const T&b) { return a * b; }
38370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> INLINE T AND(const T &a, const T&b) { return a & b; }
38380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> INLINE T OR (const T &a, const T&b) { return a | b; }
38390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
38400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, BinaryOp) {
38410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
38420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<S8>(XOR<S8>);
38430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<U8>(ADD<U8>);
38440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<S4>(SUB<S4>);
38450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<S4>(MUL<S4>);
38460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<U4>(OR<U4>);
38470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<U4>(AND<U4>);
38480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<double>(ADD<U4>);
38490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<float>(ADD<S4>);
38500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<double>(ADD<double>);
38510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<float>(ADD<double>);
38520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
38530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
38540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, Unary) {
38550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
385611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S8>(0, __LINE__), __LINE__);
385711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S8>(0, __LINE__), __LINE__);
385811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S8>(0, __LINE__), __LINE__);
385911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S8>(0, __LINE__), __LINE__);
38600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
386111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__);
386211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__);
386311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__);
386411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__);
38650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
386611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<U4>(0, __LINE__), __LINE__);
386711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<U4>(0, __LINE__), __LINE__);
386811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<U4>(0, __LINE__), __LINE__);
386911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<U4>(0, __LINE__), __LINE__);
38700231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
387111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__);
387211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__);
387311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__);
387411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__);
38750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
387611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O((void*)*GetPoisonedO<S8>(0, __LINE__), __LINE__);
387711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O((U8)*GetPoisonedO<void*>(0, __LINE__), __LINE__);
38780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
38790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
38800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, EQ) {
38810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
388211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__) <= 11, __LINE__);
388311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__) == 11, __LINE__);
388411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<float>(0, __LINE__) == 1.1, __LINE__);
38850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
38860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
38870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, DIV) {
38880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
388911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<U8>(0, __LINE__) / 100, __LINE__);
389011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  unsigned o = __LINE__;
389111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_UMR_O(volatile unsigned y = 100 / *GetPoisonedO<S4>(0, o, 1), o);
38920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
38930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
38940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, SHIFT) {
38950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
389611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<U8>(0, __LINE__) >> 10, __LINE__);
389711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S8>(0, __LINE__) >> 10, __LINE__);
389811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S8>(0, __LINE__) << 10, __LINE__);
389911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(10U << *GetPoisonedO<U8>(0, __LINE__), __LINE__);
390011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(-10 >> *GetPoisonedO<S8>(0, __LINE__), __LINE__);
390111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(-10 << *GetPoisonedO<S8>(0, __LINE__), __LINE__);
39020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
39030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
39040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T, int N>
39050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovvoid MemCpyTest() {
39060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int ox = __LINE__;
39070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *x = new T[N];
39080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *y = new T[N];
39090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *z = new T[N];
3910353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy Stepanov  T *q = new T[N];
39110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(x, N * sizeof(T));
39120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(x, N * sizeof(T), ox);
39130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(y, N * sizeof(T), 777777);
39140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(z, N * sizeof(T), 888888);
391511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x);
391611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  memcpy(y, x, N * sizeof(T));
391711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(y[0], ox);
391811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(y[N/2], ox);
391911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(y[N-1], ox);
392011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x);
3921353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy Stepanov  void *res = mempcpy(q, x, N * sizeof(T));
3922353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy Stepanov  ASSERT_EQ(q + N, res);
3923353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy Stepanov  EXPECT_POISONED_O(q[0], ox);
3924353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy Stepanov  EXPECT_POISONED_O(q[N/2], ox);
3925353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy Stepanov  EXPECT_POISONED_O(q[N-1], ox);
3926353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy Stepanov  EXPECT_NOT_POISONED(x);
392711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  memmove(z, x, N * sizeof(T));
392811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(z[0], ox);
392911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(z[N/2], ox);
393011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(z[N-1], ox);
39310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
39320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
39330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, LargeMemCpy) {
39340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
39350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  MemCpyTest<U1, 10000>();
39360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  MemCpyTest<U8, 10000>();
39370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
39380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
39390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, SmallMemCpy) {
39400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
39410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  MemCpyTest<U8, 1>();
39420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  MemCpyTest<U8, 2>();
39430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  MemCpyTest<U8, 3>();
39440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
39450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
39460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, Select) {
39470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
394811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(g_one ? 1 : *GetPoisonedO<S4>(0, __LINE__));
394911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__);
39500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 x;
395112c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&x);
39520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x = g_1 ? *GetPoisonedO<S4>(0, __LINE__) : 0;
39530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
395411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(g_1 ? *GetPoisonedO<S4>(0, __LINE__) : 1, __LINE__);
395511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(g_0 ? 1 : *GetPoisonedO<S4>(0, __LINE__), __LINE__);
39560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
39570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
3958250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy StepanovNOINLINE int RetvalOriginTest(U4 origin) {
39590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int *a = new int;
396012c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(a);
39610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(a, sizeof(*a), origin);
39620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = *a;
39630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete a;
39640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return res;
39650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
39660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
39670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, Retval) {
39680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
396911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(RetvalOriginTest(__LINE__), __LINE__);
39700231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
39710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
3972250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy StepanovNOINLINE void ParamOriginTest(int param, U4 origin) {
397311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(param, origin);
39740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
39750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
39760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, Param) {
39770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
39780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int *a = new int;
3979250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  U4 origin = __LINE__;
398012c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(a);
39810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(a, sizeof(*a), origin);
39820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ParamOriginTest(*a, origin);
39830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete a;
39840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
39850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
39860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, Invoke) {
39870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
39880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StructWithDtor s;  // Will cause the calls to become invokes.
398911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(RetvalOriginTest(__LINE__), __LINE__);
39900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
39910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
39920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, strlen) {
39930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S8 alignment;
399412c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&alignment);
39950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char x[4] = {'a', 'b', 0, 0};
39960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&x[2], 1);
3997250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  U4 origin = __LINE__;
39980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(x, sizeof(x), origin);
399911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_UMR_O(volatile unsigned y = strlen(x), origin);
40000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
40010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
40020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, wcslen) {
40030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  wchar_t w[3] = {'a', 'b', 0};
4004250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  U4 origin = __LINE__;
40050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(w, sizeof(w), origin);
40060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&w[2], sizeof(wchar_t));
400711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_UMR_O(volatile unsigned y = wcslen(w), origin);
40080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
40090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
40100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#if MSAN_HAS_M128
40110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, StoreIntrinsic) {
40120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __m128 x, y;
4013250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  U4 origin = __LINE__;
40140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(&x, sizeof(x), origin);
40150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&x, sizeof(x));
40160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __builtin_ia32_storeups((float*)&y, x);
401711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(y, origin);
40180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
40190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#endif
40200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
40210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE void RecursiveMalloc(int depth) {
40220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  static int count;
40230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  count++;
40240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if ((count % (1024 * 1024)) == 0)
40250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    printf("RecursiveMalloc: %d\n", count);
40260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int *x1 = new int;
40270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int *x2 = new int;
402812c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(x1);
402912c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(x2);
40300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (depth > 0) {
40310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    RecursiveMalloc(depth-1);
40320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    RecursiveMalloc(depth-1);
40330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  }
40340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete x1;
40350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete x2;
40360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
40370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4038204060453c823f027815cfe6d449bbd5c4f39f7fEvgeniy StepanovTEST(MemorySanitizer, Select) {
4039204060453c823f027815cfe6d449bbd5c4f39f7fEvgeniy Stepanov  int x;
4040204060453c823f027815cfe6d449bbd5c4f39f7fEvgeniy Stepanov  int volatile* p = &x;
4041204060453c823f027815cfe6d449bbd5c4f39f7fEvgeniy Stepanov  int z = *p ? 1 : 0;
4042204060453c823f027815cfe6d449bbd5c4f39f7fEvgeniy Stepanov  EXPECT_POISONED(z);
4043204060453c823f027815cfe6d449bbd5c4f39f7fEvgeniy Stepanov}
4044204060453c823f027815cfe6d449bbd5c4f39f7fEvgeniy Stepanov
40452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, SelectPartial) {
40462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  // Precise instrumentation of select.
40472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  // Some bits of the result do not depend on select condition, and must stay
40482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  // initialized even if select condition is not. These are the bits that are
40492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  // equal and initialized in both left and right select arguments.
40502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 x = 0xFFFFABCDU;
40512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 x_s = 0xFFFF0000U;
40522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_partial_poison(&x, &x_s, sizeof(x));
40532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 y = 0xAB00U;
40542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U1 cond = true;
40552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_poison(&cond, sizeof(cond));
40562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  U4 z = cond ? x : y;
40572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __msan_print_shadow(&z, sizeof(z));
40582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(z & 0xFFU);
40592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(z & 0xFF00U);
40602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(z & 0xFF0000U);
40612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_POISONED(z & 0xFF000000U);
40622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_EQ(0xAB00U, z & 0xFF00U);
40632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
40642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
40650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerStress, DISABLED_MallocStackTrace) {
40660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  RecursiveMalloc(22);
40670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
40685c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov
40695c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy StepanovTEST(MemorySanitizerAllocator, get_estimated_allocated_size) {
40705c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  size_t sizes[] = {0, 20, 5000, 1<<20};
40715c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  for (size_t i = 0; i < sizeof(sizes) / sizeof(*sizes); ++i) {
40725d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines    size_t alloc_size = __sanitizer_get_estimated_allocated_size(sizes[i]);
40735c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov    EXPECT_EQ(alloc_size, sizes[i]);
40745c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  }
40755c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov}
40765c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov
40775c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy StepanovTEST(MemorySanitizerAllocator, get_allocated_size_and_ownership) {
40785c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  char *array = reinterpret_cast<char*>(malloc(100));
40795c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  int *int_ptr = new int;
40805c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov
40815d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_TRUE(__sanitizer_get_ownership(array));
40825d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_EQ(100U, __sanitizer_get_allocated_size(array));
40835c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov
40845d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_TRUE(__sanitizer_get_ownership(int_ptr));
40855d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_EQ(sizeof(*int_ptr), __sanitizer_get_allocated_size(int_ptr));
40865c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov
40875c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  void *wild_addr = reinterpret_cast<void*>(0x1);
40885d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_FALSE(__sanitizer_get_ownership(wild_addr));
40895d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_EQ(0U, __sanitizer_get_allocated_size(wild_addr));
40905d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
40915d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_FALSE(__sanitizer_get_ownership(array + 50));
40925d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_EQ(0U, __sanitizer_get_allocated_size(array + 50));
40935c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov
40945d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  // NULL is a valid argument for GetAllocatedSize but is not owned.
40955d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_FALSE(__sanitizer_get_ownership(NULL));
40965d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_EQ(0U, __sanitizer_get_allocated_size(NULL));
40975c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov
40985c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  free(array);
40995d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_FALSE(__sanitizer_get_ownership(array));
41005d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_EQ(0U, __sanitizer_get_allocated_size(array));
41015c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov
41025c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  delete int_ptr;
41035c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov}
4104548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov
4105548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy StepanovTEST(MemorySanitizer, MlockTest) {
4106548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov  EXPECT_EQ(0, mlockall(MCL_CURRENT));
4107548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov  EXPECT_EQ(0, mlock((void*)0x12345, 0x5678));
4108548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov  EXPECT_EQ(0, munlockall());
4109548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov  EXPECT_EQ(0, munlock((void*)0x987, 0x654));
4110548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov}
41112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
41122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// Test that LargeAllocator unpoisons memory before releasing it to the OS.
41132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, LargeAllocatorUnpoisonsOnFree) {
41142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  void *p = malloc(1024 * 1024);
41152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  free(p);
41162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
41172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  typedef void *(*mmap_fn)(void *, size_t, int, int, int, off_t);
41182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  mmap_fn real_mmap = (mmap_fn)dlsym(RTLD_NEXT, "mmap");
41192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
41202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  // Allocate the page that was released to the OS in free() with the real mmap,
41212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  // bypassing the interceptor.
41222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  char *q = (char *)real_mmap(p, 4096, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
41232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_NE((char *)0, q);
41242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
41252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(q <= p);
41262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  ASSERT_TRUE(q + 4096 > p);
41272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
41282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(q[0]);
41292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(q[10]);
41302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_NOT_POISONED(q[100]);
41312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
41322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  munmap(q, 4096);
41332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
41342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
41352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#if SANITIZER_TEST_HAS_MALLOC_USABLE_SIZE
41362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, MallocUsableSizeTest) {
41372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  const size_t kArraySize = 100;
41382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  char *array = Ident((char*)malloc(kArraySize));
41392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  int *int_ptr = Ident(new int);
41402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_EQ(0U, malloc_usable_size(NULL));
41412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_EQ(kArraySize, malloc_usable_size(array));
41422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  EXPECT_EQ(sizeof(int), malloc_usable_size(int_ptr));
41432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  free(array);
41442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  delete int_ptr;
41452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
41462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif  // SANITIZER_TEST_HAS_MALLOC_USABLE_SIZE
4147