msan_test.cc revision 6c503b9c7b0ad08fba74dbed309447d75de9a157
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
220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <stdlib.h>
230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <stdarg.h>
240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <stdio.h>
250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <assert.h>
260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <wchar.h>
277cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov#include <math.h>
280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
29e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov#include <dlfcn.h>
300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <unistd.h>
310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <limits.h>
320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <sys/time.h>
330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <sys/types.h>
340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <sys/stat.h>
350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <fcntl.h>
360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <sys/resource.h>
370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <sys/ioctl.h>
380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <sys/utsname.h>
390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <sys/mman.h>
400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <sys/vfs.h>
41d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov#include <sys/types.h>
42d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov#include <dirent.h>
430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#if defined(__i386__) || defined(__x86_64__)
450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov# include <emmintrin.h>
460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov# define MSAN_HAS_M128 1
470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#else
480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov# define MSAN_HAS_M128 0
490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#endif
500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef unsigned char      U1;
520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef unsigned short     U2;  // NOLINT
530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef unsigned int       U4;
540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef unsigned long long U8;  // NOLINT
550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef   signed char      S1;
560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef   signed short     S2;  // NOLINT
570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef   signed int       S4;
580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef   signed long long S8;  // NOLINT
590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#define NOINLINE      __attribute__((noinline))
600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#define INLINE      __attribute__((always_inline))
610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
6211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovstatic bool TrackingOrigins() {
6311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  S8 x;
6411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  __msan_set_origin(&x, sizeof(x), 0x1234);
65250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  U4 origin = __msan_get_origin(&x);
6611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  __msan_set_origin(&x, sizeof(x), 0);
6711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  return origin == 0x1234;
6811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov}
690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
7011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov#define EXPECT_UMR(action) \
710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    do {                        \
720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      __msan_set_expect_umr(1); \
730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      action;                   \
740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      __msan_set_expect_umr(0); \
750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    } while (0)
760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
7711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov#define EXPECT_UMR_O(action, origin) \
780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    do {                                            \
790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      __msan_set_expect_umr(1);                     \
800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      action;                                       \
810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      __msan_set_expect_umr(0);                     \
820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      if (TrackingOrigins())                        \
8312c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov        EXPECT_EQ(origin, __msan_get_umr_origin()); \
840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    } while (0)
850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
8611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov#define EXPECT_UMR_S(action, stack_origin) \
870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    do {                                            \
880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      __msan_set_expect_umr(1);                     \
890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      action;                                       \
900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      __msan_set_expect_umr(0);                     \
91250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov      U4 id = __msan_get_umr_origin();             \
920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      const char *str = __msan_get_origin_descr_if_stack(id); \
930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      if (!str || strcmp(str, stack_origin)) {      \
940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov        fprintf(stderr, "EXPECT_POISONED_S: id=%u %s, %s", \
950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov                id, stack_origin, str);  \
960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov        EXPECT_EQ(1, 0);                            \
970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      }                                             \
980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    } while (0)
990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
10011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov#define EXPECT_POISONED(x) ExpectPoisoned(x)
10111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
10211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovtemplate<typename T>
10311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovvoid ExpectPoisoned(const T& t) {
10411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NE(-1, __msan_test_shadow((void*)&t, sizeof(t)));
10511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov}
10611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
10711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov#define EXPECT_POISONED_O(x, origin) \
10811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  ExpectPoisonedWithOrigin(x, origin)
10911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
11011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovtemplate<typename T>
11111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovvoid ExpectPoisonedWithOrigin(const T& t, unsigned origin) {
11211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NE(-1, __msan_test_shadow((void*)&t, sizeof(t)));
11311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  if (TrackingOrigins())
11411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov    EXPECT_EQ(origin, __msan_get_origin((void*)&t));
11511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov}
11611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
11711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov#define EXPECT_POISONED_S(x, stack_origin) \
11811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  ExpectPoisonedWithStackOrigin(x, stack_origin)
11911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
12011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovtemplate<typename T>
12111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovvoid ExpectPoisonedWithStackOrigin(const T& t, const char *stack_origin) {
12211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NE(-1, __msan_test_shadow((void*)&t, sizeof(t)));
123250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  U4 id = __msan_get_origin((void*)&t);
12411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  const char *str = __msan_get_origin_descr_if_stack(id);
12511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  if (!str || strcmp(str, stack_origin)) {
12611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov    fprintf(stderr, "EXPECT_POISONED_S: id=%u %s, %s",
12711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov        id, stack_origin, str);
12811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov    EXPECT_EQ(1, 0);
12911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  }
13011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov}
13111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
13211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov#define EXPECT_NOT_POISONED(x) ExpectNotPoisoned(x)
13311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
13411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovtemplate<typename T>
13511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovvoid ExpectNotPoisoned(const T& t) {
13611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_EQ(-1, __msan_test_shadow((void*)&t, sizeof(t)));
13711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov}
1380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
1390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic U8 poisoned_array[100];
1400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T>
1410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovT *GetPoisoned(int i = 0, T val = 0) {
1420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *res = (T*)&poisoned_array[i];
1430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *res = val;
1440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&poisoned_array[i], sizeof(T));
1450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return res;
1460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
1470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
1480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T>
149250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy StepanovT *GetPoisonedO(int i, U4 origin, T val = 0) {
1500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *res = (T*)&poisoned_array[i];
1510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *res = val;
1520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&poisoned_array[i], sizeof(T));
1530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(&poisoned_array[i], sizeof(T), origin);
1540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return res;
1550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
1560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
1570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// This function returns its parameter but in such a way that compiler
1580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// can not prove it.
1590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T>
1600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE
1610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic T Ident(T t) {
1620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  volatile T ret = t;
1630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return ret;
1640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
1650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
1660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> NOINLINE T ReturnPoisoned() { return *GetPoisoned<T>(); }
1670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
1680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic volatile int g_one = 1;
1690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic volatile int g_zero = 0;
1700231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic volatile int g_0 = 0;
1710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic volatile int g_1 = 1;
1720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
1730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovS4 a_s4[100];
1740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovS8 a_s8[100];
1750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
17612c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov// Check that malloc poisons memory.
17712c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov// A lot of tests below depend on this.
17812c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy StepanovTEST(MemorySanitizerSanity, PoisonInMalloc) {
17912c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  int *x = (int*)malloc(sizeof(int));
18012c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  EXPECT_POISONED(*x);
18112c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  free(x);
18212c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov}
18312c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov
1840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, NegativeTest1) {
1850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 *x = GetPoisoned<S4>();
1860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (g_one)
1870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    *x = 0;
18811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*x);
1890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
1900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
1910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, PositiveTest1) {
1920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // Load to store.
19311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S1>());
19411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S2>());
19511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S4>());
19611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S8>());
1970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
1980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // S->S conversions.
19911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S1>());
20011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S1>());
20111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S1>());
2020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
20311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S2>());
20411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S2>());
20511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S2>());
2060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
20711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S4>());
20811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S4>());
20911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S4>());
2100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
21111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S8>());
21211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S8>());
21311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<S8>());
2140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // ZExt
21611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<U1>());
21711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<U1>());
21811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<U1>());
21911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<U2>());
22011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<U2>());
22111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<U4>());
2220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // Unary ops.
22411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(- *GetPoisoned<S4>());
2250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
22611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_UMR(a_s4[g_zero] = 100 / *GetPoisoned<S4>(0, 1));
2270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  a_s4[g_zero] = 1 - *GetPoisoned<S4>();
2300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  a_s4[g_zero] = 1 + *GetPoisoned<S4>();
2310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
2320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Phi1) {
2340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 c;
2350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (g_one) {
2360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    c = *GetPoisoned<S4>();
2370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  } else {
23812c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov    break_optimization(0);
2390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    c = 0;
2400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  }
24111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(c);
2420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
2430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Phi2) {
2450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 i = *GetPoisoned<S4>();
2460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 n = g_one;
24711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_UMR(for (; i < g_one; i++););
24811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(i);
2490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
2500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
25111929000ec2919192b3be457f5a44c71ed55215eEvgeniy StepanovNOINLINE void Arg1ExpectUMR(S4 a1) { EXPECT_POISONED(a1); }
25211929000ec2919192b3be457f5a44c71ed55215eEvgeniy StepanovNOINLINE void Arg2ExpectUMR(S4 a1, S4 a2) { EXPECT_POISONED(a2); }
25311929000ec2919192b3be457f5a44c71ed55215eEvgeniy StepanovNOINLINE void Arg3ExpectUMR(S1 a1, S4 a2, S8 a3) { EXPECT_POISONED(a3); }
2540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, ArgTest) {
2560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  Arg1ExpectUMR(*GetPoisoned<S4>());
2570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  Arg2ExpectUMR(0, *GetPoisoned<S4>());
2580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  Arg3ExpectUMR(0, 1, *GetPoisoned<S8>());
2590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
2600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, CallAndRet) {
2630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!__msan_has_dynamic_component()) return;
2640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ReturnPoisoned<S1>();
2650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ReturnPoisoned<S2>();
2660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ReturnPoisoned<S4>();
2670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ReturnPoisoned<S8>();
2680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
26911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(ReturnPoisoned<S1>());
27011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(ReturnPoisoned<S2>());
27111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(ReturnPoisoned<S4>());
27211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(ReturnPoisoned<S8>());
2730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
2740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// malloc() in the following test may be optimized to produce a compile-time
2760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// undef value. Check that we trap on the volatile assignment anyway.
2770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, DISABLED_MallocNoIdent) {
2780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 *x = (int*)malloc(sizeof(S4));
27911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*x);
2800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  free(x);
2810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
2820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Malloc) {
2840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 *x = (int*)Ident(malloc(sizeof(S4)));
28511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*x);
2860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  free(x);
2870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
2880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
2890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Realloc) {
2900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 *x = (int*)Ident(realloc(0, sizeof(S4)));
29111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(x[0]);
2920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[0] = 1;
2930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x = (int*)Ident(realloc(x, 2 * sizeof(S4)));
29411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);  // Ok, was inited before.
29511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(x[1]);
2960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x = (int*)Ident(realloc(x, 3 * sizeof(S4)));
29711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);  // Ok, was inited before.
29811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(x[2]);
29911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(x[1]);
3000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[2] = 1;  // Init this here. Check that after realloc it is poisoned again.
3010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x = (int*)Ident(realloc(x, 2 * sizeof(S4)));
30211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);  // Ok, was inited before.
30311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(x[1]);
3040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x = (int*)Ident(realloc(x, 3 * sizeof(S4)));
30511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(x[1]);
30611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(x[2]);
3070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  free(x);
3080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
3090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
3100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Calloc) {
3110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 *x = (int*)Ident(calloc(1, sizeof(S4)));
31211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*x);  // Should not be poisoned.
3130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // EXPECT_EQ(0, *x);
3140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  free(x);
3150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
3160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
3170231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, AndOr) {
3180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U4 *p = GetPoisoned<U4>();
3190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // We poison two bytes in the midle of a 4-byte word to make the test
3200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // correct regardless of endianness.
3210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ((U1*)p)[1] = 0;
3220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ((U1*)p)[2] = 0xff;
32311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*p & 0x00ffff00);
32411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*p & 0x00ff0000);
32511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*p & 0x0000ff00);
32611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*p & 0xff000000);
32711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*p & 0x000000ff);
32811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*p & 0x0000ffff);
32911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*p & 0xffff0000);
3300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
33111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*p | 0xff0000ff);
33211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*p | 0xff00ffff);
33311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*p | 0xffff00ff);
33411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*p | 0xff000000);
33511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*p | 0x000000ff);
33611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*p | 0x0000ffff);
33711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*p | 0xffff0000);
3380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
33911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<bool>() & *GetPoisoned<bool>());
3400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
3410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
3420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T>
34311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovstatic bool applyNot(T value, T shadow) {
3440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_partial_poison(&value, &shadow, sizeof(T));
34511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  return !value;
3460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
3470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
3480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Not) {
34911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U4>(0x0, 0x0));
35011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U4>(0xFFFFFFFF, 0x0));
35111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(applyNot<U4>(0xFFFFFFFF, 0xFFFFFFFF));
35211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U4>(0xFF000000, 0x0FFFFFFF));
35311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U4>(0xFF000000, 0x00FFFFFF));
35411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U4>(0xFF000000, 0x0000FFFF));
35511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U4>(0xFF000000, 0x00000000));
35611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(applyNot<U4>(0xFF000000, 0xFF000000));
35711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U4>(0xFF800000, 0xFF000000));
35811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(applyNot<U4>(0x00008000, 0x00008000));
35911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
36011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U1>(0x0, 0x0));
36111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U1>(0xFF, 0xFE));
36211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<U1>(0xFF, 0x0));
36311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(applyNot<U1>(0xFF, 0xFF));
36411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
36511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(applyNot<void*>((void*)0xFFFFFF, (void*)(-1)));
36611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applyNot<void*>((void*)0xFFFFFF, (void*)(-2)));
3670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
3680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
3690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Shift) {
3700231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U4 *up = GetPoisoned<U4>();
3710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ((U1*)up)[0] = 0;
3720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ((U1*)up)[3] = 0xff;
37311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*up >> 30);
37411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*up >> 24);
37511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*up >> 23);
37611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*up >> 10);
3770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
37811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*up << 30);
37911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*up << 24);
38011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*up << 23);
38111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*up << 10);
3820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
3830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 *sp = (S4*)up;
38411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*sp >> 30);
38511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*sp >> 24);
38611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*sp >> 23);
38711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*sp >> 10);
3880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
3890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  sp = GetPoisoned<S4>();
3900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ((S1*)sp)[1] = 0;
3910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ((S1*)sp)[2] = 0;
39211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*sp >> 31);
3930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
39411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(100 >> *GetPoisoned<S4>());
39511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(100U >> *GetPoisoned<S4>());
3960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
3970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
3980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE static int GetPoisonedZero() {
3990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int *zero = new int;
4000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *zero = 0;
4010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(zero, sizeof(*zero));
4020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = *zero;
4030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete zero;
4040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return res;
4050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, LoadFromDirtyAddress) {
4080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int *a = new int;
4090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *a = 0;
41012c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  EXPECT_UMR(break_optimization((void*)(U8)a[GetPoisonedZero()]));
4110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete a;
4120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, StoreToDirtyAddress) {
4150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int *a = new int;
41611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_UMR(a[GetPoisonedZero()] = 0);
41712c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(a);
4180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete a;
4190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE void StackTestFunc() {
4230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 p4;
4240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 ok4 = 1;
4250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S2 p2;
4260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S2 ok2 = 1;
4270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S1 p1;
4280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S1 ok1 = 1;
42912c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&p4);
43012c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&ok4);
43112c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&p2);
43212c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&ok2);
43312c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&p1);
43412c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&ok1);
4350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
43611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(p4);
43711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(p2);
43811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(p1);
43911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(ok1);
44011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(ok2);
44111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(ok4);
4420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, StackTest) {
4450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StackTestFunc();
4460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE void StackStressFunc() {
4490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int foo[10000];
45012c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(foo);
4510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, DISABLED_StackStressTest) {
4540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  for (int i = 0; i < 1000000; i++)
4550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    StackStressFunc();
4560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T>
4590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovvoid TestFloatingPoint() {
4600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  static volatile T v;
4610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  static T g[100];
46212c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&g);
4630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *x = GetPoisoned<T>();
4640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *y = GetPoisoned<T>(1);
46511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*x);
46611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED((long long)*x);
46711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED((int)*x);
4680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  g[0] = *x;
4690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  g[1] = *x + *y;
4700231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  g[2] = *x - *y;
4710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  g[3] = *x * *y;
4720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, FloatingPointTest) {
4750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestFloatingPoint<float>();
4760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestFloatingPoint<double>();
4770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, DynMem) {
4800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 x = 0;
4810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 *y = GetPoisoned<S4>();
4820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  memcpy(y, &x, g_one * sizeof(S4));
48311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*y);
4840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic char *DynRetTestStr;
4870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, DynRet) {
4890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!__msan_has_dynamic_component()) return;
4900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ReturnPoisoned<S8>();
49111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(clearenv());
4920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
4950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, DynRet1) {
4960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!__msan_has_dynamic_component()) return;
4970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ReturnPoisoned<S8>();
4980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
4990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct LargeStruct {
5010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 x[10];
5020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
5030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE
5050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovLargeStruct LargeRetTest() {
5060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  LargeStruct res;
5070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[0] = *GetPoisoned<S4>();
5080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[1] = *GetPoisoned<S4>();
5090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[2] = *GetPoisoned<S4>();
5100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[3] = *GetPoisoned<S4>();
5110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[4] = *GetPoisoned<S4>();
5120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[5] = *GetPoisoned<S4>();
5130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[6] = *GetPoisoned<S4>();
5140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[7] = *GetPoisoned<S4>();
5150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[8] = *GetPoisoned<S4>();
5160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.x[9] = *GetPoisoned<S4>();
5170231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return res;
5180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
5190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, LargeRet) {
5210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  LargeStruct a = LargeRetTest();
52211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(a.x[0]);
52311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(a.x[9]);
5240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
5250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, fread) {
5270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char *x = new char[32];
5280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  FILE *f = fopen("/proc/self/stat", "r");
5290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(f);
5300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  fread(x, 1, 32, f);
53111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);
53211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[16]);
53311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[31]);
5340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  fclose(f);
5350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete x;
5360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
5370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, read) {
5390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char *x = new char[32];
5400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int fd = open("/proc/self/stat", O_RDONLY);
5410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(fd > 0);
5420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int sz = read(fd, x, 32);
5430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(sz == 32);
54411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);
54511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[16]);
54611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[31]);
5470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  close(fd);
5480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete x;
5490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
5500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, pread) {
5520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char *x = new char[32];
5530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int fd = open("/proc/self/stat", O_RDONLY);
5540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(fd > 0);
5550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int sz = pread(fd, x, 32, 0);
5560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(sz == 32);
55711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);
55811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[16]);
55911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[31]);
5600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  close(fd);
5610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete x;
5620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
5630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// FIXME: fails now.
5650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, DISABLED_ioctl) {
5660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  struct winsize ws;
5670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(ioctl(2, TIOCGWINSZ, &ws), 0);
56811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(ws.ws_col);
5690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
5700231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, readlink) {
5720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char *x = new char[1000];
5730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  readlink("/proc/self/exe", x, 1000);
57411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);
5750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete [] x;
5760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
5770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, stat) {
5800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  struct stat* st = new struct stat;
5810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = stat("/proc/self/stat", st);
5820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(!res);
58311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(st->st_dev);
58411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(st->st_mode);
58511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(st->st_size);
5860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
5870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, statfs) {
5890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  struct statfs* st = new struct statfs;
5900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = statfs("/", st);
5910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(!res);
59211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(st->f_type);
59311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(st->f_bfree);
59411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(st->f_namelen);
5950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
5960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
5970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, pipe) {
5980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* pipefd = new int[2];
5990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = pipe(pipefd);
6000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(!res);
60111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(pipefd[0]);
60211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(pipefd[1]);
6030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  close(pipefd[0]);
6040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  close(pipefd[1]);
6050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
6060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
6070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, getcwd) {
6080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char path[PATH_MAX + 1];
6090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* res = getcwd(path, sizeof(path));
6100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(res);
61111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(path[0]);
6120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
6130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
6147eed04c4dce69ad1e485edbf6dd963e176b52e0dEvgeniy StepanovTEST(MemorySanitizer, getcwd_gnu) {
6157eed04c4dce69ad1e485edbf6dd963e176b52e0dEvgeniy Stepanov  char* res = getcwd(NULL, 0);
6167eed04c4dce69ad1e485edbf6dd963e176b52e0dEvgeniy Stepanov  assert(res);
6177eed04c4dce69ad1e485edbf6dd963e176b52e0dEvgeniy Stepanov  EXPECT_NOT_POISONED(res[0]);
6187eed04c4dce69ad1e485edbf6dd963e176b52e0dEvgeniy Stepanov  free(res);
6197eed04c4dce69ad1e485edbf6dd963e176b52e0dEvgeniy Stepanov}
6207eed04c4dce69ad1e485edbf6dd963e176b52e0dEvgeniy Stepanov
621d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy StepanovTEST(MemorySanitizer, readdir) {
622d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov  DIR *dir = opendir(".");
623d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov  struct dirent *d = readdir(dir);
624d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov  assert(d);
625d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov  EXPECT_NOT_POISONED(d->d_name[0]);
626d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov  closedir(dir);
627d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov}
628d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov
6290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, realpath) {
6300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  const char* relpath = ".";
6310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char path[PATH_MAX + 1];
6320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* res = realpath(relpath, path);
6330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(res);
63411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(path[0]);
6350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
6360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
6370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, memcpy) {
6380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* x = new char[2];
6390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* y = new char[2];
6400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[0] = 1;
6410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[1] = *GetPoisoned<char>();
6420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  memcpy(y, x, 2);
64311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(y[0]);
64411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(y[1]);
6450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
6460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
6470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, memmove) {
6480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* x = new char[2];
6490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* y = new char[2];
6500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[0] = 1;
6510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[1] = *GetPoisoned<char>();
6520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  memmove(y, x, 2);
65311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(y[0]);
65411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(y[1]);
6550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
6560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
6570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, strdup) {
6588aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  char buf[4] = "abc";
6598aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  __msan_poison(buf + 2, sizeof(*buf));
6608aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  char *x = strdup(buf);
6618aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);
6628aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_NOT_POISONED(x[1]);
6638aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_POISONED(x[2]);
6648aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_NOT_POISONED(x[3]);
6658aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  free(x);
6668aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov}
6678aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov
6688aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy StepanovTEST(MemorySanitizer, strndup) {
6698aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  char buf[4] = "abc";
6708aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  __msan_poison(buf + 2, sizeof(*buf));
6718aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  char *x = strndup(buf, 3);
6728aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);
6738aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_NOT_POISONED(x[1]);
6748aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_POISONED(x[2]);
6758aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_NOT_POISONED(x[3]);
6760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  free(x);
6770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
6780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
6798aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy StepanovTEST(MemorySanitizer, strndup_short) {
6808aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  char buf[4] = "abc";
6818aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  __msan_poison(buf + 1, sizeof(*buf));
6828aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  __msan_poison(buf + 2, sizeof(*buf));
6838aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  char *x = strndup(buf, 2);
6848aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_NOT_POISONED(x[0]);
6858aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  EXPECT_POISONED(x[1]);
6861d21bd159c3830dd7a6c05854408442d91a336adEvgeniy Stepanov  EXPECT_NOT_POISONED(x[2]);
6878aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov  free(x);
6888aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov}
6898aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov
6908aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov
6910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T, int size>
6920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovvoid TestOverlapMemmove() {
6930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *x = new T[size];
6940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(size >= 3);
6950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[2] = 0;
6960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  memmove(x, x + 1, (size - 1) * sizeof(T));
69711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x[1]);
6980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!__msan_has_dynamic_component()) {
6990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    // FIXME: under DR we will lose this information
7000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    // because accesses in memmove will unpoisin the shadow.
7010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    // We need to use our own memove implementation instead of libc's.
70211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov    EXPECT_POISONED(x[0]);
70311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov    EXPECT_POISONED(x[2]);
7040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  }
7050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete [] x;
7060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
7070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
7080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, overlap_memmove) {
7090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestOverlapMemmove<U1, 10>();
7100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestOverlapMemmove<U1, 1000>();
7110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestOverlapMemmove<U8, 4>();
7120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestOverlapMemmove<U8, 1000>();
7130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
7140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
7150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, strcpy) {  // NOLINT
7160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* x = new char[3];
7170231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* y = new char[3];
7180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[0] = 'a';
7190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[1] = *GetPoisoned<char>(1, 1);
7200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[2] = 0;
7210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  strcpy(y, x);  // NOLINT
72211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(y[0]);
72311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(y[1]);
72411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(y[2]);
7250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
7260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
7270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, strncpy) {  // NOLINT
7280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* x = new char[3];
7290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* y = new char[3];
7300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[0] = 'a';
7310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[1] = *GetPoisoned<char>(1, 1);
7320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x[2] = 0;
7330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  strncpy(y, x, 2);  // NOLINT
73411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(y[0]);
73511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(y[1]);
73611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(y[2]);
7370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
7380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
7390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, strtol) {
7400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char *e;
7410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(1 == strtol("1", &e, 10));
74211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED((S8) e);
7430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
7440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
7450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, strtoll) {
7460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char *e;
7470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(1 == strtoll("1", &e, 10));
74811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED((S8) e);
7490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
7500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
7510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, strtoul) {
7520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char *e;
7530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(1 == strtoul("1", &e, 10));
75411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED((S8) e);
7550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
7560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
7570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, strtoull) {
7580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char *e;
7590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(1 == strtoull("1", &e, 10));
76011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED((S8) e);
7610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
7620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
763e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy StepanovTEST(MemorySanitizer, strtod) {
764e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  char *e;
765e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  assert(0 != strtod("1.5", &e));
76611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED((S8) e);
767e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov}
768e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov
769e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy StepanovTEST(MemorySanitizer, strtof) {
770e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  char *e;
771e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  assert(0 != strtof("1.5", &e));
77211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED((S8) e);
773e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov}
774e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov
775e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy StepanovTEST(MemorySanitizer, strtold) {
776e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  char *e;
777e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  assert(0 != strtold("1.5", &e));
77811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED((S8) e);
779e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov}
780e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov
7810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, sprintf) {  // NOLINT
7820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char buff[10];
78312c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(buff);
78411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(buff[0]);
7850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = sprintf(buff, "%d", 1234567);  // NOLINT
7860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(res == 7);
7870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(buff[0] == '1');
7880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(buff[1] == '2');
7890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(buff[2] == '3');
7900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(buff[6] == '7');
7910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(buff[7] == 0);
79211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(buff[8]);
7930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
7940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
7950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, snprintf) {
7960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char buff[10];
79712c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(buff);
79811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(buff[0]);
7990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = snprintf(buff, sizeof(buff), "%d", 1234567);
8000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(res == 7);
8010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(buff[0] == '1');
8020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(buff[1] == '2');
8030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(buff[2] == '3');
8040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(buff[6] == '7');
8050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(buff[7] == 0);
80611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(buff[8]);
8070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
8080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
8090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, swprintf) {
8100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  wchar_t buff[10];
8110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(sizeof(wchar_t) == 4);
81212c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(buff);
81311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(buff[0]);
8140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = swprintf(buff, 9, L"%d", 1234567);
8150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(res == 7);
8160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(buff[0] == '1');
8170231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(buff[1] == '2');
8180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(buff[2] == '3');
8190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(buff[6] == '7');
8200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(buff[7] == 0);
82111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(buff[8]);
8220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
8230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
8240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, wcstombs) {
8250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  const wchar_t *x = L"abc";
8260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char buff[10];
8270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = wcstombs(buff, x, 4);
8280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(res, 3);
8290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(buff[0], 'a');
8300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(buff[1], 'b');
8310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(buff[2], 'c');
8320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
8330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
8340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, gettimeofday) {
8350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  struct timeval tv;
8360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  struct timezone tz;
83712c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&tv);
83812c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&tz);
8390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(sizeof(tv) == 16);
8400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(sizeof(tz) == 8);
84111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(tv.tv_sec);
84211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(tv.tv_usec);
84311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(tz.tz_minuteswest);
84411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(tz.tz_dsttime);
8450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(0 == gettimeofday(&tv, &tz));
84611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(tv.tv_sec);
84711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(tv.tv_usec);
84811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(tz.tz_minuteswest);
84911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(tz.tz_dsttime);
8500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
8510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
8529358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy StepanovTEST(MemorySanitizer, localtime) {
8539358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  time_t t = 123;
8549358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  struct tm *time = localtime(&t);
8559358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  assert(time != 0);
8569358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  EXPECT_NOT_POISONED(time->tm_sec);
8579358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  EXPECT_NOT_POISONED(time->tm_hour);
8589358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  EXPECT_NOT_POISONED(time->tm_year);
8599358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  EXPECT_NOT_POISONED(time->tm_isdst);
8609358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov}
8619358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov
8629358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy StepanovTEST(MemorySanitizer, localtime_r) {
8639358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  time_t t = 123;
8649358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  struct tm time;
8659358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  struct tm *res = localtime_r(&t, &time);
8669358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  assert(res != 0);
8679358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  EXPECT_NOT_POISONED(time.tm_sec);
8689358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  EXPECT_NOT_POISONED(time.tm_hour);
8699358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  EXPECT_NOT_POISONED(time.tm_year);
8709358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov  EXPECT_NOT_POISONED(time.tm_isdst);
8719358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov}
8729358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov
8730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, mmap) {
8740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  const int size = 4096;
8750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  void *p1, *p2;
8760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  p1 = mmap(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0);
8770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(p1, size);
8780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  munmap(p1, size);
8790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  for (int i = 0; i < 1000; i++) {
8800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    p2 = mmap(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0);
8810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    if (p2 == p1)
8820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      break;
8830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    else
8840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      munmap(p2, size);
8850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  }
8860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (p1 == p2) {
88711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov    EXPECT_NOT_POISONED(*(char*)p2);
8880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    munmap(p2, size);
8890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  }
8900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
8910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
8920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// FIXME: enable and add ecvt.
8930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// FIXME: check why msandr does nt handle fcvt.
8940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, fcvt) {
8950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int a, b;
89612c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&a);
89712c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&b);
89811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(a);
89911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(b);
9000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char *str = fcvt(12345.6789, 10, &a, &b);
90111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(a);
90211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(b);
9030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
9040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
9057cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy StepanovTEST(MemorySanitizer, frexp) {
9067cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  int x;
9077cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  x = *GetPoisoned<int>();
9087cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  double r = frexp(1.1, &x);
9097cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  EXPECT_NOT_POISONED(r);
9107cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  EXPECT_NOT_POISONED(x);
9117cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov
9127cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  x = *GetPoisoned<int>();
9137cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  float rf = frexpf(1.1, &x);
9147cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  EXPECT_NOT_POISONED(rf);
9157cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  EXPECT_NOT_POISONED(x);
9167cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov
9177cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  x = *GetPoisoned<int>();
9187cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  double rl = frexpl(1.1, &x);
9197cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  EXPECT_NOT_POISONED(rl);
9207cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov  EXPECT_NOT_POISONED(x);
9217cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov}
9227cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov
9230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct StructWithDtor {
9240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ~StructWithDtor();
9250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
9260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
9270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE StructWithDtor::~StructWithDtor() {
92812c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(0);
9290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
9300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
9310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Invoke) {
9320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StructWithDtor s;  // Will cause the calls to become invokes.
93311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(0);
93411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<int>());
93511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(0);
93611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(*GetPoisoned<int>());
93711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(ReturnPoisoned<S4>());
9380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
9390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
9400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, ptrtoint) {
9410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // Test that shadow is propagated through pointer-to-integer conversion.
9420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  void* p = (void*)0xABCD;
9430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(((char*)&p) + 1, sizeof(p));
944250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  EXPECT_NOT_POISONED((((uintptr_t)p) & 0xFF) == 0);
9450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
9460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  void* q = (void*)0xABCD;
9470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&q, sizeof(q) - 1);
948250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  EXPECT_POISONED((((uintptr_t)q) & 0xFF) == 0);
9490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
9500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
9510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn2(int guard, ...) {
9520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl;
9530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_start(vl, guard);
95411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
95511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
95611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
95711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, double));
9580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_end(vl);
9590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
9600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
9610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn(int guard, ...) {
9620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl;
9630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_start(vl, guard);
96411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
96511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
9660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // The following call will overwrite __msan_param_tls.
9670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // Checks after it test that arg shadow was somehow saved across the call.
9680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  vaargsfn2(1, 2, 3, 4, *GetPoisoned<double>());
96911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
97011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
9710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_end(vl);
9720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
9730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
9740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, VAArgTest) {
9750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* x = GetPoisoned<int>();
9760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* y = GetPoisoned<int>(4);
9770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  vaargsfn(1, 13, *x, 42, *y);
9780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
9790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
9800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_many(int guard, ...) {
9810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl;
9820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_start(vl, guard);
98311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
98411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
98511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
98611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
98711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
98811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
98911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
99011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
99111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
99211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
9930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_end(vl);
9940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
9950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
9960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, VAArgManyTest) {
9970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* x = GetPoisoned<int>();
9980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* y = GetPoisoned<int>(4);
9990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  vaargsfn_many(1, 2, *x, 3, 4, 5, 6, 7, 8, 9, *y);
10000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
10010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
10020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_pass2(va_list vl) {
100311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
100411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
100511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
10060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
10070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
10080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_pass(int guard, ...) {
10090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl;
10100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_start(vl, guard);
101111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
10120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  vaargsfn_pass2(vl);
10130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_end(vl);
10140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
10150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
10160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, VAArgPass) {
10170231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* x = GetPoisoned<int>();
10180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* y = GetPoisoned<int>(4);
10190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  vaargsfn_pass(1, *x, 2, 3, *y);
10200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
10210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
10220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_copy2(va_list vl) {
102311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
102411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
10250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
10260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
10270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_copy(int guard, ...) {
10280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl;
10290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_start(vl, guard);
103011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
103111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
10320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl2;
10330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_copy(vl2, vl);
10340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  vaargsfn_copy2(vl2);
103511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
103611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
10370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_end(vl);
10380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
10390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
10400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, VAArgCopy) {
10410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* x = GetPoisoned<int>();
10420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* y = GetPoisoned<int>(4);
10430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  vaargsfn_copy(1, 2, *x, 3, *y);
10440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
10450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
10460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_ptr(int guard, ...) {
10470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl;
10480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_start(vl, guard);
104911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int*));
105011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int*));
105111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int*));
105211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, double*));
10530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_end(vl);
10540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
10550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
10560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, VAArgPtr) {
10570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int** x = GetPoisoned<int*>();
10580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  double** y = GetPoisoned<double*>(8);
10590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int z;
10600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  vaargsfn_ptr(1, &z, *x, &z, *y);
10610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
10620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
10630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_overflow(int guard, ...) {
10640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl;
10650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_start(vl, guard);
106611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
106711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
106811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
106911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
107011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
107111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
107211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
107311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, double));
107411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, double));
107511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, double));
107611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, double));
107711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, double));
107811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int*));
107911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, double));
108011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, double));
108111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
108211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
108311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, double));
108411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int*));
108511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
108611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
108711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, double));
108811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int*));
108911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov
109011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
109111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, double));
109211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int*));
10930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
10940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_end(vl);
10950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
10960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
10970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, VAArgOverflow) {
10980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* x = GetPoisoned<int>();
10990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  double* y = GetPoisoned<double>(8);
11000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int** p = GetPoisoned<int*>(16);
11010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int z;
11020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  vaargsfn_overflow(1,
11030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      1, 2, *x, 4, 5, 6,
11040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      1.1, 2.2, 3.3, *y, 5.5, *p, 7.7, 8.8,
11050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      // the following args will overflow for sure
11060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      *x, *y, *p,
11070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      7, 9.9, &z,
11080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov      *x, *y, *p);
11090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
11100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
11110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_tlsoverwrite2(int guard, ...) {
11120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl;
11130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_start(vl, guard);
111411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(va_arg(vl, int));
11150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_end(vl);
11160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
11170231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
11180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_tlsoverwrite(int guard, ...) {
11190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // This call will overwrite TLS contents unless it's backed up somewhere.
11200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  vaargsfn_tlsoverwrite2(2, 42);
11210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_list vl;
11220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_start(vl, guard);
112311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(va_arg(vl, int));
11240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  va_end(vl);
11250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
11260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
11270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, VAArgTLSOverwrite) {
11280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int* x = GetPoisoned<int>();
11290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  vaargsfn_tlsoverwrite(1, *x);
11300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
11310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
11320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct StructByVal {
11330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int a, b, c, d, e, f;
11340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
11350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
11360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE void StructByValTestFunc(struct StructByVal s) {
113711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s.a);
113811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s.b);
113911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s.c);
114011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s.d);
114111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s.e);
114211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s.f);
11430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
11440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
11450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE void StructByValTestFunc1(struct StructByVal s) {
11460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StructByValTestFunc(s);
11470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
11480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
11490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE void StructByValTestFunc2(int z, struct StructByVal s) {
11500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StructByValTestFunc(s);
11510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
11520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
11530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, StructByVal) {
11540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // Large aggregates are passed as "byval" pointer argument in LLVM.
11550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  struct StructByVal s;
11560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  s.a = 1;
11570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  s.b = *GetPoisoned<int>();
11580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  s.c = 2;
11590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  s.d = *GetPoisoned<int>();
11600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  s.e = 3;
11610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  s.f = *GetPoisoned<int>();
11620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StructByValTestFunc(s);
11630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StructByValTestFunc1(s);
11640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StructByValTestFunc2(0, s);
11650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
11660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
11670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
11680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#if MSAN_HAS_M128
11690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE __m128i m128Eq(__m128i *a, __m128i *b) { return *a == *b; }
11700231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE __m128i m128Lt(__m128i *a, __m128i *b) { return *a < *b; }
11710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, m128) {
11720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __m128i a = _mm_set1_epi16(0x1234);
11730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __m128i b = _mm_set1_epi16(0x7890);
117411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(m128Eq(&a, &b));
117511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(m128Lt(&a, &b));
11760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
11770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// FIXME: add more tests for __m128i.
11780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#endif  // MSAN_HAS_M128
11790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
11800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// We should not complain when copying this poisoned hole.
11810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct StructWithHole {
11820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U4  a;
11830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // 4-byte hole.
11840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U8  b;
11850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
11860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
11870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE StructWithHole ReturnStructWithHole() {
11880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StructWithHole res;
11890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&res, sizeof(res));
11900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.a = 1;
11910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.b = 2;
11920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return res;
11930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
11940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
11950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, StructWithHole) {
11960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StructWithHole a = ReturnStructWithHole();
119712c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&a);
11980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
11990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
12000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate <class T>
12010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE T ReturnStruct() {
12020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T res;
12030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&res, sizeof(res));
12040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.a = 1;
12050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return res;
12060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
12070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
12080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate <class T>
12090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE void TestReturnStruct() {
12100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T s1 = ReturnStruct<T>();
121111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s1.a);
121211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s1.b);
12130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
12140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
12150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS1 {
12160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int a, b, c;
12170231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
12180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS2 {
12190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int b, a, c;
12200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
12210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS3 {
12220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int b, c, a;
12230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
12240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS4 {
12250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int c, b, a;
12260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
12270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
12280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS5 {
12290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int a;
12300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  float b;
12310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
12320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS6 {
12330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int a;
12340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  double b;
12350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
12360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS7 {
12370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S8 b;
12380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int a;
12390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
12400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS8 {
12410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S2 b;
12420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S8 a;
12430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
12440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
12450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, IntStruct3) {
12460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestReturnStruct<SSS1>();
12470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestReturnStruct<SSS2>();
12480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestReturnStruct<SSS3>();
12490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestReturnStruct<SSS4>();
12500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestReturnStruct<SSS5>();
12510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestReturnStruct<SSS6>();
12520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestReturnStruct<SSS7>();
12530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  TestReturnStruct<SSS8>();
12540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
12550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
12560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct LongStruct {
12570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U1 a1, b1;
12580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U2 a2, b2;
12590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U4 a4, b4;
12600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U8 a8, b8;
12610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
12620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
12630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE LongStruct ReturnLongStruct1() {
12640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  LongStruct res;
12650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&res, sizeof(res));
12660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.a1 = res.a2 = res.a4 = res.a8 = 111;
12670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // leaves b1, .., b8 poisoned.
12680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return res;
12690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
12700231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
12710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE LongStruct ReturnLongStruct2() {
12720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  LongStruct res;
12730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&res, sizeof(res));
12740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res.b1 = res.b2 = res.b4 = res.b8 = 111;
12750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // leaves a1, .., a8 poisoned.
12760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return res;
12770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
12780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
12790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, LongStruct) {
12800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  LongStruct s1 = ReturnLongStruct1();
12810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_print_shadow(&s1, sizeof(s1));
128211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s1.a1);
128311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s1.a2);
128411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s1.a4);
128511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s1.a8);
12860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
128711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s1.b1);
128811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s1.b2);
128911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s1.b4);
129011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s1.b8);
12910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
12920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  LongStruct s2 = ReturnLongStruct2();
12930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_print_shadow(&s2, sizeof(s2));
129411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s2.b1);
129511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s2.b2);
129611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s2.b4);
129711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s2.b8);
12980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
129911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s2.a1);
130011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s2.a2);
130111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s2.a4);
130211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s2.a8);
13030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
13040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
13050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, getrlimit) {
13060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  struct rlimit limit;
13070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&limit, sizeof(limit));
13080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int result = getrlimit(RLIMIT_DATA, &limit);
13090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(result == 0);
13100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  volatile rlim_t t;
13110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  t = limit.rlim_cur;
13120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  t = limit.rlim_max;
13130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
13140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
1315e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy StepanovTEST(MemorySanitizer, getrusage) {
1316e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  struct rusage usage;
1317e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  __msan_poison(&usage, sizeof(usage));
1318e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  int result = getrusage(RUSAGE_SELF, &usage);
1319e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  assert(result == 0);
1320e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  volatile struct timeval t;
132111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_utime.tv_sec);
132211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_utime.tv_usec);
132311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_stime.tv_sec);
132411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_stime.tv_usec);
132511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_maxrss);
132611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_minflt);
132711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_majflt);
132811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_inblock);
132911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_oublock);
133011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_nvcsw);
133111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(usage.ru_nivcsw);
1332e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov}
1333e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov
1334e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanovstatic void dladdr_testfn() {}
1335e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov
1336e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy StepanovTEST(MemorySanitizer, dladdr) {
1337e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  Dl_info info;
1338e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  __msan_poison(&info, sizeof(info));
1339e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  int result = dladdr((const void*)dladdr_testfn, &info);
1340e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  assert(result != 0);
134111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED((unsigned long)info.dli_fname);
1342e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  if (info.dli_fname)
134311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov    EXPECT_NOT_POISONED(strlen(info.dli_fname));
134411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED((unsigned long)info.dli_fbase);
134511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED((unsigned long)info.dli_sname);
1346e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov  if (info.dli_sname)
134711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov    EXPECT_NOT_POISONED(strlen(info.dli_sname));
134811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED((unsigned long)info.dli_saddr);
1349e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov}
1350e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov
135186b5722bf955261c0f43caae9b8d0ea6faa05055Evgeniy Stepanovnamespace {
13520f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner#ifdef __GLIBC__
13530f92deb81207c80481ff0257fbaba640fe669633Reid Klecknerextern "C" {
13540f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  extern void *__libc_stack_end;
13550f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner}
13560f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner
13570f92deb81207c80481ff0257fbaba640fe669633Reid Klecknerstatic char **GetArgv(void) {
13580f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  uintptr_t *stack_end = (uintptr_t *)__libc_stack_end;
13590f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  return (char**)(stack_end + 1);
13600f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner}
13610f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner
13620f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner#else  // __GLIBC__
13630f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner# error "TODO: port this"
13640f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner#endif
13650f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner
13660f92deb81207c80481ff0257fbaba640fe669633Reid KlecknerTEST(MemorySanitizer, dlopen) {
13670f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  // Compute the path to our loadable DSO.  We assume it's in the same
13680f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  // directory.  Only use string routines that we intercept so far to do this.
13690f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  char **argv = GetArgv();
13700f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  const char *basename = "libmsan_loadable.x86_64.so";
13710f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  size_t path_max = strlen(argv[0]) + 1 + strlen(basename) + 1;
13720f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  char *path = new char[path_max];
13730f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  char *last_slash = strrchr(argv[0], '/');
13740f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  assert(last_slash);
13750f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  snprintf(path, path_max, "%.*s/%s", int(last_slash - argv[0]),
13760f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner           argv[0], basename);
13770f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner
13780f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  // We need to clear shadow for globals when doing dlopen.  In order to test
13790f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  // this, we have to poison the shadow for the DSO before we load it.  In
13800f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  // general this is difficult, but the loader tends to reload things in the
13810f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  // same place, so we open, close, and then reopen.  The global should always
13820f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  // start out clean after dlopen.
13830f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  for (int i = 0; i < 2; i++) {
13840f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner    void *lib = dlopen(path, RTLD_LAZY);
13850f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner    if (lib == NULL) {
13860f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner      printf("dlerror: %s\n", dlerror());
13870f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner      assert(lib != NULL);
13880f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner    }
13890f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner    void **(*get_dso_global)() = (void **(*)())dlsym(lib, "get_dso_global");
13900f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner    assert(get_dso_global);
13910f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner    void **dso_global = get_dso_global();
13920f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner    EXPECT_NOT_POISONED(*dso_global);
13930f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner    __msan_poison(dso_global, sizeof(*dso_global));
13940f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner    EXPECT_POISONED(*dso_global);
13950f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner    dlclose(lib);
13960f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  }
13970f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner
13980f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner  delete[] path;
13990f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner}
14006c503b9c7b0ad08fba74dbed309447d75de9a157Evgeniy Stepanov
14016c503b9c7b0ad08fba74dbed309447d75de9a157Evgeniy Stepanov// Regression test for a crash in dlopen() interceptor.
14026c503b9c7b0ad08fba74dbed309447d75de9a157Evgeniy StepanovTEST(MemorySanitizer, dlopenFailed) {
14036c503b9c7b0ad08fba74dbed309447d75de9a157Evgeniy Stepanov  const char *path = "/libmsan_loadable_does_not_exist.x86_64.so";
14046c503b9c7b0ad08fba74dbed309447d75de9a157Evgeniy Stepanov  void *lib = dlopen(path, RTLD_LAZY);
14056c503b9c7b0ad08fba74dbed309447d75de9a157Evgeniy Stepanov  ASSERT_EQ(0, lib);
14066c503b9c7b0ad08fba74dbed309447d75de9a157Evgeniy Stepanov}
140786b5722bf955261c0f43caae9b8d0ea6faa05055Evgeniy Stepanov} // namespace
14080f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner
1409996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy StepanovTEST(MemorySanitizer, scanf) {
1410996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  const char *input = "42 hello";
1411996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  int* d = new int;
1412996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  char* s = new char[7];
1413996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  int res = sscanf(input, "%d %5s", d, s);
1414996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  printf("res %d\n", res);
1415996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  assert(res == 2);
141611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*d);
141711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s[0]);
141811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s[1]);
141911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s[2]);
142011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s[3]);
142111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s[4]);
142211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s[5]);
142311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s[6]);
1424996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  delete s;
1425996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov  delete d;
1426996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov}
1427996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov
1428b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanovstatic void *SimpleThread_threadfn(void* data) {
14290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return new int;
14300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
14310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
14320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, SimpleThread) {
14330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  pthread_t t;
1434b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  void *p;
14350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = pthread_create(&t, NULL, SimpleThread_threadfn, NULL);
14360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(!res);
14370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  res = pthread_join(t, &p);
14380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(!res);
14390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!__msan_has_dynamic_component())  // FIXME: intercept pthread_join (?).
14400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    __msan_unpoison(&p, sizeof(p));
14410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete (int*)p;
14420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
14430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
1444b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanovstatic void *SmallStackThread_threadfn(void* data) {
144510fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  return 0;
144610fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov}
144710fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov
144810fd3227546d17c7411241a45ebc143b2031c78dEvgeniy StepanovTEST(MemorySanitizer, SmallStackThread) {
144910fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  pthread_attr_t attr;
145010fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  pthread_t t;
1451b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  void *p;
145210fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  int res;
145310fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  res = pthread_attr_init(&attr);
145410fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  ASSERT_EQ(0, res);
145510fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  res = pthread_attr_setstacksize(&attr, 64 * 1024);
145610fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  ASSERT_EQ(0, res);
1457b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  res = pthread_create(&t, &attr, SmallStackThread_threadfn, NULL);
145810fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  ASSERT_EQ(0, res);
145910fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  res = pthread_join(t, &p);
146010fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  ASSERT_EQ(0, res);
146110fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  res = pthread_attr_destroy(&attr);
1462b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  ASSERT_EQ(0, res);
1463b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov}
1464b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov
1465b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy StepanovTEST(MemorySanitizer, PreAllocatedStackThread) {
1466b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  pthread_attr_t attr;
1467b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  pthread_t t;
1468b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  int res;
1469b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  res = pthread_attr_init(&attr);
1470b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  ASSERT_EQ(0, res);
1471b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  void *stack;
1472b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  const size_t kStackSize = 64 * 1024;
1473b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  res = posix_memalign(&stack, 4096, kStackSize);
1474b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  ASSERT_EQ(0, res);
1475b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  res = pthread_attr_setstack(&attr, stack, kStackSize);
1476b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  ASSERT_EQ(0, res);
1477b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  // A small self-allocated stack can not be extended by the tool.
1478b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  // In this case pthread_create is expected to fail.
1479b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  res = pthread_create(&t, &attr, SmallStackThread_threadfn, NULL);
1480b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  EXPECT_NE(0, res);
1481b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov  res = pthread_attr_destroy(&attr);
148210fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov  ASSERT_EQ(0, res);
148310fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov}
148410fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov
14850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, uname) {
14860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  struct utsname u;
14870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = uname(&u);
14880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  assert(!res);
148911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(strlen(u.sysname));
149011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(strlen(u.nodename));
149111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(strlen(u.release));
149211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(strlen(u.version));
149311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(strlen(u.machine));
14940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
14950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
149695d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy StepanovTEST(MemorySanitizer, gethostname) {
149795d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov  char buf[100];
149895d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov  int res = gethostname(buf, 100);
149995d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov  assert(!res);
150095d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov  EXPECT_NOT_POISONED(strlen(buf));
150195d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov}
150295d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov
15030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T>
150411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovstatic bool applySlt(T value, T shadow) {
15050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_partial_poison(&value, &shadow, sizeof(T));
15060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  volatile bool zzz = true;
15070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // This "|| zzz" trick somehow makes LLVM emit "icmp slt" instead of
15080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // a shift-and-trunc to get at the highest bit.
150911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  volatile bool v = value < 0 || zzz;
151011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  return v;
15110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
15120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
15130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, SignedCompareWithZero) {
151411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applySlt<S4>(0xF, 0xF));
151511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applySlt<S4>(0xF, 0xFF));
151611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applySlt<S4>(0xF, 0xFFFFFF));
151711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(applySlt<S4>(0xF, 0x7FFFFFF));
151811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_UMR(applySlt<S4>(0xF, 0x80FFFFFF));
151911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_UMR(applySlt<S4>(0xF, 0xFFFFFFFF));
15200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
15210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
15229a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanovtemplate <class T, class S>
15239a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanovstatic T poisoned(T Va, S Sa) {
15249a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  char SIZE_CHECK1[(ssize_t)sizeof(T) - (ssize_t)sizeof(S)];
15259a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  char SIZE_CHECK2[(ssize_t)sizeof(S) - (ssize_t)sizeof(T)];
15269a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  T a;
15279a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  a = Va;
15289a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  __msan_partial_poison(&a, &Sa, sizeof(T));
15299a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  return a;
15309a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov}
15319a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov
15329a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy StepanovTEST(MemorySanitizer, ICmpRelational) {
15339a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0, 0) < poisoned(0, 0));
15349a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0U, 0) < poisoned(0U, 0));
15359a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0LL, 0LLU) < poisoned(0LL, 0LLU));
15369a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0LLU, 0LLU) < poisoned(0LLU, 0LLU));
15379a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(0xFF, 0xFF) < poisoned(0xFF, 0xFF));
15389a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(0xFFFFFFFFU, 0xFFFFFFFFU) <
15399a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov                  poisoned(0xFFFFFFFFU, 0xFFFFFFFFU));
15409a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(-1, 0xFFFFFFFFU) <
15419a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov                  poisoned(-1, 0xFFFFFFFFU));
15429a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov
15439a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0, 0) <= poisoned(0, 0));
15449a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0U, 0) <= poisoned(0U, 0));
15459a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0LL, 0LLU) <= poisoned(0LL, 0LLU));
15469a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0LLU, 0LLU) <= poisoned(0LLU, 0LLU));
15479a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(0xFF, 0xFF) <= poisoned(0xFF, 0xFF));
15489a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(0xFFFFFFFFU, 0xFFFFFFFFU) <=
15499a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov                  poisoned(0xFFFFFFFFU, 0xFFFFFFFFU));
15509a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(-1, 0xFFFFFFFFU) <=
15519a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov                  poisoned(-1, 0xFFFFFFFFU));
15529a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov
15539a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0, 0) > poisoned(0, 0));
15549a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0U, 0) > poisoned(0U, 0));
15559a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0LL, 0LLU) > poisoned(0LL, 0LLU));
15569a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0LLU, 0LLU) > poisoned(0LLU, 0LLU));
15579a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(0xFF, 0xFF) > poisoned(0xFF, 0xFF));
15589a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(0xFFFFFFFFU, 0xFFFFFFFFU) >
15599a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov                  poisoned(0xFFFFFFFFU, 0xFFFFFFFFU));
15609a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(-1, 0xFFFFFFFFU) >
15619a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov                  poisoned(-1, 0xFFFFFFFFU));
15629a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov
15639a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0, 0) >= poisoned(0, 0));
15649a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0U, 0) >= poisoned(0U, 0));
15659a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0LL, 0LLU) >= poisoned(0LL, 0LLU));
15669a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(0LLU, 0LLU) >= poisoned(0LLU, 0LLU));
15679a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(0xFF, 0xFF) >= poisoned(0xFF, 0xFF));
15689a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(0xFFFFFFFFU, 0xFFFFFFFFU) >=
15699a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov                  poisoned(0xFFFFFFFFU, 0xFFFFFFFFU));
15709a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(-1, 0xFFFFFFFFU) >=
15719a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov                  poisoned(-1, 0xFFFFFFFFU));
15729a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov
15739a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(6, 0xF) > poisoned(7, 0));
15749a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(0xF, 0xF) > poisoned(7, 0));
15759a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov
15769a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(-1, 0x80000000U) >= poisoned(-1, 0U));
15779a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov}
15789a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov
15799a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov#if MSAN_HAS_M128
15809a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy StepanovTEST(MemorySanitizer, ICmpVectorRelational) {
15819a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(_mm_set1_epi16(0), _mm_set1_epi16(0)) <
15829a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov                      poisoned(_mm_set1_epi16(0), _mm_set1_epi16(0)));
15839a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_NOT_POISONED(poisoned(_mm_set1_epi32(0), _mm_set1_epi32(0)) <
15849a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov                      poisoned(_mm_set1_epi32(0), _mm_set1_epi32(0)));
15859a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(_mm_set1_epi16(0), _mm_set1_epi16(0xFFFF)) <
15869a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov                  poisoned(_mm_set1_epi16(0), _mm_set1_epi16(0xFFFF)));
15879a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov  EXPECT_POISONED(poisoned(_mm_set1_epi16(6), _mm_set1_epi16(0xF)) >
15889a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov                  poisoned(_mm_set1_epi16(7), _mm_set1_epi16(0)));
15899a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov}
15909a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov#endif
15919a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov
15922efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov// Volatile bitfield store is implemented as load-mask-store
15932efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov// Test that we don't warn on the store of (uninitialized) padding.
15942efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanovstruct VolatileBitfieldStruct {
15952efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov  volatile unsigned x : 1;
15962efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov  unsigned y : 1;
15972efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov};
15982efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov
15992efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy StepanovTEST(MemorySanitizer, VolatileBitfield) {
16002efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov  VolatileBitfieldStruct *S = new VolatileBitfieldStruct;
16012efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov  S->x = 1;
160202f4a942bff84f1266571740456dd9baa230d87bEvgeniy Stepanov  EXPECT_NOT_POISONED((unsigned)S->x);
160302f4a942bff84f1266571740456dd9baa230d87bEvgeniy Stepanov  EXPECT_POISONED((unsigned)S->y);
16042efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov}
16052efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov
16060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerDr, StoreInDSOTest) {
16070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!__msan_has_dynamic_component()) return;
16080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char* s = new char[10];
16090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  dso_memfill(s, 9);
161011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(s[5]);
161111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(s[9]);
16120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
16130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
16140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovint return_poisoned_int() {
16150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return ReturnPoisoned<U8>();
16160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
16170231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
16180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerDr, ReturnFromDSOTest) {
16190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!__msan_has_dynamic_component()) return;
162011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(dso_callfn(return_poisoned_int));
16210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
16220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
16230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE int TrashParamTLS(long long x, long long y, long long z) {  //NOLINT
162411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(x);
162511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(y);
162611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED(z);
16270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return 0;
16280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
16290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
16300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic int CheckParamTLS(long long x, long long y, long long z) {  //NOLINT
163111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x);
163211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(y);
163311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(z);
16340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return 0;
16350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
16360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
16370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerDr, CallFromDSOTest) {
16380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!__msan_has_dynamic_component()) return;
16390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S8* x = GetPoisoned<S8>();
16400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S8* y = GetPoisoned<S8>();
16410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S8* z = GetPoisoned<S8>();
164211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(TrashParamTLS(*x, *y, *z));
164311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(dso_callfn1(CheckParamTLS));
16440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
16450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
16460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void StackStoreInDSOFn(int* x, int* y) {
164711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*x);
164811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(*y);
16490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
16500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
16510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerDr, StackStoreInDSOTest) {
16520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!__msan_has_dynamic_component()) return;
16530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  dso_stack_store(StackStoreInDSOFn, 1);
16540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
16550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
16560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, SetGet) {
16570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(TrackingOrigins(), __msan_get_track_origins());
16580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
16590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int x;
16600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(&x, sizeof(x), 1234);
16610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(1234, __msan_get_origin(&x));
16620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(&x, sizeof(x), 5678);
16630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(5678, __msan_get_origin(&x));
16640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(&x, sizeof(x), 0);
16650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(0, __msan_get_origin(&x));
16660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
16670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
16680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovnamespace {
16690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct S {
16700231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U4 dummy;
16710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U2 a;
16720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  U2 b;
16730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov};
16740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
16750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// http://code.google.com/p/memory-sanitizer/issues/detail?id=6
16760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, DISABLED_InitializedStoreDoesNotChangeOrigin) {
16770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
16780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
16790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S s;
1680250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  U4 origin = rand();  // NOLINT
16810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  s.a = *GetPoisonedO<U2>(0, origin);
16820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(origin, __msan_get_origin(&s.a));
16830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(origin, __msan_get_origin(&s.b));
16840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
16850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  s.b = 42;
16860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(origin, __msan_get_origin(&s.a));
16870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(origin, __msan_get_origin(&s.b));
16880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
16890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}  // namespace
16900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
16910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T, class BinaryOp>
16920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovINLINE
16930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovvoid BinaryOpOriginTest(BinaryOp op) {
1694250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  U4 ox = rand();  //NOLINT
1695250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  U4 oy = rand();  //NOLINT
16960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *x = GetPoisonedO<T>(0, ox, 0);
16970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *y = GetPoisonedO<T>(1, oy, 0);
16980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *z = GetPoisonedO<T>(2, 0, 0);
16990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
17000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *z = op(*x, *y);
1701250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  U4 origin = __msan_get_origin(z);
170211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*z, origin);
17030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(true, origin == ox || origin == oy);
17040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
17050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // y is poisoned, x is not.
17060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *x = 10101;
17070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *y = *GetPoisonedO<T>(1, oy);
170812c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(x);
17090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(z, sizeof(*z), 0);
17100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *z = op(*x, *y);
171111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*z, oy);
17120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(__msan_get_origin(z), oy);
17130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
17140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // x is poisoned, y is not.
17150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *x = *GetPoisonedO<T>(0, ox);
17160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *y = 10101010;
171712c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(y);
17180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(z, sizeof(*z), 0);
17190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  *z = op(*x, *y);
172011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*z, ox);
17210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  EXPECT_EQ(__msan_get_origin(z), ox);
17220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
17230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
17240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> INLINE T XOR(const T &a, const T&b) { return a ^ b; }
17250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> INLINE T ADD(const T &a, const T&b) { return a + b; }
17260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> INLINE T SUB(const T &a, const T&b) { return a - b; }
17270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> INLINE T MUL(const T &a, const T&b) { return a * b; }
17280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> INLINE T AND(const T &a, const T&b) { return a & b; }
17290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> INLINE T OR (const T &a, const T&b) { return a | b; }
17300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
17310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, BinaryOp) {
17320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
17330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<S8>(XOR<S8>);
17340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<U8>(ADD<U8>);
17350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<S4>(SUB<S4>);
17360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<S4>(MUL<S4>);
17370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<U4>(OR<U4>);
17380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<U4>(AND<U4>);
17390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<double>(ADD<U4>);
17400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<float>(ADD<S4>);
17410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<double>(ADD<double>);
17420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  BinaryOpOriginTest<float>(ADD<double>);
17430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
17440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
17450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, Unary) {
17460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
174711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S8>(0, __LINE__), __LINE__);
174811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S8>(0, __LINE__), __LINE__);
174911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S8>(0, __LINE__), __LINE__);
175011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S8>(0, __LINE__), __LINE__);
17510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
175211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__);
175311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__);
175411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__);
175511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__);
17560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
175711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<U4>(0, __LINE__), __LINE__);
175811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<U4>(0, __LINE__), __LINE__);
175911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<U4>(0, __LINE__), __LINE__);
176011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<U4>(0, __LINE__), __LINE__);
17610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
176211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__);
176311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__);
176411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__);
176511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__);
17660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
176711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O((void*)*GetPoisonedO<S8>(0, __LINE__), __LINE__);
176811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O((U8)*GetPoisonedO<void*>(0, __LINE__), __LINE__);
17690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
17700231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
17710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, EQ) {
17720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
177311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__) <= 11, __LINE__);
177411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__) == 11, __LINE__);
177511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<float>(0, __LINE__) == 1.1, __LINE__);
17760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
17770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
17780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, DIV) {
17790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
178011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<U8>(0, __LINE__) / 100, __LINE__);
178111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  unsigned o = __LINE__;
178211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_UMR_O(volatile unsigned y = 100 / *GetPoisonedO<S4>(0, o, 1), o);
17830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
17840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
17850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, SHIFT) {
17860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
178711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<U8>(0, __LINE__) >> 10, __LINE__);
178811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S8>(0, __LINE__) >> 10, __LINE__);
178911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S8>(0, __LINE__) << 10, __LINE__);
179011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(10U << *GetPoisonedO<U8>(0, __LINE__), __LINE__);
179111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(-10 >> *GetPoisonedO<S8>(0, __LINE__), __LINE__);
179211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(-10 << *GetPoisonedO<S8>(0, __LINE__), __LINE__);
17930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
17940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
17950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T, int N>
17960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovvoid MemCpyTest() {
17970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int ox = __LINE__;
17980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *x = new T[N];
17990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *y = new T[N];
18000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  T *z = new T[N];
18010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(x, N * sizeof(T));
18020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(x, N * sizeof(T), ox);
18030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(y, N * sizeof(T), 777777);
18040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(z, N * sizeof(T), 888888);
180511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x);
180611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  memcpy(y, x, N * sizeof(T));
180711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(y[0], ox);
180811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(y[N/2], ox);
180911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(y[N-1], ox);
181011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(x);
181111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  memmove(z, x, N * sizeof(T));
181211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(z[0], ox);
181311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(z[N/2], ox);
181411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(z[N-1], ox);
18150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
18160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
18170231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, LargeMemCpy) {
18180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
18190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  MemCpyTest<U1, 10000>();
18200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  MemCpyTest<U8, 10000>();
18210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
18220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
18230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, SmallMemCpy) {
18240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
18250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  MemCpyTest<U8, 1>();
18260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  MemCpyTest<U8, 2>();
18270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  MemCpyTest<U8, 3>();
18280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
18290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
18300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, Select) {
18310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
183211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_NOT_POISONED(g_one ? 1 : *GetPoisonedO<S4>(0, __LINE__));
183311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__);
18340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S4 x;
183512c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&x);
18360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  x = g_1 ? *GetPoisonedO<S4>(0, __LINE__) : 0;
18370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
183811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(g_1 ? *GetPoisonedO<S4>(0, __LINE__) : 1, __LINE__);
183911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(g_0 ? 1 : *GetPoisonedO<S4>(0, __LINE__), __LINE__);
18400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
18410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
18420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovextern "C"
184311929000ec2919192b3be457f5a44c71ed55215eEvgeniy StepanovNOINLINE char AllocaTO() {
18440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int ar[100];
184512c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(ar);
184611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  return ar[10];
18470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  // fprintf(stderr, "Descr: %s\n",
18480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  //        __msan_get_origin_descr_if_stack(__msan_get_origin_tls()));
18490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
18500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
18510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, Alloca) {
18520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
185311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_S(AllocaTO(), "ar@AllocaTO");
185411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_S(AllocaTO(), "ar@AllocaTO");
185511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_S(AllocaTO(), "ar@AllocaTO");
185611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_S(AllocaTO(), "ar@AllocaTO");
18570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
18580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
18590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// FIXME: replace with a lit-like test.
18600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, DISABLED_AllocaDeath) {
18610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
186211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_DEATH(AllocaTO(), "ORIGIN: stack allocation: ar@AllocaTO");
18630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
18640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
1865250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy StepanovNOINLINE int RetvalOriginTest(U4 origin) {
18660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int *a = new int;
186712c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(a);
18680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(a, sizeof(*a), origin);
18690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int res = *a;
18700231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete a;
18710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  return res;
18720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
18730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
18740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, Retval) {
18750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
187611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(RetvalOriginTest(__LINE__), __LINE__);
18770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
18780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
1879250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy StepanovNOINLINE void ParamOriginTest(int param, U4 origin) {
188011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(param, origin);
18810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
18820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
18830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, Param) {
18840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
18850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int *a = new int;
1886250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  U4 origin = __LINE__;
188712c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(a);
18880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(a, sizeof(*a), origin);
18890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  ParamOriginTest(*a, origin);
18900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete a;
18910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
18920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
18930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, Invoke) {
18940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (!TrackingOrigins()) return;
18950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  StructWithDtor s;  // Will cause the calls to become invokes.
189611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(RetvalOriginTest(__LINE__), __LINE__);
18970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
18980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
18990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, strlen) {
19000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  S8 alignment;
190112c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(&alignment);
19020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  char x[4] = {'a', 'b', 0, 0};
19030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&x[2], 1);
1904250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  U4 origin = __LINE__;
19050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(x, sizeof(x), origin);
190611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_UMR_O(volatile unsigned y = strlen(x), origin);
19070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
19080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
19090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, wcslen) {
19100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  wchar_t w[3] = {'a', 'b', 0};
1911250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  U4 origin = __LINE__;
19120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(w, sizeof(w), origin);
19130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&w[2], sizeof(wchar_t));
191411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_UMR_O(volatile unsigned y = wcslen(w), origin);
19150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
19160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
19170231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#if MSAN_HAS_M128
19180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, StoreIntrinsic) {
19190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __m128 x, y;
1920250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov  U4 origin = __LINE__;
19210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_set_origin(&x, sizeof(x), origin);
19220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __msan_poison(&x, sizeof(x));
19230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  __builtin_ia32_storeups((float*)&y, x);
192411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov  EXPECT_POISONED_O(y, origin);
19250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
19260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#endif
19270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
19280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE void RecursiveMalloc(int depth) {
19290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  static int count;
19300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  count++;
19310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if ((count % (1024 * 1024)) == 0)
19320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    printf("RecursiveMalloc: %d\n", count);
19330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int *x1 = new int;
19340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  int *x2 = new int;
193512c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(x1);
193612c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov  break_optimization(x2);
19370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  if (depth > 0) {
19380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    RecursiveMalloc(depth-1);
19390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov    RecursiveMalloc(depth-1);
19400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  }
19410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete x1;
19420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  delete x2;
19430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
19440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov
194565199f1b253c4bfb225805629217acb8f0b1e185Kostya SerebryanyTEST(MemorySanitizer, CallocOverflow) {
194665199f1b253c4bfb225805629217acb8f0b1e185Kostya Serebryany  size_t kArraySize = 4096;
194765199f1b253c4bfb225805629217acb8f0b1e185Kostya Serebryany  volatile size_t kMaxSizeT = std::numeric_limits<size_t>::max();
194865199f1b253c4bfb225805629217acb8f0b1e185Kostya Serebryany  volatile size_t kArraySize2 = kMaxSizeT / kArraySize + 10;
194965199f1b253c4bfb225805629217acb8f0b1e185Kostya Serebryany  void *p = calloc(kArraySize, kArraySize2);  // Should return 0.
195065199f1b253c4bfb225805629217acb8f0b1e185Kostya Serebryany  EXPECT_EQ(0L, Ident(p));
195165199f1b253c4bfb225805629217acb8f0b1e185Kostya Serebryany}
195265199f1b253c4bfb225805629217acb8f0b1e185Kostya Serebryany
19530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerStress, DISABLED_MallocStackTrace) {
19540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov  RecursiveMalloc(22);
19550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}
1956