msan_test.cc revision aff25aa02098a510eff6eda1a3ec823e5b1fe1aa
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
190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include "sanitizer/msan_interface.h"
200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include "msandr_test_so.h"
210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
22ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#include <inttypes.h>
230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <stdlib.h>
240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <stdarg.h>
250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <stdio.h>
260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <assert.h>
270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <wchar.h>
287cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov#include <math.h>
2997160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov#include <malloc.h>
300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
319530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov#include <arpa/inet.h>
32e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov#include <dlfcn.h>
33103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov#include <grp.h>
340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <unistd.h>
352bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov#include <link.h>
360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <limits.h>
370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <sys/time.h>
38e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov#include <poll.h>
390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <sys/types.h>
400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <sys/stat.h>
410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <fcntl.h>
420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <sys/resource.h>
430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <sys/ioctl.h>
445cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov#include <sys/statvfs.h>
45359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov#include <sys/sysinfo.h>
460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <sys/utsname.h>
470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <sys/mman.h>
480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <sys/vfs.h>
49d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov#include <dirent.h>
50e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#include <pwd.h>
51134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov#include <sys/socket.h>
520a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov#include <netdb.h>
53c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov#include <wordexp.h>
544d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov#include <mntent.h>
55369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov#include <netinet/ether.h>
5610362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov#include <sys/ipc.h>
5710362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov#include <sys/shm.h>
580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#if defined(__i386__) || defined(__x86_64__)
600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov# include <emmintrin.h>
610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov# define MSAN_HAS_M128 1
620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#else
630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov# define MSAN_HAS_M128 0
640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#endif
650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
6697160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanovstatic const int kPageSize = 4096;
6797160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov
680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef unsigned char      U1;
690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef unsigned short     U2;  // NOLINT
700231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef unsigned int       U4;
710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef unsigned long long U8;  // NOLINT
720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef   signed char      S1;
730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef   signed short     S2;  // NOLINT
740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef   signed int       S4;
750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef   signed long long S8;  // NOLINT
760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#define NOINLINE      __attribute__((noinline))
770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#define INLINE      __attribute__((always_inline))
780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
7911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovstatic bool TrackingOrigins() {
8011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  S8 x;
8111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  __msan_set_origin(&x, sizeof(x), 0x1234);
82250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  U4 origin = __msan_get_origin(&x);
8311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  __msan_set_origin(&x, sizeof(x), 0);
8411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  return origin == 0x1234;
8511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov}
860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
8711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov#define EXPECT_UMR(action) \
880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    do {                        \
890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      __msan_set_expect_umr(1); \
900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      action;                   \
910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      __msan_set_expect_umr(0); \
920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    } while (0)
930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
9411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov#define EXPECT_UMR_O(action, origin) \
950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    do {                                            \
960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      __msan_set_expect_umr(1);                     \
970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      action;                                       \
980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      __msan_set_expect_umr(0);                     \
990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      if (TrackingOrigins())                        \
10012c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov        EXPECT_EQ(origin, __msan_get_umr_origin()); \
1010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    } while (0)
1020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
10311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov#define EXPECT_UMR_S(action, stack_origin) \
1040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    do {                                            \
1050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      __msan_set_expect_umr(1);                     \
1060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      action;                                       \
1070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      __msan_set_expect_umr(0);                     \
108250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov      U4 id = __msan_get_umr_origin();             \
1090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      const char *str = __msan_get_origin_descr_if_stack(id); \
1100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      if (!str || strcmp(str, stack_origin)) {      \
1110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov        fprintf(stderr, "EXPECT_POISONED_S: id=%u %s, %s", \
1120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov                id, stack_origin, str);  \
1130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov        EXPECT_EQ(1, 0);                            \
1140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      }                                             \
1150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    } while (0)
1160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
11711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov#define EXPECT_POISONED(x) ExpectPoisoned(x)
11811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
11911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovtemplate<typename T>
12011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovvoid ExpectPoisoned(const T& t) {
12111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NE(-1, __msan_test_shadow((void*)&t, sizeof(t)));
12211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov}
12311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
12411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov#define EXPECT_POISONED_O(x, origin) \
12511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  ExpectPoisonedWithOrigin(x, origin)
12611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
12711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovtemplate<typename T>
12811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovvoid ExpectPoisonedWithOrigin(const T& t, unsigned origin) {
12911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NE(-1, __msan_test_shadow((void*)&t, sizeof(t)));
13011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  if (TrackingOrigins())
13111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov    EXPECT_EQ(origin, __msan_get_origin((void*)&t));
13211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov}
13311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
13411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov#define EXPECT_POISONED_S(x, stack_origin) \
13511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  ExpectPoisonedWithStackOrigin(x, stack_origin)
13611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
13711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovtemplate<typename T>
13811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovvoid ExpectPoisonedWithStackOrigin(const T& t, const char *stack_origin) {
13911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NE(-1, __msan_test_shadow((void*)&t, sizeof(t)));
140250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  U4 id = __msan_get_origin((void*)&t);
14111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  const char *str = __msan_get_origin_descr_if_stack(id);
14211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  if (!str || strcmp(str, stack_origin)) {
14311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov    fprintf(stderr, "EXPECT_POISONED_S: id=%u %s, %s",
14411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov        id, stack_origin, str);
14511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov    EXPECT_EQ(1, 0);
14611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  }
14711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov}
14811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
14911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov#define EXPECT_NOT_POISONED(x) ExpectNotPoisoned(x)
15011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
15111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovtemplate<typename T>
15211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovvoid ExpectNotPoisoned(const T& t) {
15311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_EQ(-1, __msan_test_shadow((void*)&t, sizeof(t)));
15411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov}
1550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
1560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic U8 poisoned_array[100];
1570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T>
1580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovT *GetPoisoned(int i = 0, T val = 0) {
1590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *res = (T*)&poisoned_array[i];
1600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *res = val;
1610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&poisoned_array[i], sizeof(T));
1620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return res;
1630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
1640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
1650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T>
166250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy StepanovT *GetPoisonedO(int i, U4 origin, T val = 0) {
1670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *res = (T*)&poisoned_array[i];
1680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *res = val;
1690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&poisoned_array[i], sizeof(T));
1700231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(&poisoned_array[i], sizeof(T), origin);
1710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return res;
1720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
1730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
1740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// This function returns its parameter but in such a way that compiler
1750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// can not prove it.
1760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T>
1770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE
1780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic T Ident(T t) {
1790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  volatile T ret = t;
1800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return ret;
1810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
1820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
1830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> NOINLINE T ReturnPoisoned() { return *GetPoisoned<T>(); }
1840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
1850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic volatile int g_one = 1;
1860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic volatile int g_zero = 0;
1870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic volatile int g_0 = 0;
1880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic volatile int g_1 = 1;
1890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
1900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovS4 a_s4[100];
1910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovS8 a_s8[100];
1920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
19312c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov// Check that malloc poisons memory.
19412c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov// A lot of tests below depend on this.
19512c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy StepanovTEST(MemorySanitizerSanity, PoisonInMalloc) {
19612c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  int *x = (int*)malloc(sizeof(int));
19712c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  EXPECT_POISONED(*x);
19812c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  free(x);
19912c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov}
20012c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov
2010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, NegativeTest1) {
2020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 *x = GetPoisoned<S4>();
2030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (g_one)
2040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    *x = 0;
20511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*x);
2060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
2070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, PositiveTest1) {
2090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // Load to store.
21011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S1>());
21111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S2>());
21211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S4>());
21311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S8>());
2140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // S->S conversions.
21611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S1>());
21711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S1>());
21811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S1>());
2190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
22011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S2>());
22111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S2>());
22211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S2>());
2230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
22411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S4>());
22511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S4>());
22611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S4>());
2270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
22811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S8>());
22911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S8>());
23011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S8>());
2310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // ZExt
23311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<U1>());
23411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<U1>());
23511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<U1>());
23611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<U2>());
23711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<U2>());
23811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<U4>());
2390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // Unary ops.
24111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(- *GetPoisoned<S4>());
2420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
24311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_UMR(a_s4[g_zero] = 100 / *GetPoisoned<S4>(0, 1));
2440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  a_s4[g_zero] = 1 - *GetPoisoned<S4>();
2470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  a_s4[g_zero] = 1 + *GetPoisoned<S4>();
2480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
2490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Phi1) {
2510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 c;
2520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (g_one) {
2530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    c = *GetPoisoned<S4>();
2540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  } else {
25512c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov    break_optimization(0);
2560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    c = 0;
2570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  }
25811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(c);
2590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
2600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Phi2) {
2620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 i = *GetPoisoned<S4>();
2630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 n = g_one;
26411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_UMR(for (; i < g_one; i++););
26511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(i);
2660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
2670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
26811929000ec2919192b3be457f5a44c71ed55215eEvgeniy StepanovNOINLINE void Arg1ExpectUMR(S4 a1) { EXPECT_POISONED(a1); }
26911929000ec2919192b3be457f5a44c71ed55215eEvgeniy StepanovNOINLINE void Arg2ExpectUMR(S4 a1, S4 a2) { EXPECT_POISONED(a2); }
27011929000ec2919192b3be457f5a44c71ed55215eEvgeniy StepanovNOINLINE void Arg3ExpectUMR(S1 a1, S4 a2, S8 a3) { EXPECT_POISONED(a3); }
2710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, ArgTest) {
2730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  Arg1ExpectUMR(*GetPoisoned<S4>());
2740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  Arg2ExpectUMR(0, *GetPoisoned<S4>());
2750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  Arg3ExpectUMR(0, 1, *GetPoisoned<S8>());
2760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
2770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, CallAndRet) {
2800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!__msan_has_dynamic_component()) return;
2810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ReturnPoisoned<S1>();
2820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ReturnPoisoned<S2>();
2830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ReturnPoisoned<S4>();
2840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ReturnPoisoned<S8>();
2850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
28611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(ReturnPoisoned<S1>());
28711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(ReturnPoisoned<S2>());
28811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(ReturnPoisoned<S4>());
28911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(ReturnPoisoned<S8>());
2900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
2910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// malloc() in the following test may be optimized to produce a compile-time
2930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// undef value. Check that we trap on the volatile assignment anyway.
2940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, DISABLED_MallocNoIdent) {
2950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 *x = (int*)malloc(sizeof(S4));
29611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*x);
2970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  free(x);
2980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
2990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
3000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Malloc) {
3010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 *x = (int*)Ident(malloc(sizeof(S4)));
30211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*x);
3030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  free(x);
3040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
3050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
3060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Realloc) {
3070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 *x = (int*)Ident(realloc(0, sizeof(S4)));
30811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(x[0]);
3090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[0] = 1;
3100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x = (int*)Ident(realloc(x, 2 * sizeof(S4)));
31111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);  // Ok, was inited before.
31211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(x[1]);
3130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x = (int*)Ident(realloc(x, 3 * sizeof(S4)));
31411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);  // Ok, was inited before.
31511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(x[2]);
31611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(x[1]);
3170231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[2] = 1;  // Init this here. Check that after realloc it is poisoned again.
3180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x = (int*)Ident(realloc(x, 2 * sizeof(S4)));
31911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);  // Ok, was inited before.
32011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(x[1]);
3210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x = (int*)Ident(realloc(x, 3 * sizeof(S4)));
32211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(x[1]);
32311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(x[2]);
3240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  free(x);
3250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
3260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
3270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Calloc) {
3280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 *x = (int*)Ident(calloc(1, sizeof(S4)));
32911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*x);  // Should not be poisoned.
3300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // EXPECT_EQ(0, *x);
3310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  free(x);
3320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
3330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
3340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, AndOr) {
3350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U4 *p = GetPoisoned<U4>();
3360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // We poison two bytes in the midle of a 4-byte word to make the test
3370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // correct regardless of endianness.
3380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ((U1*)p)[1] = 0;
3390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ((U1*)p)[2] = 0xff;
34011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*p & 0x00ffff00);
34111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*p & 0x00ff0000);
34211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*p & 0x0000ff00);
34311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*p & 0xff000000);
34411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*p & 0x000000ff);
34511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*p & 0x0000ffff);
34611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*p & 0xffff0000);
3470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
34811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*p | 0xff0000ff);
34911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*p | 0xff00ffff);
35011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*p | 0xffff00ff);
35111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*p | 0xff000000);
35211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*p | 0x000000ff);
35311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*p | 0x0000ffff);
35411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*p | 0xffff0000);
3550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
35611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<bool>() & *GetPoisoned<bool>());
3570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
3580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
3590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T>
36011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovstatic bool applyNot(T value, T shadow) {
3610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_partial_poison(&value, &shadow, sizeof(T));
36211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  return !value;
3630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
3640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
3650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Not) {
36611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U4>(0x0, 0x0));
36711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U4>(0xFFFFFFFF, 0x0));
36811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(applyNot<U4>(0xFFFFFFFF, 0xFFFFFFFF));
36911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U4>(0xFF000000, 0x0FFFFFFF));
37011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U4>(0xFF000000, 0x00FFFFFF));
37111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U4>(0xFF000000, 0x0000FFFF));
37211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U4>(0xFF000000, 0x00000000));
37311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(applyNot<U4>(0xFF000000, 0xFF000000));
37411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U4>(0xFF800000, 0xFF000000));
37511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(applyNot<U4>(0x00008000, 0x00008000));
37611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
37711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U1>(0x0, 0x0));
37811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U1>(0xFF, 0xFE));
37911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U1>(0xFF, 0x0));
38011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(applyNot<U1>(0xFF, 0xFF));
38111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
38211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(applyNot<void*>((void*)0xFFFFFF, (void*)(-1)));
38311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<void*>((void*)0xFFFFFF, (void*)(-2)));
3840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
3850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
3860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Shift) {
3870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U4 *up = GetPoisoned<U4>();
3880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ((U1*)up)[0] = 0;
3890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ((U1*)up)[3] = 0xff;
39011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*up >> 30);
39111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*up >> 24);
39211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*up >> 23);
39311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*up >> 10);
3940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
39511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*up << 30);
39611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*up << 24);
39711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*up << 23);
39811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*up << 10);
3990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 *sp = (S4*)up;
40111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*sp >> 30);
40211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*sp >> 24);
40311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*sp >> 23);
40411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*sp >> 10);
4050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  sp = GetPoisoned<S4>();
4070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ((S1*)sp)[1] = 0;
4080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ((S1*)sp)[2] = 0;
40911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*sp >> 31);
4100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
41111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(100 >> *GetPoisoned<S4>());
41211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(100U >> *GetPoisoned<S4>());
4130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE static int GetPoisonedZero() {
4160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int *zero = new int;
4170231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *zero = 0;
4180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(zero, sizeof(*zero));
4190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = *zero;
4200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete zero;
4210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return res;
4220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, LoadFromDirtyAddress) {
4250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int *a = new int;
4260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *a = 0;
42712c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  EXPECT_UMR(break_optimization((void*)(U8)a[GetPoisonedZero()]));
4280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete a;
4290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, StoreToDirtyAddress) {
4320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int *a = new int;
43311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_UMR(a[GetPoisonedZero()] = 0);
43412c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(a);
4350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete a;
4360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE void StackTestFunc() {
4400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 p4;
4410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 ok4 = 1;
4420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S2 p2;
4430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S2 ok2 = 1;
4440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S1 p1;
4450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S1 ok1 = 1;
44612c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&p4);
44712c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&ok4);
44812c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&p2);
44912c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&ok2);
45012c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&p1);
45112c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&ok1);
4520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
45311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(p4);
45411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(p2);
45511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(p1);
45611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(ok1);
45711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(ok2);
45811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(ok4);
4590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, StackTest) {
4620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StackTestFunc();
4630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE void StackStressFunc() {
4660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int foo[10000];
46712c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(foo);
4680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4700231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, DISABLED_StackStressTest) {
4710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  for (int i = 0; i < 1000000; i++)
4720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    StackStressFunc();
4730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T>
4760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovvoid TestFloatingPoint() {
4770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  static volatile T v;
4780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  static T g[100];
47912c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&g);
4800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *x = GetPoisoned<T>();
4810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *y = GetPoisoned<T>(1);
48211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*x);
48311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED((long long)*x);
48411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED((int)*x);
4850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  g[0] = *x;
4860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  g[1] = *x + *y;
4870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  g[2] = *x - *y;
4880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  g[3] = *x * *y;
4890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, FloatingPointTest) {
4920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestFloatingPoint<float>();
4930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestFloatingPoint<double>();
4940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, DynMem) {
4970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 x = 0;
4980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 *y = GetPoisoned<S4>();
4990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  memcpy(y, &x, g_one * sizeof(S4));
50011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*y);
5010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
5020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic char *DynRetTestStr;
5040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, DynRet) {
5060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!__msan_has_dynamic_component()) return;
5070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ReturnPoisoned<S8>();
50811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(clearenv());
5090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
5100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, DynRet1) {
5130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!__msan_has_dynamic_component()) return;
5140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ReturnPoisoned<S8>();
5150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
5160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5170231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct LargeStruct {
5180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 x[10];
5190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
5200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE
5220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovLargeStruct LargeRetTest() {
5230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  LargeStruct res;
5240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[0] = *GetPoisoned<S4>();
5250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[1] = *GetPoisoned<S4>();
5260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[2] = *GetPoisoned<S4>();
5270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[3] = *GetPoisoned<S4>();
5280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[4] = *GetPoisoned<S4>();
5290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[5] = *GetPoisoned<S4>();
5300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[6] = *GetPoisoned<S4>();
5310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[7] = *GetPoisoned<S4>();
5320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[8] = *GetPoisoned<S4>();
5330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[9] = *GetPoisoned<S4>();
5340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return res;
5350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
5360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
53767505a8a0cf9621243ed21b67dfa041224c78e4bAlexey SamsonovTEST(MemorySanitizer, strcmp) {
53867505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov  char s1[10];
53967505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov  char s2[10];
54067505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov  strncpy(s1, "foo", 10);
54167505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov  s2[0] = 'f';
54267505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov  s2[1] = 'n';
54367505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov  EXPECT_GT(strcmp(s1, s2), 0);
54467505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov  s2[1] = 'o';
54567505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov  int res;
54667505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov  EXPECT_UMR(res = strcmp(s1, s2));
54767505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov  EXPECT_NOT_POISONED(res);
54867505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov  EXPECT_EQ(strncmp(s1, s2, 1), 0);
54967505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov}
55067505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov
5510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, LargeRet) {
5520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  LargeStruct a = LargeRetTest();
55311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(a.x[0]);
55411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(a.x[9]);
5550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
5560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5571204979804868728edb6edfe3ae018465191a85cEvgeniy StepanovTEST(MemorySanitizer, strerror) {
5581204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov  char *buf = strerror(EINVAL);
5591204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov  EXPECT_NOT_POISONED(strlen(buf));
5601204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov  buf = strerror(123456);
5611204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov  EXPECT_NOT_POISONED(strlen(buf));
5621204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov}
5631204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov
5641204979804868728edb6edfe3ae018465191a85cEvgeniy StepanovTEST(MemorySanitizer, strerror_r) {
5651204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov  errno = 0;
5661204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov  char buf[1000];
5671204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov  char *res = strerror_r(EINVAL, buf, sizeof(buf));
5681204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov  ASSERT_EQ(0, errno);
5691204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov  if (!res) res = buf; // POSIX version success.
5701204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov  EXPECT_NOT_POISONED(strlen(res));
5711204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov}
5721204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov
5730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, fread) {
5740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char *x = new char[32];
5750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  FILE *f = fopen("/proc/self/stat", "r");
5760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(f);
5770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  fread(x, 1, 32, f);
57811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);
57911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[16]);
58011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[31]);
5810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  fclose(f);
5820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete x;
5830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
5840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, read) {
5860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char *x = new char[32];
5870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int fd = open("/proc/self/stat", O_RDONLY);
5880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(fd > 0);
5890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int sz = read(fd, x, 32);
5900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(sz == 32);
59111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);
59211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[16]);
59311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[31]);
5940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  close(fd);
5950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete x;
5960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
5970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, pread) {
5990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char *x = new char[32];
6000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int fd = open("/proc/self/stat", O_RDONLY);
6010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(fd > 0);
6020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int sz = pread(fd, x, 32, 0);
6030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(sz == 32);
60411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);
60511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[16]);
60611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[31]);
6070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  close(fd);
6080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete x;
6090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
6100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
611b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy StepanovTEST(MemorySanitizer, readv) {
612b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  char buf[2011];
613b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  struct iovec iov[2];
614b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  iov[0].iov_base = buf + 1;
615b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  iov[0].iov_len = 5;
616b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  iov[1].iov_base = buf + 10;
617b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  iov[1].iov_len = 2000;
618b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  int fd = open("/proc/self/stat", O_RDONLY);
619b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  assert(fd > 0);
620b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  int sz = readv(fd, iov, 2);
621b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  ASSERT_LT(sz, 5 + 2000);
622b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  ASSERT_GT(sz, iov[0].iov_len);
623b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_POISONED(buf[0]);
624b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[1]);
625b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[5]);
626b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_POISONED(buf[6]);
627b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_POISONED(buf[9]);
628b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[10]);
629b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[10 + (sz - 1) - 5]);
630b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_POISONED(buf[11 + (sz - 1) - 5]);
631b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  close(fd);
632b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov}
633b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov
634b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy StepanovTEST(MemorySanitizer, preadv) {
635b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  char buf[2011];
636b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  struct iovec iov[2];
637b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  iov[0].iov_base = buf + 1;
638b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  iov[0].iov_len = 5;
639b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  iov[1].iov_base = buf + 10;
640b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  iov[1].iov_len = 2000;
641b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  int fd = open("/proc/self/stat", O_RDONLY);
642b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  assert(fd > 0);
643b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  int sz = preadv(fd, iov, 2, 3);
644b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  ASSERT_LT(sz, 5 + 2000);
645b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  ASSERT_GT(sz, iov[0].iov_len);
646b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_POISONED(buf[0]);
647b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[1]);
648b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[5]);
649b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_POISONED(buf[6]);
650b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_POISONED(buf[9]);
651b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[10]);
652b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[10 + (sz - 1) - 5]);
653b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  EXPECT_POISONED(buf[11 + (sz - 1) - 5]);
654b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov  close(fd);
655b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov}
656b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov
6570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// FIXME: fails now.
6580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, DISABLED_ioctl) {
6590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  struct winsize ws;
6600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(ioctl(2, TIOCGWINSZ, &ws), 0);
66111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(ws.ws_col);
6620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
6630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
6640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, readlink) {
6650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char *x = new char[1000];
6660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  readlink("/proc/self/exe", x, 1000);
66711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);
6680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete [] x;
6690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
6700231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
6710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
6720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, stat) {
6730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  struct stat* st = new struct stat;
6740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = stat("/proc/self/stat", st);
6750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(!res);
67611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(st->st_dev);
67711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(st->st_mode);
67811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(st->st_size);
6790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
6800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
681bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy StepanovTEST(MemorySanitizer, fstatat) {
682bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov  struct stat* st = new struct stat;
683bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov  int dirfd = open("/proc/self", O_RDONLY);
684bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov  assert(dirfd > 0);
685bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov  int res = fstatat(dirfd, "stat", st, 0);
686bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov  assert(!res);
687bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov  EXPECT_NOT_POISONED(st->st_dev);
688bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov  EXPECT_NOT_POISONED(st->st_mode);
689bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov  EXPECT_NOT_POISONED(st->st_size);
690bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov  close(dirfd);
691bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov}
692bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov
6930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, statfs) {
6945cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  struct statfs st;
6955cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  int res = statfs("/", &st);
6960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(!res);
6975cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  EXPECT_NOT_POISONED(st.f_type);
6985cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  EXPECT_NOT_POISONED(st.f_bfree);
6995cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  EXPECT_NOT_POISONED(st.f_namelen);
7005cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov}
7015cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov
7025cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy StepanovTEST(MemorySanitizer, statvfs) {
7035cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  struct statvfs st;
7045cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  int res = statvfs("/", &st);
7055cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  assert(!res);
7065cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  EXPECT_NOT_POISONED(st.f_bsize);
7075cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  EXPECT_NOT_POISONED(st.f_blocks);
7085cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  EXPECT_NOT_POISONED(st.f_bfree);
7095cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  EXPECT_NOT_POISONED(st.f_namemax);
7105cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov}
7115cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov
7125cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy StepanovTEST(MemorySanitizer, fstatvfs) {
7135cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  struct statvfs st;
7145cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  int fd = open("/", O_RDONLY | O_DIRECTORY);
7155cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  int res = fstatvfs(fd, &st);
7165cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  assert(!res);
7175cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  EXPECT_NOT_POISONED(st.f_bsize);
7185cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  EXPECT_NOT_POISONED(st.f_blocks);
7195cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  EXPECT_NOT_POISONED(st.f_bfree);
7205cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  EXPECT_NOT_POISONED(st.f_namemax);
7215cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov  close(fd);
7220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
7230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
7240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, pipe) {
7250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* pipefd = new int[2];
7260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = pipe(pipefd);
7270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(!res);
72811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(pipefd[0]);
72911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(pipefd[1]);
7300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  close(pipefd[0]);
7310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  close(pipefd[1]);
7320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
7330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
734134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy StepanovTEST(MemorySanitizer, pipe2) {
735134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov  int* pipefd = new int[2];
736134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov  int res = pipe2(pipefd, O_NONBLOCK);
737134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov  assert(!res);
738134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov  EXPECT_NOT_POISONED(pipefd[0]);
739134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov  EXPECT_NOT_POISONED(pipefd[1]);
740134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov  close(pipefd[0]);
741134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov  close(pipefd[1]);
742134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov}
743134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov
744134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy StepanovTEST(MemorySanitizer, socketpair) {
745134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov  int sv[2];
746134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov  int res = socketpair(AF_UNIX, SOCK_STREAM, 0, sv);
747134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov  assert(!res);
748134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov  EXPECT_NOT_POISONED(sv[0]);
749134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov  EXPECT_NOT_POISONED(sv[1]);
750134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov  close(sv[0]);
751134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov  close(sv[1]);
752134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov}
753134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov
754e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy StepanovTEST(MemorySanitizer, poll) {
755e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  int* pipefd = new int[2];
756e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  int res = pipe(pipefd);
757e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  ASSERT_EQ(0, res);
758e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov
759e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  char data = 42;
760e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  res = write(pipefd[1], &data, 1);
761e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  ASSERT_EQ(1, res);
762e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov
763e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  pollfd fds[2];
764e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  fds[0].fd = pipefd[0];
765e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  fds[0].events = POLLIN;
766e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  fds[1].fd = pipefd[1];
767e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  fds[1].events = POLLIN;
768e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  res = poll(fds, 2, 500);
769e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  ASSERT_EQ(1, res);
770e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  EXPECT_NOT_POISONED(fds[0].revents);
771e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  EXPECT_NOT_POISONED(fds[1].revents);
772e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov
773e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  close(pipefd[0]);
774e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  close(pipefd[1]);
775e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov}
776e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov
77747177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy StepanovTEST(MemorySanitizer, ppoll) {
77847177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  int* pipefd = new int[2];
77947177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  int res = pipe(pipefd);
78047177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  ASSERT_EQ(0, res);
78147177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov
78247177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  char data = 42;
78347177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  res = write(pipefd[1], &data, 1);
78447177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  ASSERT_EQ(1, res);
78547177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov
78647177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  pollfd fds[2];
78747177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  fds[0].fd = pipefd[0];
78847177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  fds[0].events = POLLIN;
78947177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  fds[1].fd = pipefd[1];
79047177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  fds[1].events = POLLIN;
79147177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  sigset_t ss;
79247177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  sigemptyset(&ss);
79347177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  res = ppoll(fds, 2, NULL, &ss);
79447177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  ASSERT_EQ(1, res);
79547177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  EXPECT_NOT_POISONED(fds[0].revents);
79647177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  EXPECT_NOT_POISONED(fds[1].revents);
79747177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov
79847177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  close(pipefd[0]);
79947177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov  close(pipefd[1]);
80047177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov}
80147177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov
802e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy StepanovTEST(MemorySanitizer, poll_positive) {
803e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  int* pipefd = new int[2];
804e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  int res = pipe(pipefd);
805e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  ASSERT_EQ(0, res);
806e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov
807e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  pollfd fds[2];
808e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  fds[0].fd = pipefd[0];
809e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  fds[0].events = POLLIN;
810e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  // fds[1].fd uninitialized
811e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  fds[1].events = POLLIN;
812e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  EXPECT_UMR(poll(fds, 2, 0));
813e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov
814e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  close(pipefd[0]);
815e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov  close(pipefd[1]);
816e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov}
817e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov
8189f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy StepanovTEST(MemorySanitizer, bind_getsockname) {
8199f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  int sock = socket(AF_UNIX, SOCK_STREAM, 0);
8209f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov
8219f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  struct sockaddr_in sai;
8229f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  memset(&sai, 0, sizeof(sai));
8239f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  sai.sin_family = AF_UNIX;
8249f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  int res = bind(sock, (struct sockaddr *)&sai, sizeof(sai));
8259f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov
8269f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  assert(!res);
8279f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  char buf[200];
8289f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  socklen_t addrlen;
8299f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  EXPECT_UMR(getsockname(sock, (struct sockaddr *)&buf, &addrlen));
8309f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov
8319f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  addrlen = sizeof(buf);
8329f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  res = getsockname(sock, (struct sockaddr *)&buf, &addrlen);
8339f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  EXPECT_NOT_POISONED(addrlen);
8349f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[0]);
8359f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[addrlen - 1]);
8369f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  EXPECT_POISONED(buf[addrlen]);
8379f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov  close(sock);
8389f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov}
8399f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov
8409d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy StepanovTEST(MemorySanitizer, accept) {
8419d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  int listen_socket = socket(AF_INET, SOCK_STREAM, 0);
8429d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  ASSERT_LT(0, listen_socket);
8439d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov
8449d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  struct sockaddr_in sai;
845ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  memset(&sai, 0, sizeof(sai));
8469d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  sai.sin_family = AF_INET;
8479d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  sai.sin_port = 0;
8489d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  sai.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
8499d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  int res = bind(listen_socket, (struct sockaddr *)&sai, sizeof(sai));
8509d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  ASSERT_EQ(0, res);
8519d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov
8529d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  res = listen(listen_socket, 1);
8539d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  ASSERT_EQ(0, res);
8549d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov
8559d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  socklen_t sz = sizeof(sai);
8569d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  res = getsockname(listen_socket, (struct sockaddr *)&sai, &sz);
8579d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  ASSERT_EQ(0, res);
8589d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  ASSERT_EQ(sizeof(sai), sz);
859bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov
8609d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  int connect_socket = socket(AF_INET, SOCK_STREAM, 0);
8619d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  ASSERT_LT(0, connect_socket);
8629d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  res = fcntl(connect_socket, F_SETFL, O_NONBLOCK);
8639d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  ASSERT_EQ(0, res);
8649d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  res = connect(connect_socket, (struct sockaddr *)&sai, sizeof(sai));
8659d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  ASSERT_EQ(-1, res);
8669d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  ASSERT_EQ(EINPROGRESS, errno);
8679d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov
8689d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  __msan_poison(&sai, sizeof(sai));
869bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov  int new_sock = accept(listen_socket, (struct sockaddr *)&sai, &sz);
8709d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  ASSERT_LT(0, new_sock);
8719d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  ASSERT_EQ(sizeof(sai), sz);
8729d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  EXPECT_NOT_POISONED(sai);
8739d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov
874bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov  __msan_poison(&sai, sizeof(sai));
875bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov  res = getpeername(new_sock, (struct sockaddr *)&sai, &sz);
876bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov  ASSERT_EQ(0, res);
877bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov  ASSERT_EQ(sizeof(sai), sz);
878bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov  EXPECT_NOT_POISONED(sai);
879bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov
8809d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  close(new_sock);
8819d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  close(connect_socket);
8829d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov  close(listen_socket);
8839d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov}
8849d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov
885512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy StepanovTEST(MemorySanitizer, getaddrinfo) {
886512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov  struct addrinfo *ai;
887512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov  struct addrinfo hints;
888512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov  memset(&hints, 0, sizeof(hints));
889512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov  hints.ai_family = AF_INET;
890512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov  int res = getaddrinfo("localhost", NULL, &hints, &ai);
891512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov  ASSERT_EQ(0, res);
892512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov  EXPECT_NOT_POISONED(*ai);
893512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov  ASSERT_EQ(sizeof(sockaddr_in), ai->ai_addrlen);
894512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov  EXPECT_NOT_POISONED(*(sockaddr_in*)ai->ai_addr);
895512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov}
896512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov
8979eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy StepanovTEST(MemorySanitizer, getnameinfo) {
8989eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov  struct sockaddr_in sai;
899ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  memset(&sai, 0, sizeof(sai));
9009eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov  sai.sin_family = AF_INET;
9019eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov  sai.sin_port = 80;
9029eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov  sai.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
9039eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov  char host[500];
9049eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov  char serv[500];
9059eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov  int res = getnameinfo((struct sockaddr *)&sai, sizeof(sai), host,
9069eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov                        sizeof(host), serv, sizeof(serv), 0);
9079eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov  ASSERT_EQ(0, res);
9089eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov  EXPECT_NOT_POISONED(host[0]);
9099eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov  EXPECT_POISONED(host[sizeof(host) - 1]);
9109eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov
9119eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov  ASSERT_NE(0, strlen(host));
9129eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov  EXPECT_NOT_POISONED(serv[0]);
9139eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov  EXPECT_POISONED(serv[sizeof(serv) - 1]);
9149eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov  ASSERT_NE(0, strlen(serv));
9159eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov}
9169eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov
9170a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov#define EXPECT_HOSTENT_NOT_POISONED(he)        \
9180a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  do {                                         \
9190a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov    EXPECT_NOT_POISONED(*(he));                \
9200a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov    ASSERT_NE((void *) 0, (he)->h_name);       \
9210a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov    ASSERT_NE((void *) 0, (he)->h_aliases);    \
9220a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov    ASSERT_NE((void *) 0, (he)->h_addr_list);  \
9230a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov    EXPECT_NOT_POISONED(strlen((he)->h_name)); \
9240a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov    char **p = (he)->h_aliases;                \
9250a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov    while (*p) {                               \
9260a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov      EXPECT_NOT_POISONED(strlen(*p));         \
9270a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov      ++p;                                     \
9280a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov    }                                          \
9290a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov    char **q = (he)->h_addr_list;              \
9300a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov    while (*q) {                               \
9310a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov      EXPECT_NOT_POISONED(*q[0]);              \
9320a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov      ++q;                                     \
9330a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov    }                                          \
9340a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov    EXPECT_NOT_POISONED(*q);                   \
9350a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  } while (0)
9360a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov
9370a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovTEST(MemorySanitizer, gethostent) {
9380a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  struct hostent *he = gethostent();
9390a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  ASSERT_NE((void *)NULL, he);
9400a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_HOSTENT_NOT_POISONED(he);
9410a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov}
9420a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov
943263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov#ifndef MSAN_TEST_DISABLE_GETHOSTBYNAME
944263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov
9450a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovTEST(MemorySanitizer, gethostbyname) {
9460a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  struct hostent *he = gethostbyname("localhost");
9470a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  ASSERT_NE((void *)NULL, he);
9480a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_HOSTENT_NOT_POISONED(he);
9490a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov}
9500a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov
951263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov#endif // MSAN_TEST_DISABLE_GETHOSTBYNAME
952263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov
953ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy StepanovTEST(MemorySanitizer, recvmsg) {
954ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  int server_socket = socket(AF_INET, SOCK_DGRAM, 0);
955ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  ASSERT_LT(0, server_socket);
956ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov
957ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  struct sockaddr_in sai;
958ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  memset(&sai, 0, sizeof(sai));
959ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  sai.sin_family = AF_INET;
960ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  sai.sin_port = 0;
961ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  sai.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
962ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  int res = bind(server_socket, (struct sockaddr *)&sai, sizeof(sai));
963ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  ASSERT_EQ(0, res);
964ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov
965ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  socklen_t sz = sizeof(sai);
966ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  res = getsockname(server_socket, (struct sockaddr *)&sai, &sz);
967ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  ASSERT_EQ(0, res);
968ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  ASSERT_EQ(sizeof(sai), sz);
969ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov
970ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov
971ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  int client_socket = socket(AF_INET, SOCK_DGRAM, 0);
972ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  ASSERT_LT(0, client_socket);
973ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov
974ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  struct sockaddr_in client_sai;
975ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  memset(&client_sai, 0, sizeof(client_sai));
976ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  client_sai.sin_family = AF_INET;
977ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  client_sai.sin_port = 0;
978ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  client_sai.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
979ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  res = bind(client_socket, (struct sockaddr *)&client_sai, sizeof(client_sai));
980ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  ASSERT_EQ(0, res);
981ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov
982ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  sz = sizeof(client_sai);
983ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  res = getsockname(client_socket, (struct sockaddr *)&client_sai, &sz);
984ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  ASSERT_EQ(0, res);
985ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  ASSERT_EQ(sizeof(client_sai), sz);
986ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov
987ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov
988ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  const char *s = "message text";
989ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  struct iovec iov;
990ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  iov.iov_base = (void *)s;
991ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  iov.iov_len = strlen(s) + 1;
992ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  struct msghdr msg;
993ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  memset(&msg, 0, sizeof(msg));
994ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  msg.msg_name = &sai;
995ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  msg.msg_namelen = sizeof(sai);
996ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  msg.msg_iov = &iov;
997ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  msg.msg_iovlen = 1;
998ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  res = sendmsg(client_socket, &msg, 0);
999ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  ASSERT_LT(0, res);
1000ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov
1001ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov
1002ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  char buf[1000];
1003ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  struct iovec recv_iov;
1004ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  recv_iov.iov_base = (void *)&buf;
1005ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  recv_iov.iov_len = sizeof(buf);
1006ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  struct sockaddr_in recv_sai;
1007ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  struct msghdr recv_msg;
1008ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  memset(&recv_msg, 0, sizeof(recv_msg));
1009ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  recv_msg.msg_name = &recv_sai;
1010ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  recv_msg.msg_namelen = sizeof(recv_sai);
1011ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  recv_msg.msg_iov = &recv_iov;
1012ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  recv_msg.msg_iovlen = 1;
1013ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  res = recvmsg(server_socket, &recv_msg, 0);
1014ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  ASSERT_LT(0, res);
1015ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov
1016ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  ASSERT_EQ(sizeof(recv_sai), recv_msg.msg_namelen);
1017ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  EXPECT_NOT_POISONED(*(struct sockaddr_in *)recv_msg.msg_name);
1018ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  EXPECT_STREQ(s, buf);
1019ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov
1020ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  close(server_socket);
1021ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov  close(client_socket);
1022ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov}
1023ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov
10240a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovTEST(MemorySanitizer, gethostbyname2) {
10250a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  struct hostent *he = gethostbyname2("localhost", AF_INET);
10260a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  ASSERT_NE((void *)NULL, he);
10270a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_HOSTENT_NOT_POISONED(he);
10280a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov}
10290a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov
10300a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovTEST(MemorySanitizer, gethostbyaddr) {
10310a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  in_addr_t addr = inet_addr("127.0.0.1");
10320a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_NOT_POISONED(addr);
10330a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  struct hostent *he = gethostbyaddr(&addr, sizeof(addr), AF_INET);
10340a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  ASSERT_NE((void *)NULL, he);
10350a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_HOSTENT_NOT_POISONED(he);
10360a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov}
10370a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov
10380a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovTEST(MemorySanitizer, gethostent_r) {
10390a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  char buf[2000];
10400a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  struct hostent he;
10410a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  struct hostent *result;
10420a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  int err;
10430a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  int res = gethostent_r(&he, buf, sizeof(buf), &result, &err);
10440a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  ASSERT_EQ(0, res);
10450a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_NOT_POISONED(result);
10460a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  ASSERT_NE((void *)NULL, result);
10470a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_HOSTENT_NOT_POISONED(result);
10480a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_NOT_POISONED(err);
10490a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov}
10500a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov
10510a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovTEST(MemorySanitizer, gethostbyname_r) {
10520a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  char buf[2000];
10530a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  struct hostent he;
10540a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  struct hostent *result;
10550a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  int err;
10560a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  int res = gethostbyname_r("localhost", &he, buf, sizeof(buf), &result, &err);
10570a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  ASSERT_EQ(0, res);
10580a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_NOT_POISONED(result);
10590a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  ASSERT_NE((void *)NULL, result);
10600a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_HOSTENT_NOT_POISONED(result);
10610a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_NOT_POISONED(err);
10620a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov}
10630a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov
10640a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovTEST(MemorySanitizer, gethostbyname2_r) {
10650a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  char buf[2000];
10660a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  struct hostent he;
10670a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  struct hostent *result;
10680a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  int err;
10690a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  int res = gethostbyname2_r("localhost", AF_INET, &he, buf, sizeof(buf),
10700a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov                             &result, &err);
10710a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  ASSERT_EQ(0, res);
10720a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_NOT_POISONED(result);
10730a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  ASSERT_NE((void *)NULL, result);
10740a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_HOSTENT_NOT_POISONED(result);
10750a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_NOT_POISONED(err);
10760a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov}
10770a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov
10780a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovTEST(MemorySanitizer, gethostbyaddr_r) {
10790a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  char buf[2000];
10800a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  struct hostent he;
10810a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  struct hostent *result;
10820a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  int err;
10830a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  in_addr_t addr = inet_addr("127.0.0.1");
10840a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_NOT_POISONED(addr);
10850a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  int res = gethostbyaddr_r(&addr, sizeof(addr), AF_INET, &he, buf, sizeof(buf),
10860a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov                            &result, &err);
10870a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  ASSERT_EQ(0, res);
10880a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_NOT_POISONED(result);
10890a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  ASSERT_NE((void *)NULL, result);
10900a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_HOSTENT_NOT_POISONED(result);
10910a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov  EXPECT_NOT_POISONED(err);
10920a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov}
10930a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov
1094f32be42523a199674ea665a499db131591e64e08Evgeniy StepanovTEST(MemorySanitizer, getsockopt) {
1095f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov  int sock = socket(AF_UNIX, SOCK_STREAM, 0);
1096f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov  struct linger l[2];
1097f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov  socklen_t sz = sizeof(l[0]);
1098f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov  int res = getsockopt(sock, SOL_SOCKET, SO_LINGER, &l[0], &sz);
1099f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov  ASSERT_EQ(0, res);
1100f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov  ASSERT_EQ(sizeof(l[0]), sz);
1101f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov  EXPECT_NOT_POISONED(l[0]);
1102f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov  EXPECT_POISONED(*(char *)(l + 1));
1103f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov}
1104f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov
11050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, getcwd) {
11060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char path[PATH_MAX + 1];
11070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* res = getcwd(path, sizeof(path));
11080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(res);
110911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(path[0]);
11100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
11110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
11127eed04c4dce69ad1e485edbf6dd963e176b52e0dEvgeniy StepanovTEST(MemorySanitizer, getcwd_gnu) {
11137eed04c4dce69ad1e485edbf6dd963e176b52e0dEvgeniy Stepanov  char* res = getcwd(NULL, 0);
11147eed04c4dce69ad1e485edbf6dd963e176b52e0dEvgeniy Stepanov  assert(res);
11157eed04c4dce69ad1e485edbf6dd963e176b52e0dEvgeniy Stepanov  EXPECT_NOT_POISONED(res[0]);
11167eed04c4dce69ad1e485edbf6dd963e176b52e0dEvgeniy Stepanov  free(res);
11177eed04c4dce69ad1e485edbf6dd963e176b52e0dEvgeniy Stepanov}
11187eed04c4dce69ad1e485edbf6dd963e176b52e0dEvgeniy Stepanov
1119801448950d645813efb398575bbc62b48e5b1dfcEvgeniy StepanovTEST(MemorySanitizer, get_current_dir_name) {
1120801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  char* res = get_current_dir_name();
1121801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  assert(res);
1122801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  EXPECT_NOT_POISONED(res[0]);
1123801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  free(res);
1124801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov}
1125801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov
112610362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy StepanovTEST(MemorySanitizer, shmctl) {
112710362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  int id = shmget(IPC_PRIVATE, 4096, 0644 | IPC_CREAT);
112810362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  ASSERT_GT(id, -1);
112910362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov
113010362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  struct shmid_ds ds;
113110362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  int res = shmctl(id, IPC_STAT, &ds);
113210362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  ASSERT_GT(res, -1);
113310362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  EXPECT_NOT_POISONED(ds);
113410362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov
113510362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  struct shminfo si;
113610362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  res = shmctl(id, IPC_INFO, (struct shmid_ds *)&si);
113710362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  ASSERT_GT(res, -1);
113810362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  EXPECT_NOT_POISONED(si);
113910362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov
114010362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  struct shm_info s_i;
114110362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  res = shmctl(id, SHM_INFO, (struct shmid_ds *)&s_i);
114210362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  ASSERT_GT(res, -1);
114310362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  EXPECT_NOT_POISONED(s_i);
114410362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov
114510362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  res = shmctl(id, IPC_RMID, 0);
114610362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov  ASSERT_GT(res, -1);
114710362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov}
114810362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov
1149aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy StepanovTEST(MemorySanitizer, random_r) {
1150aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov  int32_t x;
1151aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov  char z[64];
1152aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov  struct random_data buf;
1153aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov
1154aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov  memset(z, 0, sizeof(z));
1155aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov  int res = initstate_r(0, z, sizeof(z), &buf);
1156aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov  ASSERT_EQ(0, res);
1157aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov
1158aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov  res = random_r(&buf, &x);
1159aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov  ASSERT_EQ(0, res);
1160aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov  EXPECT_NOT_POISONED(x);
1161aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov}
116210362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov
11635ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy StepanovTEST(MemorySanitizer, confstr) {
11645ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov  char buf[3];
11655ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov  size_t res = confstr(_CS_PATH, buf, sizeof(buf));
11665ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov  ASSERT_GT(res, sizeof(buf));
11675ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[0]);
11685ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[sizeof(buf) - 1]);
11695ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov
11705ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov  char buf2[1000];
11715ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov  res = confstr(_CS_PATH, buf2, sizeof(buf2));
11725ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov  ASSERT_LT(res, sizeof(buf2));
11735ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov  EXPECT_NOT_POISONED(buf2[0]);
11745ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov  EXPECT_NOT_POISONED(buf2[res - 1]);
11755ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov  EXPECT_POISONED(buf2[res]);
11765ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov  ASSERT_EQ(res, strlen(buf2) + 1);
11775ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov}
11785ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov
1179d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy StepanovTEST(MemorySanitizer, readdir) {
1180d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov  DIR *dir = opendir(".");
1181d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov  struct dirent *d = readdir(dir);
1182d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov  assert(d);
1183d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov  EXPECT_NOT_POISONED(d->d_name[0]);
1184d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov  closedir(dir);
1185d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov}
1186d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov
1187b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy StepanovTEST(MemorySanitizer, readdir_r) {
1188b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov  DIR *dir = opendir(".");
1189b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov  struct dirent d;
1190b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov  struct dirent *pd;
1191b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov  int res = readdir_r(dir, &d, &pd);
1192b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov  assert(!res);
1193b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov  EXPECT_NOT_POISONED(pd);
1194b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov  EXPECT_NOT_POISONED(d.d_name[0]);
1195b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov  closedir(dir);
1196b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov}
1197b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov
11980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, realpath) {
11990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  const char* relpath = ".";
12000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char path[PATH_MAX + 1];
12010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* res = realpath(relpath, path);
12020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(res);
120311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(path[0]);
12040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
12050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
120612eb79dd701d9d40551759330a9257316601373bEvgeniy StepanovTEST(MemorySanitizer, realpath_null) {
120712eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov  const char* relpath = ".";
120812eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov  char* res = realpath(relpath, NULL);
120912eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov  printf("%d, %s\n", errno, strerror(errno));
121012eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov  assert(res);
121112eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov  EXPECT_NOT_POISONED(res[0]);
121212eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov  free(res);
121312eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov}
121412eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov
121512eb79dd701d9d40551759330a9257316601373bEvgeniy StepanovTEST(MemorySanitizer, canonicalize_file_name) {
121612eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov  const char* relpath = ".";
121712eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov  char* res = canonicalize_file_name(relpath);
121812eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov  assert(res);
121912eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov  EXPECT_NOT_POISONED(res[0]);
122012eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov  free(res);
1221534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov}
1222534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov
1223534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanovextern char **environ;
1224534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov
1225534e2ba5188e1a74b340f9507755806357835f62Evgeniy StepanovTEST(MemorySanitizer, setenv) {
1226534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov  setenv("AAA", "BBB", 1);
1227534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov  for (char **envp = environ; *envp; ++envp) {
1228534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov    EXPECT_NOT_POISONED(*envp);
1229534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov    EXPECT_NOT_POISONED(*envp[0]);
1230534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov  }
1231534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov}
1232534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov
1233534e2ba5188e1a74b340f9507755806357835f62Evgeniy StepanovTEST(MemorySanitizer, putenv) {
1234534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov  char s[] = "AAA=BBB";
1235534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov  putenv(s);
1236534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov  for (char **envp = environ; *envp; ++envp) {
1237534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov    EXPECT_NOT_POISONED(*envp);
1238534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov    EXPECT_NOT_POISONED(*envp[0]);
1239534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov  }
124012eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov}
124112eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov
12420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, memcpy) {
12430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* x = new char[2];
12440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* y = new char[2];
12450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[0] = 1;
12460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[1] = *GetPoisoned<char>();
12470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  memcpy(y, x, 2);
124811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(y[0]);
124911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(y[1]);
12500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
12510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
1252450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanovvoid TestUnalignedMemcpy(int left, int right, bool src_is_aligned) {
1253450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov  const int sz = 20;
1254450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov  char *dst = (char *)malloc(sz);
1255450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov  U4 origin = __msan_get_origin(dst);
1256450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov
1257450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov  char *src = (char *)malloc(sz);
1258450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov  memset(src, 0, sz);
1259450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov
1260450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov  memcpy(dst + left, src_is_aligned ? src + left : src, sz - left - right);
1261450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov  for (int i = 0; i < left; ++i)
1262450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov    EXPECT_POISONED_O(dst[i], origin);
1263450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov  for (int i = 0; i < right; ++i)
1264450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov    EXPECT_POISONED_O(dst[sz - i - 1], origin);
1265450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov  EXPECT_NOT_POISONED(dst[left]);
1266450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov  EXPECT_NOT_POISONED(dst[sz - right - 1]);
1267450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov
1268450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov  free(dst);
1269450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov  free(src);
1270450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov}
1271450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov
1272450eee655289a622ab9acf87d863f38991b184c9Evgeniy StepanovTEST(MemorySanitizer, memcpy_unaligned) {
1273450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov  for (int i = 0; i < 4; ++i) {
1274450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov    for (int j = 0; j < 4; ++j) {
1275450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov      TestUnalignedMemcpy(i, j, true);
1276450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov      TestUnalignedMemcpy(i, j, false);
1277450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov    }
1278450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov  }
1279450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov}
1280450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov
12810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, memmove) {
12820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* x = new char[2];
12830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* y = new char[2];
12840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[0] = 1;
12850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[1] = *GetPoisoned<char>();
12860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  memmove(y, x, 2);
128711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(y[0]);
128811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(y[1]);
12890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
12900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
1291ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy StepanovTEST(MemorySanitizer, bcopy) {
1292ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  char* x = new char[2];
1293ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  char* y = new char[2];
1294ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  x[0] = 1;
1295ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  x[1] = *GetPoisoned<char>();
1296ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  bcopy(x, y, 2);
1297ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  EXPECT_NOT_POISONED(y[0]);
1298ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  EXPECT_POISONED(y[1]);
1299ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov}
1300ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov
13010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, strdup) {
13028aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  char buf[4] = "abc";
13038aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  __msan_poison(buf + 2, sizeof(*buf));
13048aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  char *x = strdup(buf);
13058aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);
13068aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_NOT_POISONED(x[1]);
13078aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_POISONED(x[2]);
13088aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_NOT_POISONED(x[3]);
13098aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  free(x);
13108aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov}
13118aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov
13128aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy StepanovTEST(MemorySanitizer, strndup) {
13138aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  char buf[4] = "abc";
13148aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  __msan_poison(buf + 2, sizeof(*buf));
13158aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  char *x = strndup(buf, 3);
13168aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);
13178aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_NOT_POISONED(x[1]);
13188aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_POISONED(x[2]);
13198aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_NOT_POISONED(x[3]);
13200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  free(x);
13210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
13220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
13238aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy StepanovTEST(MemorySanitizer, strndup_short) {
13248aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  char buf[4] = "abc";
13258aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  __msan_poison(buf + 1, sizeof(*buf));
13268aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  __msan_poison(buf + 2, sizeof(*buf));
13278aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  char *x = strndup(buf, 2);
13288aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);
13298aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_POISONED(x[1]);
13301d21bd159c3830dd7a6c05854408442d91a336adEvgeniy Stepanov  EXPECT_NOT_POISONED(x[2]);
13318aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  free(x);
13328aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov}
13338aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov
13348aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov
13350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T, int size>
13360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovvoid TestOverlapMemmove() {
13370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *x = new T[size];
13380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(size >= 3);
13390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[2] = 0;
13400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  memmove(x, x + 1, (size - 1) * sizeof(T));
134111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[1]);
13420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!__msan_has_dynamic_component()) {
13430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    // FIXME: under DR we will lose this information
13440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    // because accesses in memmove will unpoisin the shadow.
13450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    // We need to use our own memove implementation instead of libc's.
134611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov    EXPECT_POISONED(x[0]);
134711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov    EXPECT_POISONED(x[2]);
13480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  }
13490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete [] x;
13500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
13510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
13520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, overlap_memmove) {
13530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestOverlapMemmove<U1, 10>();
13540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestOverlapMemmove<U1, 1000>();
13550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestOverlapMemmove<U8, 4>();
13560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestOverlapMemmove<U8, 1000>();
13570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
13580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
13590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, strcpy) {  // NOLINT
13600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* x = new char[3];
13610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* y = new char[3];
13620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[0] = 'a';
13630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[1] = *GetPoisoned<char>(1, 1);
13640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[2] = 0;
13650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  strcpy(y, x);  // NOLINT
136611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(y[0]);
136711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(y[1]);
136811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(y[2]);
13690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
13700231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
13710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, strncpy) {  // NOLINT
13720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* x = new char[3];
13730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* y = new char[3];
13740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[0] = 'a';
13750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[1] = *GetPoisoned<char>(1, 1);
13760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[2] = 0;
13770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  strncpy(y, x, 2);  // NOLINT
137811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(y[0]);
137911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(y[1]);
138011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(y[2]);
13810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
13820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
13834bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy StepanovTEST(MemorySanitizer, stpcpy) {  // NOLINT
13844bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov  char* x = new char[3];
13854bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov  char* y = new char[3];
13864bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov  x[0] = 'a';
13874bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov  x[1] = *GetPoisoned<char>(1, 1);
13884bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov  x[2] = 0;
13894bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov  char *res = stpcpy(y, x);  // NOLINT
13904bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov  ASSERT_EQ(res, y + 2);
13914bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov  EXPECT_NOT_POISONED(y[0]);
13924bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov  EXPECT_POISONED(y[1]);
13934bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov  EXPECT_NOT_POISONED(y[2]);
13944bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov}
13954bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov
13960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, strtol) {
13970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char *e;
13980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(1 == strtol("1", &e, 10));
139911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED((S8) e);
14000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
14010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
14020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, strtoll) {
14030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char *e;
14040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(1 == strtoll("1", &e, 10));
140511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED((S8) e);
14060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
14070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
14080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, strtoul) {
14090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char *e;
14100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(1 == strtoul("1", &e, 10));
141111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED((S8) e);
14120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
14130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
14140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, strtoull) {
14150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char *e;
14160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(1 == strtoull("1", &e, 10));
141711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED((S8) e);
14180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
14190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
1420ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy StepanovTEST(MemorySanitizer, strtoimax) {
1421ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  char *e;
1422ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  assert(1 == strtoimax("1", &e, 10));
1423ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  EXPECT_NOT_POISONED((S8) e);
1424ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov}
1425ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov
1426ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy StepanovTEST(MemorySanitizer, strtoumax) {
1427ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  char *e;
1428ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  assert(1 == strtoumax("1", &e, 10));
1429ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  EXPECT_NOT_POISONED((S8) e);
1430ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov}
1431ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov
1432e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy StepanovTEST(MemorySanitizer, strtod) {
1433e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  char *e;
1434e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  assert(0 != strtod("1.5", &e));
143511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED((S8) e);
1436e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov}
1437e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov
14383f4beff5efdd0d30844ca8b270876f7d59a608e7Evgeniy Stepanov#ifdef __GLIBC__
14393f4beff5efdd0d30844ca8b270876f7d59a608e7Evgeniy Stepanovextern "C" double __strtod_l(const char *nptr, char **endptr, locale_t loc);
14403f4beff5efdd0d30844ca8b270876f7d59a608e7Evgeniy StepanovTEST(MemorySanitizer, __strtod_l) {
14413f4beff5efdd0d30844ca8b270876f7d59a608e7Evgeniy Stepanov  locale_t loc = newlocale(LC_NUMERIC_MASK, "C", (locale_t)0);
14423f4beff5efdd0d30844ca8b270876f7d59a608e7Evgeniy Stepanov  char *e;
14433f4beff5efdd0d30844ca8b270876f7d59a608e7Evgeniy Stepanov  assert(0 != __strtod_l("1.5", &e, loc));
14443f4beff5efdd0d30844ca8b270876f7d59a608e7Evgeniy Stepanov  EXPECT_NOT_POISONED((S8) e);
14453f4beff5efdd0d30844ca8b270876f7d59a608e7Evgeniy Stepanov  freelocale(loc);
14463f4beff5efdd0d30844ca8b270876f7d59a608e7Evgeniy Stepanov}
14473f4beff5efdd0d30844ca8b270876f7d59a608e7Evgeniy Stepanov#endif  // __GLIBC__
14483f4beff5efdd0d30844ca8b270876f7d59a608e7Evgeniy Stepanov
1449e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy StepanovTEST(MemorySanitizer, strtof) {
1450e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  char *e;
1451e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  assert(0 != strtof("1.5", &e));
145211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED((S8) e);
1453e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov}
1454e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov
1455e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy StepanovTEST(MemorySanitizer, strtold) {
1456e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  char *e;
1457e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  assert(0 != strtold("1.5", &e));
145811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED((S8) e);
1459e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov}
1460e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov
1461c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy StepanovTEST(MemorySanitizer, modf) {
1462c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov  double x, y;
1463c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov  x = modf(2.1, &y);
1464c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov  EXPECT_NOT_POISONED(y);
1465c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov}
1466c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov
1467c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy StepanovTEST(MemorySanitizer, modff) {
1468c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov  float x, y;
1469c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov  x = modff(2.1, &y);
1470c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov  EXPECT_NOT_POISONED(y);
1471c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov}
1472c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov
1473c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy StepanovTEST(MemorySanitizer, modfl) {
1474c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov  long double x, y;
1475c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov  x = modfl(2.1, &y);
1476c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov  EXPECT_NOT_POISONED(y);
1477c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov}
1478c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov
14790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, sprintf) {  // NOLINT
14800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char buff[10];
148112c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(buff);
148211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(buff[0]);
14830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = sprintf(buff, "%d", 1234567);  // NOLINT
14840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(res == 7);
14850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(buff[0] == '1');
14860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(buff[1] == '2');
14870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(buff[2] == '3');
14880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(buff[6] == '7');
14890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(buff[7] == 0);
149011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(buff[8]);
14910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
14920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
14930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, snprintf) {
14940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char buff[10];
149512c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(buff);
149611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(buff[0]);
14970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = snprintf(buff, sizeof(buff), "%d", 1234567);
14980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(res == 7);
14990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(buff[0] == '1');
15000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(buff[1] == '2');
15010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(buff[2] == '3');
15020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(buff[6] == '7');
15030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(buff[7] == 0);
150411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(buff[8]);
15050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
15060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
15070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, swprintf) {
15080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  wchar_t buff[10];
15090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(sizeof(wchar_t) == 4);
151012c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(buff);
151111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(buff[0]);
15120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = swprintf(buff, 9, L"%d", 1234567);
15130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(res == 7);
15140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(buff[0] == '1');
15150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(buff[1] == '2');
15160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(buff[2] == '3');
15170231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(buff[6] == '7');
15180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(buff[7] == 0);
151911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(buff[8]);
15200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
15210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
15220797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy StepanovTEST(MemorySanitizer, asprintf) {  // NOLINT
15230797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov  char *pbuf;
15240797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov  EXPECT_POISONED(pbuf);
15250797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov  int res = asprintf(&pbuf, "%d", 1234567);  // NOLINT
15260797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov  assert(res == 7);
15270797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov  EXPECT_NOT_POISONED(pbuf);
15280797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov  assert(pbuf[0] == '1');
15290797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov  assert(pbuf[1] == '2');
15300797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov  assert(pbuf[2] == '3');
15310797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov  assert(pbuf[6] == '7');
15320797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov  assert(pbuf[7] == 0);
15330797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov  free(pbuf);
15340797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov}
15350797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov
1536e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey SamsonovTEST(MemorySanitizer, mbstowcs) {
1537e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov  const char *x = "abc";
1538e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov  wchar_t buff[10];
1539e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov  int res = mbstowcs(buff, x, 2);
1540e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov  EXPECT_EQ(2, res);
1541e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov  EXPECT_EQ(L'a', buff[0]);
1542e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov  EXPECT_EQ(L'b', buff[1]);
1543e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov  EXPECT_POISONED(buff[2]);
1544e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov  res = mbstowcs(buff, x, 10);
1545e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov  EXPECT_EQ(3, res);
1546e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov  EXPECT_NOT_POISONED(buff[3]);
1547e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov}
1548e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov
15490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, wcstombs) {
15500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  const wchar_t *x = L"abc";
15510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char buff[10];
15520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = wcstombs(buff, x, 4);
15530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(res, 3);
15540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(buff[0], 'a');
15550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(buff[1], 'b');
15560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(buff[2], 'c');
15570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
15580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
1559ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy StepanovTEST(MemorySanitizer, wcsrtombs) {
1560ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  const wchar_t *x = L"abc";
1561ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  const wchar_t *p = x;
1562ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  char buff[10];
1563ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  mbstate_t mbs;
156457a1095fca7b95db8a0ec87fce7a6f0e331a5b99Evgeniy Stepanov  memset(&mbs, 0, sizeof(mbs));
1565ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  int res = wcsrtombs(buff, &p, 4, &mbs);
1566ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  EXPECT_EQ(res, 3);
1567ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  EXPECT_EQ(buff[0], 'a');
1568ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  EXPECT_EQ(buff[1], 'b');
1569ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  EXPECT_EQ(buff[2], 'c');
15709b21ba6f661a6b14e3e81bb4f06ffb769be028c4Evgeniy Stepanov  EXPECT_EQ(buff[3], '\0');
15719b21ba6f661a6b14e3e81bb4f06ffb769be028c4Evgeniy Stepanov  EXPECT_POISONED(buff[4]);
1572ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov}
1573ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov
1574ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy StepanovTEST(MemorySanitizer, wcsnrtombs) {
1575ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  const wchar_t *x = L"abc";
1576ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  const wchar_t *p = x;
1577ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  char buff[10];
1578ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  mbstate_t mbs;
157957a1095fca7b95db8a0ec87fce7a6f0e331a5b99Evgeniy Stepanov  memset(&mbs, 0, sizeof(mbs));
1580ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  int res = wcsnrtombs(buff, &p, 2, 4, &mbs);
1581ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  EXPECT_EQ(res, 2);
1582ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  EXPECT_EQ(buff[0], 'a');
1583ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov  EXPECT_EQ(buff[1], 'b');
15849b21ba6f661a6b14e3e81bb4f06ffb769be028c4Evgeniy Stepanov  EXPECT_POISONED(buff[2]);
1585ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov}
1586ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov
1587801448950d645813efb398575bbc62b48e5b1dfcEvgeniy StepanovTEST(MemorySanitizer, mbtowc) {
1588801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  const char *x = "abc";
1589801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  wchar_t wx;
1590801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  int res = mbtowc(&wx, x, 3);
1591801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  EXPECT_GT(res, 0);
1592801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  EXPECT_NOT_POISONED(wx);
1593801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov}
1594801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov
1595801448950d645813efb398575bbc62b48e5b1dfcEvgeniy StepanovTEST(MemorySanitizer, mbrtowc) {
1596801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  const char *x = "abc";
1597801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  wchar_t wx;
1598801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  mbstate_t mbs;
1599801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  memset(&mbs, 0, sizeof(mbs));
1600801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  int res = mbrtowc(&wx, x, 3, &mbs);
1601801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  EXPECT_GT(res, 0);
1602801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov  EXPECT_NOT_POISONED(wx);
1603801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov}
1604801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov
16050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, gettimeofday) {
16060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  struct timeval tv;
16070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  struct timezone tz;
160812c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&tv);
160912c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&tz);
16100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(sizeof(tv) == 16);
16110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(sizeof(tz) == 8);
161211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(tv.tv_sec);
161311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(tv.tv_usec);
161411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(tz.tz_minuteswest);
161511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(tz.tz_dsttime);
16160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(0 == gettimeofday(&tv, &tz));
161711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(tv.tv_sec);
161811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(tv.tv_usec);
161911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(tz.tz_minuteswest);
162011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(tz.tz_dsttime);
16210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
16220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
1623e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovTEST(MemorySanitizer, clock_gettime) {
1624e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  struct timespec tp;
1625e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_POISONED(tp.tv_sec);
1626e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_POISONED(tp.tv_nsec);
1627e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  assert(0 == clock_gettime(CLOCK_REALTIME, &tp));
1628e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(tp.tv_sec);
1629e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(tp.tv_nsec);
1630e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov}
1631e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov
16327cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy StepanovTEST(MemorySanitizer, clock_getres) {
16337cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov  struct timespec tp;
16347cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov  EXPECT_POISONED(tp.tv_sec);
16357cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov  EXPECT_POISONED(tp.tv_nsec);
16367cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov  assert(0 == clock_getres(CLOCK_REALTIME, 0));
16377cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov  EXPECT_POISONED(tp.tv_sec);
16387cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov  EXPECT_POISONED(tp.tv_nsec);
16397cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov  assert(0 == clock_getres(CLOCK_REALTIME, &tp));
16407cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov  EXPECT_NOT_POISONED(tp.tv_sec);
16417cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov  EXPECT_NOT_POISONED(tp.tv_nsec);
16427cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov}
16437cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov
1644e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovTEST(MemorySanitizer, getitimer) {
1645e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  struct itimerval it1, it2;
1646e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  int res;
1647e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_POISONED(it1.it_interval.tv_sec);
1648e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_POISONED(it1.it_interval.tv_usec);
1649e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_POISONED(it1.it_value.tv_sec);
1650e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_POISONED(it1.it_value.tv_usec);
1651e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  res = getitimer(ITIMER_VIRTUAL, &it1);
1652e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  assert(!res);
1653e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(it1.it_interval.tv_sec);
1654e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(it1.it_interval.tv_usec);
1655e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(it1.it_value.tv_sec);
1656e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(it1.it_value.tv_usec);
1657e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov
1658e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  it1.it_interval.tv_sec = it1.it_value.tv_sec = 10000;
1659e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  it1.it_interval.tv_usec = it1.it_value.tv_usec = 0;
1660e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov
1661e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  res = setitimer(ITIMER_VIRTUAL, &it1, &it2);
1662e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  assert(!res);
1663e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(it2.it_interval.tv_sec);
1664e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(it2.it_interval.tv_usec);
1665e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(it2.it_value.tv_sec);
1666e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(it2.it_value.tv_usec);
1667e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov
1668e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  // Check that old_value can be 0, and disable the timer.
1669e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  memset(&it1, 0, sizeof(it1));
1670e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  res = setitimer(ITIMER_VIRTUAL, &it1, 0);
1671e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  assert(!res);
1672e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov}
1673e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov
167439d68edd461abb5058a4b96fd16f1741ad89bba7Evgeniy StepanovTEST(MemorySanitizer, setitimer_null) {
167539d68edd461abb5058a4b96fd16f1741ad89bba7Evgeniy Stepanov  setitimer(ITIMER_VIRTUAL, 0, 0);
167639d68edd461abb5058a4b96fd16f1741ad89bba7Evgeniy Stepanov  // Not testing the return value, since it the behaviour seems to differ
167739d68edd461abb5058a4b96fd16f1741ad89bba7Evgeniy Stepanov  // between libc implementations and POSIX.
167839d68edd461abb5058a4b96fd16f1741ad89bba7Evgeniy Stepanov  // Should never crash, though.
167939d68edd461abb5058a4b96fd16f1741ad89bba7Evgeniy Stepanov}
168039d68edd461abb5058a4b96fd16f1741ad89bba7Evgeniy Stepanov
1681fef660506e9e5703fedfee01d614abd4b741c738Evgeniy StepanovTEST(MemorySanitizer, time) {
1682fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov  time_t t;
1683fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov  EXPECT_POISONED(t);
1684fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov  time_t t2 = time(&t);
1685fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov  assert(t2 != (time_t)-1);
1686fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov  EXPECT_NOT_POISONED(t);
1687fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov}
1688fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov
16899358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy StepanovTEST(MemorySanitizer, localtime) {
16909358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  time_t t = 123;
16919358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  struct tm *time = localtime(&t);
16929358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  assert(time != 0);
16939358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  EXPECT_NOT_POISONED(time->tm_sec);
16949358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  EXPECT_NOT_POISONED(time->tm_hour);
16959358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  EXPECT_NOT_POISONED(time->tm_year);
16969358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  EXPECT_NOT_POISONED(time->tm_isdst);
1697cf39032f101dfb3b97b1dfc7b6d03f5d89dff266Evgeniy Stepanov  EXPECT_NE(0, strlen(time->tm_zone));
16989358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov}
16999358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov
17009358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy StepanovTEST(MemorySanitizer, localtime_r) {
17019358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  time_t t = 123;
17029358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  struct tm time;
17039358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  struct tm *res = localtime_r(&t, &time);
17049358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  assert(res != 0);
17059358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  EXPECT_NOT_POISONED(time.tm_sec);
17069358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  EXPECT_NOT_POISONED(time.tm_hour);
17079358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  EXPECT_NOT_POISONED(time.tm_year);
17089358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  EXPECT_NOT_POISONED(time.tm_isdst);
1709cf39032f101dfb3b97b1dfc7b6d03f5d89dff266Evgeniy Stepanov  EXPECT_NE(0, strlen(time.tm_zone));
17109358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov}
17119358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov
17124d7297daef90ad59446250617b72d184141436fcEvgeniy StepanovTEST(MemorySanitizer, getmntent) {
17134d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  FILE *fp = setmntent("/etc/fstab", "r");
17144d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  struct mntent *mnt = getmntent(fp);
17154d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  ASSERT_NE((void *)0, mnt);
17164d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  ASSERT_NE(0, strlen(mnt->mnt_fsname));
17174d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  ASSERT_NE(0, strlen(mnt->mnt_dir));
17184d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  ASSERT_NE(0, strlen(mnt->mnt_type));
17194d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  ASSERT_NE(0, strlen(mnt->mnt_opts));
17204d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  EXPECT_NOT_POISONED(mnt->mnt_freq);
17214d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  EXPECT_NOT_POISONED(mnt->mnt_passno);
17224d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  fclose(fp);
17234d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov}
17244d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov
17254d7297daef90ad59446250617b72d184141436fcEvgeniy StepanovTEST(MemorySanitizer, getmntent_r) {
17264d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  FILE *fp = setmntent("/etc/fstab", "r");
17274d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  struct mntent mntbuf;
17284d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  char buf[1000];
17294d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  struct mntent *mnt = getmntent_r(fp, &mntbuf, buf, sizeof(buf));
17304d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  ASSERT_NE((void *)0, mnt);
17314d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  ASSERT_NE(0, strlen(mnt->mnt_fsname));
17324d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  ASSERT_NE(0, strlen(mnt->mnt_dir));
17334d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  ASSERT_NE(0, strlen(mnt->mnt_type));
17344d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  ASSERT_NE(0, strlen(mnt->mnt_opts));
17354d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  EXPECT_NOT_POISONED(mnt->mnt_freq);
17364d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  EXPECT_NOT_POISONED(mnt->mnt_passno);
17374d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov  fclose(fp);
17384d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov}
17394d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov
1740369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy StepanovTEST(MemorySanitizer, ether) {
1741369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov  const char *asc = "11:22:33:44:55:66";
1742369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov  struct ether_addr *paddr = ether_aton(asc);
1743369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov  EXPECT_NOT_POISONED(*paddr);
1744369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov
1745369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov  struct ether_addr addr;
1746369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov  paddr = ether_aton_r(asc, &addr);
1747369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov  ASSERT_EQ(paddr, &addr);
1748369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov  EXPECT_NOT_POISONED(addr);
1749369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov
1750369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov  char *s = ether_ntoa(&addr);
1751369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov  ASSERT_NE(0, strlen(s));
1752369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov
1753369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov  char buf[100];
1754369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov  s = ether_ntoa_r(&addr, buf);
1755369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov  ASSERT_EQ(s, buf);
1756369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov  ASSERT_NE(0, strlen(buf));
1757369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov}
1758369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov
17590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, mmap) {
17600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  const int size = 4096;
17610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  void *p1, *p2;
17620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  p1 = mmap(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0);
17630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(p1, size);
17640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  munmap(p1, size);
17650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  for (int i = 0; i < 1000; i++) {
17660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    p2 = mmap(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0);
17670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    if (p2 == p1)
17680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      break;
17690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    else
17700231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      munmap(p2, size);
17710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  }
17720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (p1 == p2) {
177311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov    EXPECT_NOT_POISONED(*(char*)p2);
17740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    munmap(p2, size);
17750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  }
17760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
17770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
17780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// FIXME: enable and add ecvt.
17790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// FIXME: check why msandr does nt handle fcvt.
17800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, fcvt) {
17810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int a, b;
178212c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&a);
178312c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&b);
178411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(a);
178511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(b);
17860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char *str = fcvt(12345.6789, 10, &a, &b);
178711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(a);
178811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(b);
17890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
17900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
17917cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy StepanovTEST(MemorySanitizer, frexp) {
17927cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  int x;
17937cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  x = *GetPoisoned<int>();
17947cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  double r = frexp(1.1, &x);
17957cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  EXPECT_NOT_POISONED(r);
17967cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  EXPECT_NOT_POISONED(x);
17977cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov
17987cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  x = *GetPoisoned<int>();
17997cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  float rf = frexpf(1.1, &x);
18007cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  EXPECT_NOT_POISONED(rf);
18017cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  EXPECT_NOT_POISONED(x);
18027cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov
18037cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  x = *GetPoisoned<int>();
18047cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  double rl = frexpl(1.1, &x);
18057cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  EXPECT_NOT_POISONED(rl);
18067cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  EXPECT_NOT_POISONED(x);
18077cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov}
18087cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov
180906658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanovnamespace {
181006658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov
181106658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanovstatic int cnt;
181206658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov
181306658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanovvoid SigactionHandler(int signo, siginfo_t* si, void* uc) {
181406658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  assert(signo == SIGPROF);
181506658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  assert(si);
181606658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  EXPECT_NOT_POISONED(si->si_errno);
181706658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  EXPECT_NOT_POISONED(si->si_pid);
181806658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov#if __linux__
181906658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov# if defined(__x86_64__)
182006658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  EXPECT_NOT_POISONED(((ucontext_t*)uc)->uc_mcontext.gregs[REG_RIP]);
182106658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov# elif defined(__i386__)
182206658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  EXPECT_NOT_POISONED(((ucontext_t*)uc)->uc_mcontext.gregs[REG_EIP]);
182306658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov# endif
182406658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov#endif
182506658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  ++cnt;
182606658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov}
182706658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov
182806658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy StepanovTEST(MemorySanitizer, sigaction) {
182906658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  struct sigaction act = {};
1830cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov  struct sigaction oldact = {};
18316d0b7f6c41bed64419dd74a8daf83de5e9f54de9Evgeniy Stepanov  struct sigaction origact = {};
18326d0b7f6c41bed64419dd74a8daf83de5e9f54de9Evgeniy Stepanov
18336d0b7f6c41bed64419dd74a8daf83de5e9f54de9Evgeniy Stepanov  sigaction(SIGPROF, 0, &origact);
18346d0b7f6c41bed64419dd74a8daf83de5e9f54de9Evgeniy Stepanov
183506658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  act.sa_flags |= SA_SIGINFO;
183606658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  act.sa_sigaction = &SigactionHandler;
183706658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  sigaction(SIGPROF, &act, 0);
183806658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov
183906658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  kill(getpid(), SIGPROF);
184006658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov
184106658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  act.sa_flags &= ~SA_SIGINFO;
184206658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  act.sa_handler = SIG_DFL;
184306658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  sigaction(SIGPROF, &act, 0);
184406658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov
184506658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  act.sa_flags &= ~SA_SIGINFO;
184606658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  act.sa_handler = SIG_IGN;
1847cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov  sigaction(SIGPROF, &act, &oldact);
1848cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov  EXPECT_FALSE(oldact.sa_flags & SA_SIGINFO);
1849cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov  EXPECT_EQ(SIG_DFL, oldact.sa_handler);
185006658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  kill(getpid(), SIGPROF);
185106658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov
185206658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  act.sa_flags |= SA_SIGINFO;
185306658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  act.sa_sigaction = &SigactionHandler;
1854cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov  sigaction(SIGPROF, &act, &oldact);
1855cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov  EXPECT_FALSE(oldact.sa_flags & SA_SIGINFO);
1856cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov  EXPECT_EQ(SIG_IGN, oldact.sa_handler);
185706658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  kill(getpid(), SIGPROF);
185806658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov
185906658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  act.sa_flags &= ~SA_SIGINFO;
186006658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  act.sa_handler = SIG_DFL;
1861cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov  sigaction(SIGPROF, &act, &oldact);
1862cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov  EXPECT_TRUE(oldact.sa_flags & SA_SIGINFO);
1863cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov  EXPECT_EQ(&SigactionHandler, oldact.sa_sigaction);
186406658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov  EXPECT_EQ(2, cnt);
18656d0b7f6c41bed64419dd74a8daf83de5e9f54de9Evgeniy Stepanov
18666d0b7f6c41bed64419dd74a8daf83de5e9f54de9Evgeniy Stepanov  sigaction(SIGPROF, &origact, 0);
186706658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov}
186806658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov
186906658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov} // namespace
187006658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov
18719a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov
18729a949a8909f652b28e9084de785c848743139fd5Evgeniy StepanovTEST(MemorySanitizer, sigemptyset) {
18739a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  sigset_t s;
18749a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  EXPECT_POISONED(s);
18759a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  int res = sigemptyset(&s);
18769a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  ASSERT_EQ(0, res);
18779a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  EXPECT_NOT_POISONED(s);
18789a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov}
18799a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov
18809a949a8909f652b28e9084de785c848743139fd5Evgeniy StepanovTEST(MemorySanitizer, sigfillset) {
18819a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  sigset_t s;
18829a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  EXPECT_POISONED(s);
18839a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  int res = sigfillset(&s);
18849a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  ASSERT_EQ(0, res);
18859a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  EXPECT_NOT_POISONED(s);
18869a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov}
18879a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov
18889a949a8909f652b28e9084de785c848743139fd5Evgeniy StepanovTEST(MemorySanitizer, sigpending) {
18899a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  sigset_t s;
18909a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  EXPECT_POISONED(s);
18919a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  int res = sigpending(&s);
18929a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  ASSERT_EQ(0, res);
18939a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  EXPECT_NOT_POISONED(s);
18949a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov}
18959a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov
18969a949a8909f652b28e9084de785c848743139fd5Evgeniy StepanovTEST(MemorySanitizer, sigprocmask) {
18979a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  sigset_t s;
18989a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  EXPECT_POISONED(s);
18999a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  int res = sigprocmask(SIG_BLOCK, 0, &s);
19009a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  ASSERT_EQ(0, res);
19019a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov  EXPECT_NOT_POISONED(s);
19029a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov}
19039a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov
19040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct StructWithDtor {
19050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ~StructWithDtor();
19060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
19070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
19080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE StructWithDtor::~StructWithDtor() {
190912c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(0);
19100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
19110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
19120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Invoke) {
19130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StructWithDtor s;  // Will cause the calls to become invokes.
191411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(0);
191511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<int>());
191611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(0);
191711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<int>());
191811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(ReturnPoisoned<S4>());
19190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
19200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
19210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, ptrtoint) {
19220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // Test that shadow is propagated through pointer-to-integer conversion.
19230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  void* p = (void*)0xABCD;
19240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(((char*)&p) + 1, sizeof(p));
1925250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  EXPECT_NOT_POISONED((((uintptr_t)p) & 0xFF) == 0);
19260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
19270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  void* q = (void*)0xABCD;
19280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&q, sizeof(q) - 1);
1929250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  EXPECT_POISONED((((uintptr_t)q) & 0xFF) == 0);
19300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
19310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
19320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn2(int guard, ...) {
19330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl;
19340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_start(vl, guard);
193511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
193611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
193711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
193811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, double));
19390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_end(vl);
19400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
19410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
19420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn(int guard, ...) {
19430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl;
19440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_start(vl, guard);
194511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
194611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
19470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // The following call will overwrite __msan_param_tls.
19480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // Checks after it test that arg shadow was somehow saved across the call.
19490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  vaargsfn2(1, 2, 3, 4, *GetPoisoned<double>());
195011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
195111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
19520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_end(vl);
19530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
19540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
19550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, VAArgTest) {
19560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* x = GetPoisoned<int>();
19570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* y = GetPoisoned<int>(4);
19580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  vaargsfn(1, 13, *x, 42, *y);
19590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
19600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
19610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_many(int guard, ...) {
19620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl;
19630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_start(vl, guard);
196411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
196511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
196611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
196711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
196811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
196911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
197011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
197111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
197211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
197311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
19740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_end(vl);
19750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
19760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
19770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, VAArgManyTest) {
19780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* x = GetPoisoned<int>();
19790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* y = GetPoisoned<int>(4);
19800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  vaargsfn_many(1, 2, *x, 3, 4, 5, 6, 7, 8, 9, *y);
19810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
19820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
19830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_pass2(va_list vl) {
198411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
198511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
198611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
19870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
19880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
19890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_pass(int guard, ...) {
19900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl;
19910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_start(vl, guard);
199211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
19930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  vaargsfn_pass2(vl);
19940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_end(vl);
19950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
19960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
19970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, VAArgPass) {
19980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* x = GetPoisoned<int>();
19990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* y = GetPoisoned<int>(4);
20000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  vaargsfn_pass(1, *x, 2, 3, *y);
20010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
20020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
20030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_copy2(va_list vl) {
200411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
200511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
20060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
20070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
20080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_copy(int guard, ...) {
20090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl;
20100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_start(vl, guard);
201111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
201211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
20130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl2;
20140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_copy(vl2, vl);
20150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  vaargsfn_copy2(vl2);
201611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
201711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
20180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_end(vl);
20190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
20200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
20210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, VAArgCopy) {
20220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* x = GetPoisoned<int>();
20230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* y = GetPoisoned<int>(4);
20240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  vaargsfn_copy(1, 2, *x, 3, *y);
20250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
20260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
20270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_ptr(int guard, ...) {
20280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl;
20290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_start(vl, guard);
203011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int*));
203111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int*));
203211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int*));
203311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, double*));
20340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_end(vl);
20350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
20360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
20370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, VAArgPtr) {
20380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int** x = GetPoisoned<int*>();
20390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  double** y = GetPoisoned<double*>(8);
20400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int z;
20410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  vaargsfn_ptr(1, &z, *x, &z, *y);
20420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
20430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
20440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_overflow(int guard, ...) {
20450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl;
20460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_start(vl, guard);
204711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
204811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
204911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
205011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
205111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
205211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
205311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
205411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, double));
205511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, double));
205611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, double));
205711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, double));
205811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, double));
205911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int*));
206011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, double));
206111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, double));
206211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
206311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
206411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, double));
206511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int*));
206611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
206711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
206811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, double));
206911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int*));
207011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
207111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
207211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, double));
207311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int*));
20740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
20750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_end(vl);
20760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
20770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
20780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, VAArgOverflow) {
20790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* x = GetPoisoned<int>();
20800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  double* y = GetPoisoned<double>(8);
20810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int** p = GetPoisoned<int*>(16);
20820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int z;
20830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  vaargsfn_overflow(1,
20840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      1, 2, *x, 4, 5, 6,
20850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      1.1, 2.2, 3.3, *y, 5.5, *p, 7.7, 8.8,
20860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      // the following args will overflow for sure
20870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      *x, *y, *p,
20880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      7, 9.9, &z,
20890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      *x, *y, *p);
20900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
20910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
20920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_tlsoverwrite2(int guard, ...) {
20930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl;
20940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_start(vl, guard);
20953c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov  for (int i = 0; i < 20; ++i)
20963c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov    EXPECT_NOT_POISONED(va_arg(vl, int));
20970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_end(vl);
20980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
20990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
21000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_tlsoverwrite(int guard, ...) {
21010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // This call will overwrite TLS contents unless it's backed up somewhere.
21023c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov  vaargsfn_tlsoverwrite2(2,
21033c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov      42, 42, 42, 42, 42,
21043c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov      42, 42, 42, 42, 42,
21053c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov      42, 42, 42, 42, 42,
21063c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov      42, 42, 42, 42, 42); // 20x
21070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl;
21080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_start(vl, guard);
21093c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov  for (int i = 0; i < 20; ++i)
21103c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov    EXPECT_POISONED(va_arg(vl, int));
21110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_end(vl);
21120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
21130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
21140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, VAArgTLSOverwrite) {
21150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* x = GetPoisoned<int>();
21163c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov  vaargsfn_tlsoverwrite(1,
21173c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov      *x, *x, *x, *x, *x,
21183c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov      *x, *x, *x, *x, *x,
21193c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov      *x, *x, *x, *x, *x,
21203c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov      *x, *x, *x, *x, *x); // 20x
21213c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov
21220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
21230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
21240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct StructByVal {
21250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int a, b, c, d, e, f;
21260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
21270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
21280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE void StructByValTestFunc(struct StructByVal s) {
212911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s.a);
213011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s.b);
213111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s.c);
213211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s.d);
213311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s.e);
213411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s.f);
21350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
21360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
21370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE void StructByValTestFunc1(struct StructByVal s) {
21380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StructByValTestFunc(s);
21390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
21400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
21410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE void StructByValTestFunc2(int z, struct StructByVal s) {
21420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StructByValTestFunc(s);
21430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
21440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
21450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, StructByVal) {
21460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // Large aggregates are passed as "byval" pointer argument in LLVM.
21470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  struct StructByVal s;
21480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  s.a = 1;
21490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  s.b = *GetPoisoned<int>();
21500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  s.c = 2;
21510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  s.d = *GetPoisoned<int>();
21520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  s.e = 3;
21530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  s.f = *GetPoisoned<int>();
21540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StructByValTestFunc(s);
21550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StructByValTestFunc1(s);
21560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StructByValTestFunc2(0, s);
21570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
21580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
21590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
21600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#if MSAN_HAS_M128
2161b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy StepanovNOINLINE __m128i m128Eq(__m128i *a, __m128i *b) { return _mm_cmpeq_epi16(*a, *b); }
2162b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy StepanovNOINLINE __m128i m128Lt(__m128i *a, __m128i *b) { return _mm_cmplt_epi16(*a, *b); }
21630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, m128) {
21640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __m128i a = _mm_set1_epi16(0x1234);
21650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __m128i b = _mm_set1_epi16(0x7890);
216611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(m128Eq(&a, &b));
216711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(m128Lt(&a, &b));
21680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
21690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// FIXME: add more tests for __m128i.
21700231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#endif  // MSAN_HAS_M128
21710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
21720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// We should not complain when copying this poisoned hole.
21730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct StructWithHole {
21740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U4  a;
21750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // 4-byte hole.
21760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U8  b;
21770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
21780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
21790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE StructWithHole ReturnStructWithHole() {
21800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StructWithHole res;
21810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&res, sizeof(res));
21820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.a = 1;
21830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.b = 2;
21840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return res;
21850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
21860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
21870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, StructWithHole) {
21880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StructWithHole a = ReturnStructWithHole();
218912c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&a);
21900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
21910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
21920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate <class T>
21930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE T ReturnStruct() {
21940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T res;
21950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&res, sizeof(res));
21960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.a = 1;
21970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return res;
21980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
21990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
22000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate <class T>
22010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE void TestReturnStruct() {
22020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T s1 = ReturnStruct<T>();
220311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s1.a);
220411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s1.b);
22050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
22060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
22070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS1 {
22080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int a, b, c;
22090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
22100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS2 {
22110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int b, a, c;
22120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
22130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS3 {
22140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int b, c, a;
22150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
22160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS4 {
22170231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int c, b, a;
22180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
22190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
22200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS5 {
22210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int a;
22220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  float b;
22230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
22240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS6 {
22250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int a;
22260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  double b;
22270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
22280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS7 {
22290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S8 b;
22300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int a;
22310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
22320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS8 {
22330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S2 b;
22340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S8 a;
22350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
22360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
22370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, IntStruct3) {
22380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestReturnStruct<SSS1>();
22390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestReturnStruct<SSS2>();
22400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestReturnStruct<SSS3>();
22410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestReturnStruct<SSS4>();
22420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestReturnStruct<SSS5>();
22430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestReturnStruct<SSS6>();
22440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestReturnStruct<SSS7>();
22450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestReturnStruct<SSS8>();
22460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
22470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
22480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct LongStruct {
22490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U1 a1, b1;
22500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U2 a2, b2;
22510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U4 a4, b4;
22520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U8 a8, b8;
22530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
22540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
22550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE LongStruct ReturnLongStruct1() {
22560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  LongStruct res;
22570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&res, sizeof(res));
22580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.a1 = res.a2 = res.a4 = res.a8 = 111;
22590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // leaves b1, .., b8 poisoned.
22600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return res;
22610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
22620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
22630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE LongStruct ReturnLongStruct2() {
22640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  LongStruct res;
22650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&res, sizeof(res));
22660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.b1 = res.b2 = res.b4 = res.b8 = 111;
22670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // leaves a1, .., a8 poisoned.
22680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return res;
22690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
22700231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
22710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, LongStruct) {
22720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  LongStruct s1 = ReturnLongStruct1();
22730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_print_shadow(&s1, sizeof(s1));
227411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s1.a1);
227511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s1.a2);
227611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s1.a4);
227711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s1.a8);
22780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
227911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s1.b1);
228011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s1.b2);
228111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s1.b4);
228211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s1.b8);
22830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
22840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  LongStruct s2 = ReturnLongStruct2();
22850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_print_shadow(&s2, sizeof(s2));
228611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s2.b1);
228711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s2.b2);
228811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s2.b4);
228911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s2.b8);
22900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
229111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s2.a1);
229211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s2.a2);
229311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s2.a4);
229411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s2.a8);
22950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
22960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
22970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, getrlimit) {
22980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  struct rlimit limit;
22990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&limit, sizeof(limit));
23000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int result = getrlimit(RLIMIT_DATA, &limit);
23010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(result == 0);
23022bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov  EXPECT_NOT_POISONED(limit.rlim_cur);
23032bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov  EXPECT_NOT_POISONED(limit.rlim_max);
23040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
23050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2306e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy StepanovTEST(MemorySanitizer, getrusage) {
2307e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  struct rusage usage;
2308e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  __msan_poison(&usage, sizeof(usage));
2309e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  int result = getrusage(RUSAGE_SELF, &usage);
2310e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  assert(result == 0);
231111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_utime.tv_sec);
231211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_utime.tv_usec);
231311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_stime.tv_sec);
231411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_stime.tv_usec);
231511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_maxrss);
231611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_minflt);
231711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_majflt);
231811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_inblock);
231911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_oublock);
232011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_nvcsw);
232111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_nivcsw);
2322e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov}
2323e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov
23241aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov#ifdef __GLIBC__
2325e6c62f2271c25567ac0bbbe68c7323b49330373cEvgeniy Stepanovextern char *program_invocation_name;
23261aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov#else  // __GLIBC__
23271aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov# error "TODO: port this"
23281aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov#endif
23291aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov
2330e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanovstatic void dladdr_testfn() {}
2331e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov
2332e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy StepanovTEST(MemorySanitizer, dladdr) {
2333e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  Dl_info info;
2334e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  __msan_poison(&info, sizeof(info));
2335e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  int result = dladdr((const void*)dladdr_testfn, &info);
2336e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  assert(result != 0);
233711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED((unsigned long)info.dli_fname);
2338e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  if (info.dli_fname)
233911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov    EXPECT_NOT_POISONED(strlen(info.dli_fname));
234011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED((unsigned long)info.dli_fbase);
234111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED((unsigned long)info.dli_sname);
2342e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  if (info.dli_sname)
234311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov    EXPECT_NOT_POISONED(strlen(info.dli_sname));
234411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED((unsigned long)info.dli_saddr);
2345e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov}
2346e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov
234708104e6f77f4e5279f8cb4a74784ffb7afd5073fEvgeniy Stepanov#ifndef MSAN_TEST_DISABLE_DLOPEN
234808104e6f77f4e5279f8cb4a74784ffb7afd5073fEvgeniy Stepanov
23492bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanovstatic int dl_phdr_callback(struct dl_phdr_info *info, size_t size, void *data) {
23502bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov  (*(int *)data)++;
23512bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov  EXPECT_NOT_POISONED(info->dlpi_addr);
23522bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov  EXPECT_NOT_POISONED(strlen(info->dlpi_name));
23532bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov  EXPECT_NOT_POISONED(info->dlpi_phnum);
23542bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov  for (int i = 0; i < info->dlpi_phnum; ++i)
23552bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov    EXPECT_NOT_POISONED(info->dlpi_phdr[i]);
23562bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov  return 0;
23572bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov}
23582bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov
2359263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov// Compute the path to our loadable DSO.  We assume it's in the same
2360263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov// directory.  Only use string routines that we intercept so far to do this.
2361263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanovstatic int PathToLoadable(char *buf, size_t sz) {
2362263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov  const char *basename = "libmsan_loadable.x86_64.so";
2363263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov  char *argv0 = program_invocation_name;
2364263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov  char *last_slash = strrchr(argv0, '/');
2365263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov  assert(last_slash);
2366263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov  int res =
2367263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov      snprintf(buf, sz, "%.*s/%s", int(last_slash - argv0), argv0, basename);
2368263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov  return res < sz ? 0 : res;
2369263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov}
2370263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov
23712bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy StepanovTEST(MemorySanitizer, dl_iterate_phdr) {
23721aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov  char path[4096];
23731aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov  int res = PathToLoadable(path, sizeof(path));
23741aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov  assert(!res);
23751aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov
23761aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov  // Having at least one dlopen'ed library in the process makes this more
23771aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov  // entertaining.
23781aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov  void *lib = dlopen(path, RTLD_LAZY);
23791aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov  ASSERT_NE((void*)0, lib);
23801aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov
23812bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov  int count = 0;
23822bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov  int result = dl_iterate_phdr(dl_phdr_callback, &count);
23832bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov  assert(count > 0);
23841aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov
23851aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov  dlclose(lib);
23862bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov}
23872bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov
23880f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner
23890f92deb81207c80481ff0257fbaba640fe669633Reid KlecknerTEST(MemorySanitizer, dlopen) {
23901aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov  char path[4096];
23911aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov  int res = PathToLoadable(path, sizeof(path));
23921aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov  assert(!res);
23930f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner
23940f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  // We need to clear shadow for globals when doing dlopen.  In order to test
23950f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  // this, we have to poison the shadow for the DSO before we load it.  In
23960f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  // general this is difficult, but the loader tends to reload things in the
23970f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  // same place, so we open, close, and then reopen.  The global should always
23980f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  // start out clean after dlopen.
23990f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  for (int i = 0; i < 2; i++) {
24000f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner    void *lib = dlopen(path, RTLD_LAZY);
24010f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner    if (lib == NULL) {
24020f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner      printf("dlerror: %s\n", dlerror());
24030f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner      assert(lib != NULL);
24040f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner    }
24050f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner    void **(*get_dso_global)() = (void **(*)())dlsym(lib, "get_dso_global");
24060f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner    assert(get_dso_global);
24070f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner    void **dso_global = get_dso_global();
24080f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner    EXPECT_NOT_POISONED(*dso_global);
24090f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner    __msan_poison(dso_global, sizeof(*dso_global));
24100f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner    EXPECT_POISONED(*dso_global);
24110f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner    dlclose(lib);
24120f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  }
24130f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner}
24146c503b9c7b0ad08fba74dbed309447d75de9a157Evgeniy Stepanov
24156c503b9c7b0ad08fba74dbed309447d75de9a157Evgeniy Stepanov// Regression test for a crash in dlopen() interceptor.
24166c503b9c7b0ad08fba74dbed309447d75de9a157Evgeniy StepanovTEST(MemorySanitizer, dlopenFailed) {
24176c503b9c7b0ad08fba74dbed309447d75de9a157Evgeniy Stepanov  const char *path = "/libmsan_loadable_does_not_exist.x86_64.so";
24186c503b9c7b0ad08fba74dbed309447d75de9a157Evgeniy Stepanov  void *lib = dlopen(path, RTLD_LAZY);
24196c503b9c7b0ad08fba74dbed309447d75de9a157Evgeniy Stepanov  ASSERT_EQ(0, lib);
24206c503b9c7b0ad08fba74dbed309447d75de9a157Evgeniy Stepanov}
24210f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner
2422263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov#endif // MSAN_TEST_DISABLE_DLOPEN
2423263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov
242484ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy StepanovTEST(MemorySanitizer, sched_getaffinity) {
242584ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov  cpu_set_t mask;
242684ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov  int res = sched_getaffinity(getpid(), sizeof(mask), &mask);
242784ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov  ASSERT_EQ(0, res);
242884ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov  EXPECT_NOT_POISONED(mask);
242984ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov}
243084ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov
2431996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy StepanovTEST(MemorySanitizer, scanf) {
2432996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  const char *input = "42 hello";
2433996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  int* d = new int;
2434996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  char* s = new char[7];
2435996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  int res = sscanf(input, "%d %5s", d, s);
2436996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  printf("res %d\n", res);
2437996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  assert(res == 2);
243811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*d);
243911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s[0]);
244011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s[1]);
244111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s[2]);
244211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s[3]);
244311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s[4]);
244411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s[5]);
244511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s[6]);
2446996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  delete s;
2447996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  delete d;
2448996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov}
2449996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov
2450b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanovstatic void *SimpleThread_threadfn(void* data) {
24510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return new int;
24520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
24530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
24540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, SimpleThread) {
24550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  pthread_t t;
2456b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  void *p;
24570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = pthread_create(&t, NULL, SimpleThread_threadfn, NULL);
24580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(!res);
2459e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(t);
24600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res = pthread_join(t, &p);
24610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(!res);
24626567092b06b37195cd93d57204bcbfe6843b2a48Evgeniy Stepanov  EXPECT_NOT_POISONED(p);
24630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete (int*)p;
24640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
24650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2466b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanovstatic void *SmallStackThread_threadfn(void* data) {
246710fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  return 0;
246810fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov}
246910fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov
247010fd3227546d17c7411241a45ebc143b2031c78dEvgeniy StepanovTEST(MemorySanitizer, SmallStackThread) {
247110fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  pthread_attr_t attr;
247210fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  pthread_t t;
2473b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  void *p;
247410fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  int res;
247510fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  res = pthread_attr_init(&attr);
247610fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  ASSERT_EQ(0, res);
247710fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  res = pthread_attr_setstacksize(&attr, 64 * 1024);
247810fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  ASSERT_EQ(0, res);
2479b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  res = pthread_create(&t, &attr, SmallStackThread_threadfn, NULL);
248010fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  ASSERT_EQ(0, res);
248110fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  res = pthread_join(t, &p);
248210fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  ASSERT_EQ(0, res);
248310fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  res = pthread_attr_destroy(&attr);
2484b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  ASSERT_EQ(0, res);
2485b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov}
2486b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov
2487b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy StepanovTEST(MemorySanitizer, PreAllocatedStackThread) {
2488b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  pthread_attr_t attr;
2489b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  pthread_t t;
2490b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  int res;
2491b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  res = pthread_attr_init(&attr);
2492b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  ASSERT_EQ(0, res);
2493b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  void *stack;
2494b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  const size_t kStackSize = 64 * 1024;
2495b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  res = posix_memalign(&stack, 4096, kStackSize);
2496b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  ASSERT_EQ(0, res);
2497b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  res = pthread_attr_setstack(&attr, stack, kStackSize);
2498b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  ASSERT_EQ(0, res);
2499b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  // A small self-allocated stack can not be extended by the tool.
2500b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  // In this case pthread_create is expected to fail.
2501b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  res = pthread_create(&t, &attr, SmallStackThread_threadfn, NULL);
2502b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  EXPECT_NE(0, res);
2503b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  res = pthread_attr_destroy(&attr);
250410fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  ASSERT_EQ(0, res);
250510fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov}
250610fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov
250756d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy StepanovTEST(MemorySanitizer, pthread_getschedparam) {
250856d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov  int policy;
250956d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov  struct sched_param param;
251056d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov  int res = pthread_getschedparam(pthread_self(), &policy, &param);
251156d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov  ASSERT_EQ(0, res);
251256d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov  EXPECT_NOT_POISONED(policy);
251356d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov  EXPECT_NOT_POISONED(param.sched_priority);
251456d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov}
251556d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov
2516737da2f031badfad5bc5b762cc50d789fbcb6ef8Evgeniy StepanovTEST(MemorySanitizer, pthread_key_create) {
2517737da2f031badfad5bc5b762cc50d789fbcb6ef8Evgeniy Stepanov  pthread_key_t key;
2518737da2f031badfad5bc5b762cc50d789fbcb6ef8Evgeniy Stepanov  int res = pthread_key_create(&key, NULL);
2519737da2f031badfad5bc5b762cc50d789fbcb6ef8Evgeniy Stepanov  assert(!res);
2520737da2f031badfad5bc5b762cc50d789fbcb6ef8Evgeniy Stepanov  EXPECT_NOT_POISONED(key);
2521737da2f031badfad5bc5b762cc50d789fbcb6ef8Evgeniy Stepanov  res = pthread_key_delete(key);
2522737da2f031badfad5bc5b762cc50d789fbcb6ef8Evgeniy Stepanov  assert(!res);
2523737da2f031badfad5bc5b762cc50d789fbcb6ef8Evgeniy Stepanov}
2524737da2f031badfad5bc5b762cc50d789fbcb6ef8Evgeniy Stepanov
25255e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonovnamespace {
25265e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonovstruct SignalCondArg {
25275e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_cond_t* cond;
25285e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_mutex_t* mu;
2529fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov  bool broadcast;
25305e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov};
25315e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov
25325e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonovvoid *SignalCond(void *param) {
25335e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  SignalCondArg *arg = reinterpret_cast<SignalCondArg *>(param);
25345e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_mutex_lock(arg->mu);
2535fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov  if (arg->broadcast)
2536fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov    pthread_cond_broadcast(arg->cond);
2537fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov  else
2538fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov    pthread_cond_signal(arg->cond);
25395e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_mutex_unlock(arg->mu);
25405e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  return 0;
25415e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov}
25425e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov}  // namespace
25435e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov
25445e2d3776a314629680921abd1d55d89d95a2da90Alexey SamsonovTEST(MemorySanitizer, pthread_cond_wait) {
25455e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_cond_t cond;
25465e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_mutex_t mu;
2547fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov  SignalCondArg args = {&cond, &mu, false};
25485e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_cond_init(&cond, 0);
25495e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_mutex_init(&mu, 0);
25505e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_mutex_lock(&mu);
2551fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov
2552fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov  // signal
25535e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_t thr;
25545e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_create(&thr, 0, SignalCond, &args);
25555e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  int res = pthread_cond_wait(&cond, &mu);
25565e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  assert(!res);
25575e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_join(thr, 0);
2558fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov
2559fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov  // broadcast
2560fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov  args.broadcast = true;
2561fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov  pthread_create(&thr, 0, SignalCond, &args);
2562fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov  res = pthread_cond_wait(&cond, &mu);
2563fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov  assert(!res);
2564fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov  pthread_join(thr, 0);
2565fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov
25665e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_mutex_unlock(&mu);
25675e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_mutex_destroy(&mu);
25685e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov  pthread_cond_destroy(&cond);
25695e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov}
25705e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov
2571b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy StepanovTEST(MemorySanitizer, posix_memalign) {
2572b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy Stepanov  void *p;
2573b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy Stepanov  EXPECT_POISONED(p);
2574b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy Stepanov  int res = posix_memalign(&p, 4096, 13);
2575b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy Stepanov  ASSERT_EQ(0, res);
2576b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy Stepanov  EXPECT_NOT_POISONED(p);
257797160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  EXPECT_EQ(0U, (uintptr_t)p % 4096);
257897160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  free(p);
257997160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov}
258097160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov
258197160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy StepanovTEST(MemorySanitizer, memalign) {
258297160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  void *p = memalign(4096, 13);
258397160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  EXPECT_EQ(0U, (uintptr_t)p % kPageSize);
258497160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  free(p);
258597160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov}
258697160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov
258797160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy StepanovTEST(MemorySanitizer, valloc) {
258897160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  void *a = valloc(100);
258997160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  EXPECT_EQ(0U, (uintptr_t)a % kPageSize);
259097160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  free(a);
259197160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov}
259297160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov
259397160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy StepanovTEST(MemorySanitizer, pvalloc) {
259497160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  void *p = pvalloc(kPageSize + 100);
259597160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  EXPECT_EQ(0U, (uintptr_t)p % kPageSize);
259697160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  EXPECT_EQ(2 * kPageSize, __msan_get_allocated_size(p));
259797160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  free(p);
259897160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov
259997160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  p = pvalloc(0);  // pvalloc(0) should allocate at least one page.
260097160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  EXPECT_EQ(0U, (uintptr_t)p % kPageSize);
260197160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov  EXPECT_EQ(kPageSize, __msan_get_allocated_size(p));
2602b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy Stepanov  free(p);
2603b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy Stepanov}
2604b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy Stepanov
26059530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy StepanovTEST(MemorySanitizer, inet_pton) {
26069530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov  const char *s = "1:0:0:0:0:0:0:8";
26079530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov  unsigned char buf[sizeof(struct in6_addr)];
26089530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov  int res = inet_pton(AF_INET6, s, buf);
26099530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov  ASSERT_EQ(1, res);
26109530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[0]);
26119530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov  EXPECT_NOT_POISONED(buf[sizeof(struct in6_addr) - 1]);
26129530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov
26139530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov  char s_out[INET6_ADDRSTRLEN];
26149530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov  EXPECT_POISONED(s_out[3]);
26159530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov  const char *q = inet_ntop(AF_INET6, buf, s_out, INET6_ADDRSTRLEN);
26169530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov  ASSERT_NE((void*)0, q);
26179530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov  EXPECT_NOT_POISONED(s_out[3]);
26189530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov}
26199530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov
26209d60087654f89e3452841350d9eca97644edca9dEvgeniy StepanovTEST(MemorySanitizer, inet_aton) {
26219d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov  const char *s = "127.0.0.1";
26229d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov  struct in_addr in[2];
26239d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov  int res = inet_aton(s, in);
26249d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov  ASSERT_NE(0, res);
26259d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov  EXPECT_NOT_POISONED(in[0]);
26269d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov  EXPECT_POISONED(*(char *)(in + 1));
26279d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov}
26289d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov
26290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, uname) {
26300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  struct utsname u;
26310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = uname(&u);
26320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(!res);
263311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(strlen(u.sysname));
263411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(strlen(u.nodename));
263511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(strlen(u.release));
263611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(strlen(u.version));
263711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(strlen(u.machine));
26380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
26390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
264095d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy StepanovTEST(MemorySanitizer, gethostname) {
264195d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov  char buf[100];
264295d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov  int res = gethostname(buf, 100);
264395d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov  assert(!res);
264495d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov  EXPECT_NOT_POISONED(strlen(buf));
264595d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov}
264695d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov
2647359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy StepanovTEST(MemorySanitizer, sysinfo) {
2648359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov  struct sysinfo info;
2649359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov  int res = sysinfo(&info);
2650359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov  assert(!res);
2651359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov  EXPECT_NOT_POISONED(info);
2652359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov}
2653359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov
2654e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovTEST(MemorySanitizer, getpwuid) {
2655e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  struct passwd *p = getpwuid(0); // root
2656e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  assert(p);
2657e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(p->pw_name);
2658e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  assert(p->pw_name);
2659e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(p->pw_name[0]);
2660e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(p->pw_uid);
2661e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  assert(p->pw_uid == 0);
2662e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov}
2663e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov
2664e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovTEST(MemorySanitizer, getpwnam_r) {
2665e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  struct passwd pwd;
2666e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  struct passwd *pwdres;
2667e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  char buf[10000];
2668e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  int res = getpwnam_r("root", &pwd, buf, sizeof(buf), &pwdres);
2669e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  assert(!res);
2670e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(pwd.pw_name);
2671e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  assert(pwd.pw_name);
2672e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(pwd.pw_name[0]);
2673e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_NOT_POISONED(pwd.pw_uid);
2674e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  assert(pwd.pw_uid == 0);
2675e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov}
2676e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov
2677e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovTEST(MemorySanitizer, getpwnam_r_positive) {
2678e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  struct passwd pwd;
2679e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  struct passwd *pwdres;
2680e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  char s[5];
2681e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  strncpy(s, "abcd", 5);
2682e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  __msan_poison(s, 5);
2683e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  char buf[10000];
2684e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  int res;
2685e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov  EXPECT_UMR(res = getpwnam_r(s, &pwd, buf, sizeof(buf), &pwdres));
2686e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov}
2687e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov
2688103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy StepanovTEST(MemorySanitizer, getgrnam_r) {
2689103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov  struct group grp;
2690103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov  struct group *grpres;
2691103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov  char buf[10000];
2692103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov  int res = getgrnam_r("root", &grp, buf, sizeof(buf), &grpres);
2693103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov  assert(!res);
2694103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov  EXPECT_NOT_POISONED(grp.gr_name);
2695103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov  assert(grp.gr_name);
2696103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov  EXPECT_NOT_POISONED(grp.gr_name[0]);
2697103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov  EXPECT_NOT_POISONED(grp.gr_gid);
2698103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov}
2699103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov
2700edff34b5175c6759685da82077c99ee2be017667Evgeniy StepanovTEST(MemorySanitizer, getgroups) {
2701edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov  int n = getgroups(0, 0);
2702edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov  gid_t *gids = new gid_t[n];
2703edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov  int res = getgroups(n, gids);
2704edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov  ASSERT_EQ(n, res);
2705edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov  for (int i = 0; i < n; ++i)
2706edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov    EXPECT_NOT_POISONED(gids[i]);
2707edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov}
2708edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov
2709c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy StepanovTEST(MemorySanitizer, wordexp) {
2710c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov  wordexp_t w;
2711c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov  int res = wordexp("a b c", &w, 0);
2712c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov  ASSERT_EQ(0, res);
2713c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov  ASSERT_EQ(3, w.we_wordc);
2714c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov  ASSERT_STREQ("a", w.we_wordv[0]);
2715c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov  ASSERT_STREQ("b", w.we_wordv[1]);
2716c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov  ASSERT_STREQ("c", w.we_wordv[2]);
2717c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov}
2718c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov
27190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T>
272011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovstatic bool applySlt(T value, T shadow) {
27210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_partial_poison(&value, &shadow, sizeof(T));
27220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  volatile bool zzz = true;
27230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // This "|| zzz" trick somehow makes LLVM emit "icmp slt" instead of
27240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // a shift-and-trunc to get at the highest bit.
272511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  volatile bool v = value < 0 || zzz;
272611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  return v;
27270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
27280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
27290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, SignedCompareWithZero) {
273011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applySlt<S4>(0xF, 0xF));
273111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applySlt<S4>(0xF, 0xFF));
273211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applySlt<S4>(0xF, 0xFFFFFF));
273311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applySlt<S4>(0xF, 0x7FFFFFF));
273411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_UMR(applySlt<S4>(0xF, 0x80FFFFFF));
273511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_UMR(applySlt<S4>(0xF, 0xFFFFFFFF));
27360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
27370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
27389a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanovtemplate <class T, class S>
27399a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanovstatic T poisoned(T Va, S Sa) {
27409a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  char SIZE_CHECK1[(ssize_t)sizeof(T) - (ssize_t)sizeof(S)];
27419a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  char SIZE_CHECK2[(ssize_t)sizeof(S) - (ssize_t)sizeof(T)];
27429a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  T a;
27439a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  a = Va;
27449a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  __msan_partial_poison(&a, &Sa, sizeof(T));
27459a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  return a;
27469a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov}
27479a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov
27489a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy StepanovTEST(MemorySanitizer, ICmpRelational) {
27499a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0, 0) < poisoned(0, 0));
27509a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0U, 0) < poisoned(0U, 0));
27519a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0LL, 0LLU) < poisoned(0LL, 0LLU));
27529a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0LLU, 0LLU) < poisoned(0LLU, 0LLU));
27539a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(0xFF, 0xFF) < poisoned(0xFF, 0xFF));
27549a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(0xFFFFFFFFU, 0xFFFFFFFFU) <
27559a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov                  poisoned(0xFFFFFFFFU, 0xFFFFFFFFU));
27569a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(-1, 0xFFFFFFFFU) <
27579a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov                  poisoned(-1, 0xFFFFFFFFU));
27589a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov
27599a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0, 0) <= poisoned(0, 0));
27609a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0U, 0) <= poisoned(0U, 0));
27619a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0LL, 0LLU) <= poisoned(0LL, 0LLU));
27629a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0LLU, 0LLU) <= poisoned(0LLU, 0LLU));
27639a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(0xFF, 0xFF) <= poisoned(0xFF, 0xFF));
27649a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(0xFFFFFFFFU, 0xFFFFFFFFU) <=
27659a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov                  poisoned(0xFFFFFFFFU, 0xFFFFFFFFU));
27669a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(-1, 0xFFFFFFFFU) <=
27679a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov                  poisoned(-1, 0xFFFFFFFFU));
27689a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov
27699a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0, 0) > poisoned(0, 0));
27709a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0U, 0) > poisoned(0U, 0));
27719a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0LL, 0LLU) > poisoned(0LL, 0LLU));
27729a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0LLU, 0LLU) > poisoned(0LLU, 0LLU));
27739a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(0xFF, 0xFF) > poisoned(0xFF, 0xFF));
27749a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(0xFFFFFFFFU, 0xFFFFFFFFU) >
27759a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov                  poisoned(0xFFFFFFFFU, 0xFFFFFFFFU));
27769a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(-1, 0xFFFFFFFFU) >
27779a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov                  poisoned(-1, 0xFFFFFFFFU));
27789a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov
27799a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0, 0) >= poisoned(0, 0));
27809a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0U, 0) >= poisoned(0U, 0));
27819a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0LL, 0LLU) >= poisoned(0LL, 0LLU));
27829a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0LLU, 0LLU) >= poisoned(0LLU, 0LLU));
27839a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(0xFF, 0xFF) >= poisoned(0xFF, 0xFF));
27849a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(0xFFFFFFFFU, 0xFFFFFFFFU) >=
27859a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov                  poisoned(0xFFFFFFFFU, 0xFFFFFFFFU));
27869a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(-1, 0xFFFFFFFFU) >=
27879a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov                  poisoned(-1, 0xFFFFFFFFU));
27889a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov
27899a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(6, 0xF) > poisoned(7, 0));
27909a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(0xF, 0xF) > poisoned(7, 0));
27919a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov
27929a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(-1, 0x80000000U) >= poisoned(-1, 0U));
27939a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov}
27949a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov
27959a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov#if MSAN_HAS_M128
27969a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy StepanovTEST(MemorySanitizer, ICmpVectorRelational) {
2797b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov  EXPECT_NOT_POISONED(
2798b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov      _mm_cmplt_epi16(poisoned(_mm_set1_epi16(0), _mm_set1_epi16(0)),
2799b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov                   poisoned(_mm_set1_epi16(0), _mm_set1_epi16(0))));
2800b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov  EXPECT_NOT_POISONED(
2801b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov      _mm_cmplt_epi16(poisoned(_mm_set1_epi32(0), _mm_set1_epi32(0)),
2802b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov                   poisoned(_mm_set1_epi32(0), _mm_set1_epi32(0))));
2803b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov  EXPECT_POISONED(
2804b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov      _mm_cmplt_epi16(poisoned(_mm_set1_epi16(0), _mm_set1_epi16(0xFFFF)),
2805b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov                   poisoned(_mm_set1_epi16(0), _mm_set1_epi16(0xFFFF))));
2806b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov  EXPECT_POISONED(_mm_cmpgt_epi16(poisoned(_mm_set1_epi16(6), _mm_set1_epi16(0xF)),
2807b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov                               poisoned(_mm_set1_epi16(7), _mm_set1_epi16(0))));
28089a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov}
28099a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov#endif
28109a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov
28112efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov// Volatile bitfield store is implemented as load-mask-store
28122efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov// Test that we don't warn on the store of (uninitialized) padding.
28132efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanovstruct VolatileBitfieldStruct {
28142efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov  volatile unsigned x : 1;
28152efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov  unsigned y : 1;
28162efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov};
28172efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov
28182efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy StepanovTEST(MemorySanitizer, VolatileBitfield) {
28192efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov  VolatileBitfieldStruct *S = new VolatileBitfieldStruct;
28202efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov  S->x = 1;
282102f4a942bff84f1266571740456dd9baa230d87bEvgeniy Stepanov  EXPECT_NOT_POISONED((unsigned)S->x);
282202f4a942bff84f1266571740456dd9baa230d87bEvgeniy Stepanov  EXPECT_POISONED((unsigned)S->y);
28232efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov}
28242efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov
2825f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy StepanovTEST(MemorySanitizer, UnalignedLoad) {
2826f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  char x[32];
2827f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  memset(x + 8, 0, 16);
2828f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_POISONED(__sanitizer_unaligned_load16(x+6));
2829f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_POISONED(__sanitizer_unaligned_load16(x+7));
2830f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_NOT_POISONED(__sanitizer_unaligned_load16(x+8));
2831f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_NOT_POISONED(__sanitizer_unaligned_load16(x+9));
2832f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_NOT_POISONED(__sanitizer_unaligned_load16(x+22));
2833f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_POISONED(__sanitizer_unaligned_load16(x+23));
2834f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_POISONED(__sanitizer_unaligned_load16(x+24));
2835f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov
2836f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_POISONED(__sanitizer_unaligned_load32(x+4));
2837f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_POISONED(__sanitizer_unaligned_load32(x+7));
2838f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_NOT_POISONED(__sanitizer_unaligned_load32(x+8));
2839f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_NOT_POISONED(__sanitizer_unaligned_load32(x+9));
2840f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_NOT_POISONED(__sanitizer_unaligned_load32(x+20));
2841f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_POISONED(__sanitizer_unaligned_load32(x+21));
2842f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_POISONED(__sanitizer_unaligned_load32(x+24));
2843f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov
2844f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_POISONED(__sanitizer_unaligned_load64(x));
2845f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_POISONED(__sanitizer_unaligned_load64(x+1));
2846f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_POISONED(__sanitizer_unaligned_load64(x+7));
2847f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_NOT_POISONED(__sanitizer_unaligned_load64(x+8));
2848f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_NOT_POISONED(__sanitizer_unaligned_load64(x+9));
2849f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_NOT_POISONED(__sanitizer_unaligned_load64(x+16));
2850f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_POISONED(__sanitizer_unaligned_load64(x+17));
2851f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_POISONED(__sanitizer_unaligned_load64(x+21));
2852f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_POISONED(__sanitizer_unaligned_load64(x+24));
2853f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov}
2854f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov
2855f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy StepanovTEST(MemorySanitizer, UnalignedStore16) {
2856f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  char x[5];
2857f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  U2 y = 0;
2858f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  __msan_poison(&y, 1);
2859f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  __sanitizer_unaligned_store16(x + 1, y);
2860f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_POISONED(x[0]);
2861f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_POISONED(x[1]);
2862f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_NOT_POISONED(x[2]);
2863f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_POISONED(x[3]);
2864f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_POISONED(x[4]);
2865f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov}
2866f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov
2867f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy StepanovTEST(MemorySanitizer, UnalignedStore32) {
2868f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  char x[8];
2869f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  U4 y4 = 0;
2870f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  __msan_poison(&y4, 2);
2871f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  __sanitizer_unaligned_store32(x+3, y4);
2872f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_POISONED(x[0]);
2873f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_POISONED(x[1]);
2874f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_POISONED(x[2]);
2875f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_POISONED(x[3]);
2876f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_POISONED(x[4]);
2877f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_NOT_POISONED(x[5]);
2878f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_NOT_POISONED(x[6]);
2879f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_POISONED(x[7]);
2880f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov}
2881f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov
2882f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy StepanovTEST(MemorySanitizer, UnalignedStore64) {
2883f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  char x[16];
2884f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  U8 y = 0;
2885f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  __msan_poison(&y, 3);
2886f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  __msan_poison(((char *)&y) + sizeof(y) - 2, 1);
2887f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  __sanitizer_unaligned_store64(x+3, y);
2888f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_POISONED(x[0]);
2889f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_POISONED(x[1]);
2890f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_POISONED(x[2]);
2891f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_POISONED(x[3]);
2892f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_POISONED(x[4]);
2893f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_POISONED(x[5]);
2894f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_NOT_POISONED(x[6]);
2895f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_NOT_POISONED(x[7]);
2896f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_NOT_POISONED(x[8]);
2897f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_POISONED(x[9]);
2898f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_NOT_POISONED(x[10]);
2899f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov  EXPECT_POISONED(x[11]);
2900f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov}
2901f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov
29020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerDr, StoreInDSOTest) {
29030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!__msan_has_dynamic_component()) return;
29040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* s = new char[10];
29050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  dso_memfill(s, 9);
290611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s[5]);
290711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s[9]);
29080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
29090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
29100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovint return_poisoned_int() {
29110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return ReturnPoisoned<U8>();
29120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
29130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
29140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerDr, ReturnFromDSOTest) {
29150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!__msan_has_dynamic_component()) return;
291611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(dso_callfn(return_poisoned_int));
29170231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
29180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
29190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE int TrashParamTLS(long long x, long long y, long long z) {  //NOLINT
292011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(x);
292111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(y);
292211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(z);
29230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return 0;
29240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
29250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
29260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic int CheckParamTLS(long long x, long long y, long long z) {  //NOLINT
292711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x);
292811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(y);
292911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(z);
29300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return 0;
29310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
29320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
29330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerDr, CallFromDSOTest) {
29340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!__msan_has_dynamic_component()) return;
29350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S8* x = GetPoisoned<S8>();
29360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S8* y = GetPoisoned<S8>();
29370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S8* z = GetPoisoned<S8>();
293811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(TrashParamTLS(*x, *y, *z));
293911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(dso_callfn1(CheckParamTLS));
29400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
29410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
29420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void StackStoreInDSOFn(int* x, int* y) {
294311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*x);
294411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*y);
29450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
29460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
29470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerDr, StackStoreInDSOTest) {
29480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!__msan_has_dynamic_component()) return;
29490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  dso_stack_store(StackStoreInDSOFn, 1);
29500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
29510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
29520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, SetGet) {
29530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(TrackingOrigins(), __msan_get_track_origins());
29540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
29550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int x;
29560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(&x, sizeof(x), 1234);
29570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(1234, __msan_get_origin(&x));
29580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(&x, sizeof(x), 5678);
29590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(5678, __msan_get_origin(&x));
29600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(&x, sizeof(x), 0);
29610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(0, __msan_get_origin(&x));
29620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
29630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
29640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovnamespace {
29650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct S {
29660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U4 dummy;
29670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U2 a;
29680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U2 b;
29690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
29700231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
29710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// http://code.google.com/p/memory-sanitizer/issues/detail?id=6
29720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, DISABLED_InitializedStoreDoesNotChangeOrigin) {
29730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
29740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
29750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S s;
2976250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  U4 origin = rand();  // NOLINT
29770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  s.a = *GetPoisonedO<U2>(0, origin);
29780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(origin, __msan_get_origin(&s.a));
29790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(origin, __msan_get_origin(&s.b));
29800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
29810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  s.b = 42;
29820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(origin, __msan_get_origin(&s.a));
29830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(origin, __msan_get_origin(&s.b));
29840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
29850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}  // namespace
29860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
29870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T, class BinaryOp>
29880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovINLINE
29890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovvoid BinaryOpOriginTest(BinaryOp op) {
2990250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  U4 ox = rand();  //NOLINT
2991250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  U4 oy = rand();  //NOLINT
29920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *x = GetPoisonedO<T>(0, ox, 0);
29930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *y = GetPoisonedO<T>(1, oy, 0);
29940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *z = GetPoisonedO<T>(2, 0, 0);
29950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
29960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *z = op(*x, *y);
2997250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  U4 origin = __msan_get_origin(z);
299811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*z, origin);
29990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(true, origin == ox || origin == oy);
30000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
30010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // y is poisoned, x is not.
30020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *x = 10101;
30030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *y = *GetPoisonedO<T>(1, oy);
300412c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(x);
30050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(z, sizeof(*z), 0);
30060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *z = op(*x, *y);
300711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*z, oy);
30080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(__msan_get_origin(z), oy);
30090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
30100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // x is poisoned, y is not.
30110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *x = *GetPoisonedO<T>(0, ox);
30120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *y = 10101010;
301312c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(y);
30140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(z, sizeof(*z), 0);
30150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *z = op(*x, *y);
301611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*z, ox);
30170231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(__msan_get_origin(z), ox);
30180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
30190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
30200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> INLINE T XOR(const T &a, const T&b) { return a ^ b; }
30210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> INLINE T ADD(const T &a, const T&b) { return a + b; }
30220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> INLINE T SUB(const T &a, const T&b) { return a - b; }
30230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> INLINE T MUL(const T &a, const T&b) { return a * b; }
30240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> INLINE T AND(const T &a, const T&b) { return a & b; }
30250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> INLINE T OR (const T &a, const T&b) { return a | b; }
30260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
30270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, BinaryOp) {
30280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
30290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<S8>(XOR<S8>);
30300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<U8>(ADD<U8>);
30310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<S4>(SUB<S4>);
30320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<S4>(MUL<S4>);
30330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<U4>(OR<U4>);
30340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<U4>(AND<U4>);
30350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<double>(ADD<U4>);
30360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<float>(ADD<S4>);
30370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<double>(ADD<double>);
30380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<float>(ADD<double>);
30390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
30400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
30410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, Unary) {
30420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
304311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S8>(0, __LINE__), __LINE__);
304411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S8>(0, __LINE__), __LINE__);
304511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S8>(0, __LINE__), __LINE__);
304611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S8>(0, __LINE__), __LINE__);
30470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
304811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__);
304911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__);
305011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__);
305111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__);
30520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
305311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<U4>(0, __LINE__), __LINE__);
305411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<U4>(0, __LINE__), __LINE__);
305511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<U4>(0, __LINE__), __LINE__);
305611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<U4>(0, __LINE__), __LINE__);
30570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
305811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__);
305911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__);
306011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__);
306111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__);
30620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
306311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O((void*)*GetPoisonedO<S8>(0, __LINE__), __LINE__);
306411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O((U8)*GetPoisonedO<void*>(0, __LINE__), __LINE__);
30650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
30660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
30670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, EQ) {
30680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
306911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__) <= 11, __LINE__);
307011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__) == 11, __LINE__);
307111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<float>(0, __LINE__) == 1.1, __LINE__);
30720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
30730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
30740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, DIV) {
30750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
307611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<U8>(0, __LINE__) / 100, __LINE__);
307711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  unsigned o = __LINE__;
307811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_UMR_O(volatile unsigned y = 100 / *GetPoisonedO<S4>(0, o, 1), o);
30790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
30800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
30810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, SHIFT) {
30820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
308311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<U8>(0, __LINE__) >> 10, __LINE__);
308411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S8>(0, __LINE__) >> 10, __LINE__);
308511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S8>(0, __LINE__) << 10, __LINE__);
308611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(10U << *GetPoisonedO<U8>(0, __LINE__), __LINE__);
308711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(-10 >> *GetPoisonedO<S8>(0, __LINE__), __LINE__);
308811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(-10 << *GetPoisonedO<S8>(0, __LINE__), __LINE__);
30890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
30900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
30910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T, int N>
30920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovvoid MemCpyTest() {
30930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int ox = __LINE__;
30940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *x = new T[N];
30950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *y = new T[N];
30960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *z = new T[N];
3097353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy Stepanov  T *q = new T[N];
30980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(x, N * sizeof(T));
30990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(x, N * sizeof(T), ox);
31000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(y, N * sizeof(T), 777777);
31010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(z, N * sizeof(T), 888888);
310211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x);
310311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  memcpy(y, x, N * sizeof(T));
310411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(y[0], ox);
310511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(y[N/2], ox);
310611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(y[N-1], ox);
310711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x);
3108353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy Stepanov  void *res = mempcpy(q, x, N * sizeof(T));
3109353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy Stepanov  ASSERT_EQ(q + N, res);
3110353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy Stepanov  EXPECT_POISONED_O(q[0], ox);
3111353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy Stepanov  EXPECT_POISONED_O(q[N/2], ox);
3112353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy Stepanov  EXPECT_POISONED_O(q[N-1], ox);
3113353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy Stepanov  EXPECT_NOT_POISONED(x);
311411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  memmove(z, x, N * sizeof(T));
311511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(z[0], ox);
311611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(z[N/2], ox);
311711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(z[N-1], ox);
31180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
31190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
31200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, LargeMemCpy) {
31210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
31220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  MemCpyTest<U1, 10000>();
31230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  MemCpyTest<U8, 10000>();
31240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
31250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
31260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, SmallMemCpy) {
31270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
31280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  MemCpyTest<U8, 1>();
31290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  MemCpyTest<U8, 2>();
31300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  MemCpyTest<U8, 3>();
31310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
31320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
31330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, Select) {
31340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
313511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(g_one ? 1 : *GetPoisonedO<S4>(0, __LINE__));
313611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__);
31370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 x;
313812c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&x);
31390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x = g_1 ? *GetPoisonedO<S4>(0, __LINE__) : 0;
31400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
314111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(g_1 ? *GetPoisonedO<S4>(0, __LINE__) : 1, __LINE__);
314211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(g_0 ? 1 : *GetPoisonedO<S4>(0, __LINE__), __LINE__);
31430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
31440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
31450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovextern "C"
314611929000ec2919192b3be457f5a44c71ed55215eEvgeniy StepanovNOINLINE char AllocaTO() {
31470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int ar[100];
314812c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(ar);
314911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  return ar[10];
31500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // fprintf(stderr, "Descr: %s\n",
31510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  //        __msan_get_origin_descr_if_stack(__msan_get_origin_tls()));
31520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
31530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
31540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, Alloca) {
31550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
315611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_S(AllocaTO(), "ar@AllocaTO");
315711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_S(AllocaTO(), "ar@AllocaTO");
315811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_S(AllocaTO(), "ar@AllocaTO");
315911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_S(AllocaTO(), "ar@AllocaTO");
31600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
31610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
31620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// FIXME: replace with a lit-like test.
31630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, DISABLED_AllocaDeath) {
31640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
316511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_DEATH(AllocaTO(), "ORIGIN: stack allocation: ar@AllocaTO");
31660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
31670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
3168250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy StepanovNOINLINE int RetvalOriginTest(U4 origin) {
31690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int *a = new int;
317012c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(a);
31710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(a, sizeof(*a), origin);
31720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = *a;
31730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete a;
31740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return res;
31750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
31760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
31770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, Retval) {
31780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
317911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(RetvalOriginTest(__LINE__), __LINE__);
31800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
31810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
3182250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy StepanovNOINLINE void ParamOriginTest(int param, U4 origin) {
318311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(param, origin);
31840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
31850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
31860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, Param) {
31870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
31880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int *a = new int;
3189250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  U4 origin = __LINE__;
319012c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(a);
31910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(a, sizeof(*a), origin);
31920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ParamOriginTest(*a, origin);
31930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete a;
31940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
31950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
31960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, Invoke) {
31970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
31980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StructWithDtor s;  // Will cause the calls to become invokes.
319911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(RetvalOriginTest(__LINE__), __LINE__);
32000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
32010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
32020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, strlen) {
32030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S8 alignment;
320412c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&alignment);
32050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char x[4] = {'a', 'b', 0, 0};
32060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&x[2], 1);
3207250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  U4 origin = __LINE__;
32080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(x, sizeof(x), origin);
320911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_UMR_O(volatile unsigned y = strlen(x), origin);
32100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
32110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
32120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, wcslen) {
32130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  wchar_t w[3] = {'a', 'b', 0};
3214250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  U4 origin = __LINE__;
32150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(w, sizeof(w), origin);
32160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&w[2], sizeof(wchar_t));
321711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_UMR_O(volatile unsigned y = wcslen(w), origin);
32180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
32190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
32200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#if MSAN_HAS_M128
32210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, StoreIntrinsic) {
32220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __m128 x, y;
3223250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  U4 origin = __LINE__;
32240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(&x, sizeof(x), origin);
32250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&x, sizeof(x));
32260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __builtin_ia32_storeups((float*)&y, x);
322711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(y, origin);
32280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
32290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#endif
32300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
32310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE void RecursiveMalloc(int depth) {
32320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  static int count;
32330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  count++;
32340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if ((count % (1024 * 1024)) == 0)
32350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    printf("RecursiveMalloc: %d\n", count);
32360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int *x1 = new int;
32370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int *x2 = new int;
323812c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(x1);
323912c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(x2);
32400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (depth > 0) {
32410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    RecursiveMalloc(depth-1);
32420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    RecursiveMalloc(depth-1);
32430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  }
32440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete x1;
32450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete x2;
32460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
32470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
3248204060453c823f027815cfe6d449bbd5c4f39f7fEvgeniy StepanovTEST(MemorySanitizer, Select) {
3249204060453c823f027815cfe6d449bbd5c4f39f7fEvgeniy Stepanov  int x;
3250204060453c823f027815cfe6d449bbd5c4f39f7fEvgeniy Stepanov  int volatile* p = &x;
3251204060453c823f027815cfe6d449bbd5c4f39f7fEvgeniy Stepanov  int z = *p ? 1 : 0;
3252204060453c823f027815cfe6d449bbd5c4f39f7fEvgeniy Stepanov  EXPECT_POISONED(z);
3253204060453c823f027815cfe6d449bbd5c4f39f7fEvgeniy Stepanov}
3254204060453c823f027815cfe6d449bbd5c4f39f7fEvgeniy Stepanov
32550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerStress, DISABLED_MallocStackTrace) {
32560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  RecursiveMalloc(22);
32570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
32585c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov
32595c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy StepanovTEST(MemorySanitizerAllocator, get_estimated_allocated_size) {
32605c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  size_t sizes[] = {0, 20, 5000, 1<<20};
32615c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  for (size_t i = 0; i < sizeof(sizes) / sizeof(*sizes); ++i) {
32625c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov    size_t alloc_size = __msan_get_estimated_allocated_size(sizes[i]);
32635c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov    EXPECT_EQ(alloc_size, sizes[i]);
32645c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  }
32655c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov}
32665c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov
32675c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy StepanovTEST(MemorySanitizerAllocator, get_allocated_size_and_ownership) {
32685c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  char *array = reinterpret_cast<char*>(malloc(100));
32695c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  int *int_ptr = new int;
32705c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov
32715c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  EXPECT_TRUE(__msan_get_ownership(array));
32725c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  EXPECT_EQ(100, __msan_get_allocated_size(array));
32735c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov
32745c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  EXPECT_TRUE(__msan_get_ownership(int_ptr));
32755c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  EXPECT_EQ(sizeof(*int_ptr), __msan_get_allocated_size(int_ptr));
32765c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov
32775c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  void *wild_addr = reinterpret_cast<void*>(0x1);
32785c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  EXPECT_FALSE(__msan_get_ownership(wild_addr));
32795c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  EXPECT_EQ(0, __msan_get_allocated_size(wild_addr));
32805c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov
32815c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  EXPECT_FALSE(__msan_get_ownership(array + 50));
32825c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  EXPECT_EQ(0, __msan_get_allocated_size(array + 50));
32835c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov
32845c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  // NULL is a valid argument for GetAllocatedSize but is not owned.
32855c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  EXPECT_FALSE(__msan_get_ownership(NULL));
32865c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  EXPECT_EQ(0, __msan_get_allocated_size(NULL));
32875c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov
32885c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  free(array);
32895c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  EXPECT_FALSE(__msan_get_ownership(array));
32905c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  EXPECT_EQ(0, __msan_get_allocated_size(array));
32915c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov
32925c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov  delete int_ptr;
32935c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov}
3294