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