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