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 216a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines#include "sanitizer/allocator_interface.h" 220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include "sanitizer/msan_interface.h" 2386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines 2486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if defined(__FreeBSD__) 2586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# define _KERNEL // To declare 'shminfo' structure. 2686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# include <sys/shm.h> 2786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# undef _KERNEL 2886277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesextern "C" { 2986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// <sys/shm.h> doesn't declare these functions in _KERNEL mode. 3086277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesvoid *shmat(int, const void *, int); 3186277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesint shmget(key_t, size_t, int); 3286277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesint shmctl(int, int, struct shmid_ds *); 3386277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesint shmdt(const void *); 3486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines} 3586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif 360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 37ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov#include <inttypes.h> 380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <stdlib.h> 390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <stdarg.h> 400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <stdio.h> 410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <wchar.h> 427cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov#include <math.h> 430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 449530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov#include <arpa/inet.h> 45e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov#include <dlfcn.h> 46103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov#include <grp.h> 470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <unistd.h> 482bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov#include <link.h> 490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <limits.h> 500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <sys/time.h> 51e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov#include <poll.h> 520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <sys/types.h> 530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <sys/stat.h> 540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <fcntl.h> 550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <sys/resource.h> 560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <sys/ioctl.h> 575cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov#include <sys/statvfs.h> 580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <sys/utsname.h> 590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#include <sys/mman.h> 60d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov#include <dirent.h> 61e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov#include <pwd.h> 62134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov#include <sys/socket.h> 630a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov#include <netdb.h> 64c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov#include <wordexp.h> 6510362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov#include <sys/ipc.h> 6610362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov#include <sys/shm.h> 670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 6886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__) 6986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# include <malloc.h> 7086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# include <sys/sysinfo.h> 7186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# include <sys/vfs.h> 7286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# include <mntent.h> 7386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# include <netinet/ether.h> 7486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#else 7586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# include <signal.h> 7686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# include <netinet/in.h> 7786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# include <pthread_np.h> 7886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# include <sys/uio.h> 7986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# include <sys/mount.h> 8086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# include <sys/sysctl.h> 8186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# include <net/ethernet.h> 8286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# define f_namelen f_namemax // FreeBSD names this statfs field so. 8386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# define cpu_set_t cpuset_t 8486277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesextern "C" { 8586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// FreeBSD's <ssp/string.h> defines mempcpy() to be a macro expanding into 8686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// a __builtin___mempcpy_chk() call, but since Msan RTL defines it as an 8786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// ordinary function, we can declare it here to complete the tests. 8886277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesvoid *mempcpy(void *dest, const void *src, size_t n); 8986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines} 9086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif 9186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines 920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#if defined(__i386__) || defined(__x86_64__) 930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov# include <emmintrin.h> 940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov# define MSAN_HAS_M128 1 950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#else 960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov# define MSAN_HAS_M128 0 970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#endif 980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#ifdef __AVX2__ 1002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines# include <immintrin.h> 1012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif 1022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 10386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// On FreeBSD procfs is not enabled by default. 10486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if defined(__FreeBSD__) 10586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# define FILE_TO_READ "/bin/cat" 10686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# define DIR_TO_READ "/bin" 10786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# define SUBFILE_TO_READ "cat" 10886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# define SYMLINK_TO_READ "/usr/bin/tar" 10986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# define SUPERUSER_GROUP "wheel" 11086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#else 11186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# define FILE_TO_READ "/proc/self/stat" 11286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# define DIR_TO_READ "/proc/self" 11386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# define SUBFILE_TO_READ "stat" 11486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# define SYMLINK_TO_READ "/proc/self/exe" 11586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# define SUPERUSER_GROUP "root" 11686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif 11786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines 11886277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesconst size_t kPageSize = 4096; 11986277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesconst size_t kMaxPathLength = 4096; 12097160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov 1210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef unsigned char U1; 1220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef unsigned short U2; // NOLINT 1230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef unsigned int U4; 1240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef unsigned long long U8; // NOLINT 1250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef signed char S1; 1260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef signed short S2; // NOLINT 1270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef signed int S4; 1280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtypedef signed long long S8; // NOLINT 1290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#define NOINLINE __attribute__((noinline)) 1300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#define INLINE __attribute__((always_inline)) 1310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 13211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovstatic bool TrackingOrigins() { 13311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov S8 x; 13411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov __msan_set_origin(&x, sizeof(x), 0x1234); 135250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov U4 origin = __msan_get_origin(&x); 13611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov __msan_set_origin(&x, sizeof(x), 0); 13786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines return __msan_origin_is_descendant_or_same(origin, 0x1234); 13811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov} 1390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 14086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#define EXPECT_ORIGIN(expected, origin) \ 14186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines EXPECT_TRUE(__msan_origin_is_descendant_or_same((origin), (expected))) 14286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines 14311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov#define EXPECT_UMR(action) \ 1440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov do { \ 1450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __msan_set_expect_umr(1); \ 1460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov action; \ 1470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __msan_set_expect_umr(0); \ 1480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov } while (0) 1490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 15086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#define EXPECT_UMR_O(action, origin) \ 15186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines do { \ 15286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines __msan_set_expect_umr(1); \ 15386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines action; \ 15486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines __msan_set_expect_umr(0); \ 15586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines if (TrackingOrigins()) EXPECT_ORIGIN(origin, __msan_get_umr_origin()); \ 15686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines } while (0) 1570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 15811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov#define EXPECT_POISONED(x) ExpectPoisoned(x) 15911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov 16011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovtemplate<typename T> 16111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovvoid ExpectPoisoned(const T& t) { 16211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NE(-1, __msan_test_shadow((void*)&t, sizeof(t))); 16311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov} 16411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov 16511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov#define EXPECT_POISONED_O(x, origin) \ 16611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov ExpectPoisonedWithOrigin(x, origin) 16711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov 16811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovtemplate<typename T> 16911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovvoid ExpectPoisonedWithOrigin(const T& t, unsigned origin) { 17011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NE(-1, __msan_test_shadow((void*)&t, sizeof(t))); 17186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines if (TrackingOrigins()) EXPECT_ORIGIN(origin, __msan_get_origin((void *)&t)); 17211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov} 17311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov 17486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#define EXPECT_NOT_POISONED(x) EXPECT_EQ(true, TestForNotPoisoned((x))) 17511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov 17611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovtemplate<typename T> 17786277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesbool TestForNotPoisoned(const T& t) { 17886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines return __msan_test_shadow((void*)&t, sizeof(t)) == -1; 17911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov} 1800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 1810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic U8 poisoned_array[100]; 1820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> 1830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovT *GetPoisoned(int i = 0, T val = 0) { 1840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov T *res = (T*)&poisoned_array[i]; 1850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov *res = val; 1860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __msan_poison(&poisoned_array[i], sizeof(T)); 1870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov return res; 1880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 1890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 1900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> 191250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy StepanovT *GetPoisonedO(int i, U4 origin, T val = 0) { 1920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov T *res = (T*)&poisoned_array[i]; 1930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov *res = val; 1940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __msan_poison(&poisoned_array[i], sizeof(T)); 1950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __msan_set_origin(&poisoned_array[i], sizeof(T), origin); 1960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov return res; 1970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 1980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 1996a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hinestemplate<typename T> 2006a211c5814e25d6745a5058cc0e499e5235d3821Stephen HinesT Poisoned(T v = 0, T s = (T)(-1)) { 2016a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines __msan_partial_poison(&v, &s, sizeof(T)); 2026a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines return v; 2036a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines} 2046a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 2050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> NOINLINE T ReturnPoisoned() { return *GetPoisoned<T>(); } 2060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 2070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic volatile int g_one = 1; 2080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic volatile int g_zero = 0; 2090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic volatile int g_0 = 0; 2100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic volatile int g_1 = 1; 2110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 2120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovS4 a_s4[100]; 2130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovS8 a_s8[100]; 2140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 21512c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov// Check that malloc poisons memory. 21612c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov// A lot of tests below depend on this. 21712c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy StepanovTEST(MemorySanitizerSanity, PoisonInMalloc) { 21812c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov int *x = (int*)malloc(sizeof(int)); 21912c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov EXPECT_POISONED(*x); 22012c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov free(x); 22112c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov} 22212c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov 2230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, NegativeTest1) { 2240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov S4 *x = GetPoisoned<S4>(); 2250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov if (g_one) 2260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov *x = 0; 22711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(*x); 2280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 2290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 2300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, PositiveTest1) { 2310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov // Load to store. 23211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*GetPoisoned<S1>()); 23311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*GetPoisoned<S2>()); 23411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*GetPoisoned<S4>()); 23511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*GetPoisoned<S8>()); 2360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 2370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov // S->S conversions. 23811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*GetPoisoned<S1>()); 23911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*GetPoisoned<S1>()); 24011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*GetPoisoned<S1>()); 2410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 24211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*GetPoisoned<S2>()); 24311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*GetPoisoned<S2>()); 24411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*GetPoisoned<S2>()); 2450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 24611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*GetPoisoned<S4>()); 24711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*GetPoisoned<S4>()); 24811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*GetPoisoned<S4>()); 2490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 25011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*GetPoisoned<S8>()); 25111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*GetPoisoned<S8>()); 25211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*GetPoisoned<S8>()); 2530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 2540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov // ZExt 25511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*GetPoisoned<U1>()); 25611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*GetPoisoned<U1>()); 25711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*GetPoisoned<U1>()); 25811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*GetPoisoned<U2>()); 25911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*GetPoisoned<U2>()); 26011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*GetPoisoned<U4>()); 2610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 2620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov // Unary ops. 26311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(- *GetPoisoned<S4>()); 2640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 26511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_UMR(a_s4[g_zero] = 100 / *GetPoisoned<S4>(0, 1)); 2660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 2670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 2680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov a_s4[g_zero] = 1 - *GetPoisoned<S4>(); 2690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov a_s4[g_zero] = 1 + *GetPoisoned<S4>(); 2700231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 2710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 2720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Phi1) { 2730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov S4 c; 2740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov if (g_one) { 2750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov c = *GetPoisoned<S4>(); 2760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov } else { 27712c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov break_optimization(0); 2780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov c = 0; 2790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov } 28011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(c); 2810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 2820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 2830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Phi2) { 2840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov S4 i = *GetPoisoned<S4>(); 2850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov S4 n = g_one; 28611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_UMR(for (; i < g_one; i++);); 28711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(i); 2880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 2890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 29011929000ec2919192b3be457f5a44c71ed55215eEvgeniy StepanovNOINLINE void Arg1ExpectUMR(S4 a1) { EXPECT_POISONED(a1); } 29111929000ec2919192b3be457f5a44c71ed55215eEvgeniy StepanovNOINLINE void Arg2ExpectUMR(S4 a1, S4 a2) { EXPECT_POISONED(a2); } 29211929000ec2919192b3be457f5a44c71ed55215eEvgeniy StepanovNOINLINE void Arg3ExpectUMR(S1 a1, S4 a2, S8 a3) { EXPECT_POISONED(a3); } 2930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 2940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, ArgTest) { 2950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov Arg1ExpectUMR(*GetPoisoned<S4>()); 2960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov Arg2ExpectUMR(0, *GetPoisoned<S4>()); 2970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov Arg3ExpectUMR(0, 1, *GetPoisoned<S8>()); 2980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 2990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 3000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 3010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, CallAndRet) { 3020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov ReturnPoisoned<S1>(); 3030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov ReturnPoisoned<S2>(); 3040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov ReturnPoisoned<S4>(); 3050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov ReturnPoisoned<S8>(); 3060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 30711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(ReturnPoisoned<S1>()); 30811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(ReturnPoisoned<S2>()); 30911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(ReturnPoisoned<S4>()); 31011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(ReturnPoisoned<S8>()); 3110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 3120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 3130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// malloc() in the following test may be optimized to produce a compile-time 3140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// undef value. Check that we trap on the volatile assignment anyway. 3150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, DISABLED_MallocNoIdent) { 3160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov S4 *x = (int*)malloc(sizeof(S4)); 31711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*x); 3180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov free(x); 3190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 3200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 3210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Malloc) { 3220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov S4 *x = (int*)Ident(malloc(sizeof(S4))); 32311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*x); 3240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov free(x); 3250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 3260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 3270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Realloc) { 3280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov S4 *x = (int*)Ident(realloc(0, sizeof(S4))); 32911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(x[0]); 3300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov x[0] = 1; 3310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov x = (int*)Ident(realloc(x, 2 * sizeof(S4))); 33211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(x[0]); // Ok, was inited before. 33311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(x[1]); 3340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov x = (int*)Ident(realloc(x, 3 * sizeof(S4))); 33511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(x[0]); // Ok, was inited before. 33611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(x[2]); 33711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(x[1]); 3380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov x[2] = 1; // Init this here. Check that after realloc it is poisoned again. 3390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov x = (int*)Ident(realloc(x, 2 * sizeof(S4))); 34011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(x[0]); // Ok, was inited before. 34111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(x[1]); 3420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov x = (int*)Ident(realloc(x, 3 * sizeof(S4))); 34311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(x[1]); 34411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(x[2]); 3450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov free(x); 3460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 3470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 3480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Calloc) { 3490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov S4 *x = (int*)Ident(calloc(1, sizeof(S4))); 35011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(*x); // Should not be poisoned. 3512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_EQ(0, *x); 3520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov free(x); 3530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 3540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 3552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, CallocReturnsZeroMem) { 3562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines size_t sizes[] = {16, 1000, 10000, 100000, 2100000}; 3572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines for (size_t s = 0; s < sizeof(sizes)/sizeof(sizes[0]); s++) { 3582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines size_t size = sizes[s]; 3592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines for (size_t iter = 0; iter < 5; iter++) { 3602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char *x = Ident((char*)calloc(1, size)); 3612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_EQ(x[0], 0); 3622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_EQ(x[size - 1], 0); 3632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_EQ(x[size / 2], 0); 3642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_EQ(x[size / 3], 0); 3652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_EQ(x[size / 4], 0); 3662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines memset(x, 0x42, size); 3672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines free(Ident(x)); 3682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 3692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 3702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 3712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 3720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, AndOr) { 3730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov U4 *p = GetPoisoned<U4>(); 3740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov // We poison two bytes in the midle of a 4-byte word to make the test 3750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov // correct regardless of endianness. 3760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov ((U1*)p)[1] = 0; 3770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov ((U1*)p)[2] = 0xff; 37811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(*p & 0x00ffff00); 37911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(*p & 0x00ff0000); 38011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(*p & 0x0000ff00); 38111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*p & 0xff000000); 38211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*p & 0x000000ff); 38311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*p & 0x0000ffff); 38411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*p & 0xffff0000); 3850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 38611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(*p | 0xff0000ff); 38711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(*p | 0xff00ffff); 38811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(*p | 0xffff00ff); 38911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*p | 0xff000000); 39011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*p | 0x000000ff); 39111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*p | 0x0000ffff); 39211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*p | 0xffff0000); 3930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 39411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*GetPoisoned<bool>() & *GetPoisoned<bool>()); 3950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 3960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 3970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> 39811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovstatic bool applyNot(T value, T shadow) { 3990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __msan_partial_poison(&value, &shadow, sizeof(T)); 40011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov return !value; 4010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 4020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 4030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Not) { 40411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(applyNot<U4>(0x0, 0x0)); 40511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(applyNot<U4>(0xFFFFFFFF, 0x0)); 40611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(applyNot<U4>(0xFFFFFFFF, 0xFFFFFFFF)); 40711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(applyNot<U4>(0xFF000000, 0x0FFFFFFF)); 40811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(applyNot<U4>(0xFF000000, 0x00FFFFFF)); 40911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(applyNot<U4>(0xFF000000, 0x0000FFFF)); 41011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(applyNot<U4>(0xFF000000, 0x00000000)); 41111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(applyNot<U4>(0xFF000000, 0xFF000000)); 41211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(applyNot<U4>(0xFF800000, 0xFF000000)); 41311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(applyNot<U4>(0x00008000, 0x00008000)); 41411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov 41511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(applyNot<U1>(0x0, 0x0)); 41611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(applyNot<U1>(0xFF, 0xFE)); 41711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(applyNot<U1>(0xFF, 0x0)); 41811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(applyNot<U1>(0xFF, 0xFF)); 41911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov 42011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(applyNot<void*>((void*)0xFFFFFF, (void*)(-1))); 42111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(applyNot<void*>((void*)0xFFFFFF, (void*)(-2))); 4220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 4230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 4240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Shift) { 4250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov U4 *up = GetPoisoned<U4>(); 4260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov ((U1*)up)[0] = 0; 4270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov ((U1*)up)[3] = 0xff; 42811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(*up >> 30); 42911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(*up >> 24); 43011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*up >> 23); 43111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*up >> 10); 4320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 43311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(*up << 30); 43411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(*up << 24); 43511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*up << 23); 43611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*up << 10); 4370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 4380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov S4 *sp = (S4*)up; 43911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(*sp >> 30); 44011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(*sp >> 24); 44111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*sp >> 23); 44211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*sp >> 10); 4430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 4440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov sp = GetPoisoned<S4>(); 4450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov ((S1*)sp)[1] = 0; 4460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov ((S1*)sp)[2] = 0; 44711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*sp >> 31); 4480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 44911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(100 >> *GetPoisoned<S4>()); 45011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(100U >> *GetPoisoned<S4>()); 4510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 4520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 4530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE static int GetPoisonedZero() { 4540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int *zero = new int; 4550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov *zero = 0; 4560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __msan_poison(zero, sizeof(*zero)); 4570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int res = *zero; 4580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov delete zero; 4590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov return res; 4600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 4610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 4620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, LoadFromDirtyAddress) { 4630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int *a = new int; 4640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov *a = 0; 46512c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov EXPECT_UMR(break_optimization((void*)(U8)a[GetPoisonedZero()])); 4660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov delete a; 4670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 4680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 4690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, StoreToDirtyAddress) { 4700231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int *a = new int; 47111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_UMR(a[GetPoisonedZero()] = 0); 47212c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov break_optimization(a); 4730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov delete a; 4740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 4750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 4760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 4770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE void StackTestFunc() { 4780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov S4 p4; 4790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov S4 ok4 = 1; 4800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov S2 p2; 4810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov S2 ok2 = 1; 4820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov S1 p1; 4830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov S1 ok1 = 1; 48412c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov break_optimization(&p4); 48512c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov break_optimization(&ok4); 48612c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov break_optimization(&p2); 48712c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov break_optimization(&ok2); 48812c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov break_optimization(&p1); 48912c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov break_optimization(&ok1); 4900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 49111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(p4); 49211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(p2); 49311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(p1); 49411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(ok1); 49511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(ok2); 49611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(ok4); 4970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 4980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 4990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, StackTest) { 5000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov StackTestFunc(); 5010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 5020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 5030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE void StackStressFunc() { 5040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int foo[10000]; 50512c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov break_optimization(foo); 5060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 5070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 5080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, DISABLED_StackStressTest) { 5090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov for (int i = 0; i < 1000000; i++) 5100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov StackStressFunc(); 5110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 5120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 5130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> 5140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovvoid TestFloatingPoint() { 5150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov static volatile T v; 5160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov static T g[100]; 51712c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov break_optimization(&g); 5180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov T *x = GetPoisoned<T>(); 5190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov T *y = GetPoisoned<T>(1); 52011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*x); 52111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED((long long)*x); 52211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED((int)*x); 5230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov g[0] = *x; 5240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov g[1] = *x + *y; 5250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov g[2] = *x - *y; 5260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov g[3] = *x * *y; 5270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 5280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 5290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, FloatingPointTest) { 5300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov TestFloatingPoint<float>(); 5310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov TestFloatingPoint<double>(); 5320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 5330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 5340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, DynMem) { 5350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov S4 x = 0; 5360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov S4 *y = GetPoisoned<S4>(); 5370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov memcpy(y, &x, g_one * sizeof(S4)); 53811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(*y); 5390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 5400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 5410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic char *DynRetTestStr; 5420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 5430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, DynRet) { 5440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov ReturnPoisoned<S8>(); 54586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines EXPECT_NOT_POISONED(atoi("0")); 5460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 5470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 5480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, DynRet1) { 5490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov ReturnPoisoned<S8>(); 5500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 5510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 5520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct LargeStruct { 5530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov S4 x[10]; 5540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}; 5550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 5560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE 5570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovLargeStruct LargeRetTest() { 5580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov LargeStruct res; 5590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov res.x[0] = *GetPoisoned<S4>(); 5600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov res.x[1] = *GetPoisoned<S4>(); 5610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov res.x[2] = *GetPoisoned<S4>(); 5620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov res.x[3] = *GetPoisoned<S4>(); 5630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov res.x[4] = *GetPoisoned<S4>(); 5640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov res.x[5] = *GetPoisoned<S4>(); 5650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov res.x[6] = *GetPoisoned<S4>(); 5660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov res.x[7] = *GetPoisoned<S4>(); 5670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov res.x[8] = *GetPoisoned<S4>(); 5680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov res.x[9] = *GetPoisoned<S4>(); 5690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov return res; 5700231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 5710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 57267505a8a0cf9621243ed21b67dfa041224c78e4bAlexey SamsonovTEST(MemorySanitizer, strcmp) { 57367505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov char s1[10]; 57467505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov char s2[10]; 57567505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov strncpy(s1, "foo", 10); 57667505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov s2[0] = 'f'; 57767505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov s2[1] = 'n'; 57867505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov EXPECT_GT(strcmp(s1, s2), 0); 57967505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov s2[1] = 'o'; 58067505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov int res; 58167505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov EXPECT_UMR(res = strcmp(s1, s2)); 58267505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov EXPECT_NOT_POISONED(res); 58367505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov EXPECT_EQ(strncmp(s1, s2, 1), 0); 58467505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov} 58567505a8a0cf9621243ed21b67dfa041224c78e4bAlexey Samsonov 5860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, LargeRet) { 5870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov LargeStruct a = LargeRetTest(); 58811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(a.x[0]); 58911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(a.x[9]); 5900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 5910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 5921204979804868728edb6edfe3ae018465191a85cEvgeniy StepanovTEST(MemorySanitizer, strerror) { 5931204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov char *buf = strerror(EINVAL); 5941204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov EXPECT_NOT_POISONED(strlen(buf)); 5951204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov buf = strerror(123456); 5961204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov EXPECT_NOT_POISONED(strlen(buf)); 5971204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov} 5981204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov 5991204979804868728edb6edfe3ae018465191a85cEvgeniy StepanovTEST(MemorySanitizer, strerror_r) { 6001204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov errno = 0; 6011204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov char buf[1000]; 60286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines char *res = (char*) (size_t) strerror_r(EINVAL, buf, sizeof(buf)); 6031204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov ASSERT_EQ(0, errno); 6041204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov if (!res) res = buf; // POSIX version success. 6051204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov EXPECT_NOT_POISONED(strlen(res)); 6061204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov} 6071204979804868728edb6edfe3ae018465191a85cEvgeniy Stepanov 6080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, fread) { 6090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov char *x = new char[32]; 61086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines FILE *f = fopen(FILE_TO_READ, "r"); 6112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_TRUE(f != NULL); 6120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov fread(x, 1, 32, f); 61311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(x[0]); 61411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(x[16]); 61511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(x[31]); 6160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov fclose(f); 6176d1862363c88c183b0ed7740fca876342cf0474bStephen Hines delete[] x; 6180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 6190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 6200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, read) { 6210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov char *x = new char[32]; 62286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines int fd = open(FILE_TO_READ, O_RDONLY); 6232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_GT(fd, 0); 6240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int sz = read(fd, x, 32); 6252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(sz, 32); 62611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(x[0]); 62711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(x[16]); 62811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(x[31]); 6290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov close(fd); 6306d1862363c88c183b0ed7740fca876342cf0474bStephen Hines delete[] x; 6310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 6320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 6330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, pread) { 6340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov char *x = new char[32]; 63586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines int fd = open(FILE_TO_READ, O_RDONLY); 6362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_GT(fd, 0); 6370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int sz = pread(fd, x, 32, 0); 6382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(sz, 32); 63911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(x[0]); 64011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(x[16]); 64111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(x[31]); 6420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov close(fd); 6436d1862363c88c183b0ed7740fca876342cf0474bStephen Hines delete[] x; 6440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 6450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 646b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy StepanovTEST(MemorySanitizer, readv) { 647b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov char buf[2011]; 648b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov struct iovec iov[2]; 649b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov iov[0].iov_base = buf + 1; 650b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov iov[0].iov_len = 5; 651b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov iov[1].iov_base = buf + 10; 652b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov iov[1].iov_len = 2000; 65386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines int fd = open(FILE_TO_READ, O_RDONLY); 6542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_GT(fd, 0); 655b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov int sz = readv(fd, iov, 2); 6562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_GE(sz, 0); 65786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines ASSERT_LE(sz, 5 + 2000); 6582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_GT((size_t)sz, iov[0].iov_len); 659b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov EXPECT_POISONED(buf[0]); 660b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov EXPECT_NOT_POISONED(buf[1]); 661b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov EXPECT_NOT_POISONED(buf[5]); 662b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov EXPECT_POISONED(buf[6]); 663b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov EXPECT_POISONED(buf[9]); 664b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov EXPECT_NOT_POISONED(buf[10]); 665b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov EXPECT_NOT_POISONED(buf[10 + (sz - 1) - 5]); 666b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov EXPECT_POISONED(buf[11 + (sz - 1) - 5]); 667b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov close(fd); 668b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov} 669b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov 670b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy StepanovTEST(MemorySanitizer, preadv) { 671b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov char buf[2011]; 672b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov struct iovec iov[2]; 673b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov iov[0].iov_base = buf + 1; 674b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov iov[0].iov_len = 5; 675b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov iov[1].iov_base = buf + 10; 676b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov iov[1].iov_len = 2000; 67786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines int fd = open(FILE_TO_READ, O_RDONLY); 6782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_GT(fd, 0); 679b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov int sz = preadv(fd, iov, 2, 3); 6802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_GE(sz, 0); 68186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines ASSERT_LE(sz, 5 + 2000); 6822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_GT((size_t)sz, iov[0].iov_len); 683b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov EXPECT_POISONED(buf[0]); 684b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov EXPECT_NOT_POISONED(buf[1]); 685b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov EXPECT_NOT_POISONED(buf[5]); 686b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov EXPECT_POISONED(buf[6]); 687b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov EXPECT_POISONED(buf[9]); 688b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov EXPECT_NOT_POISONED(buf[10]); 689b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov EXPECT_NOT_POISONED(buf[10 + (sz - 1) - 5]); 690b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov EXPECT_POISONED(buf[11 + (sz - 1) - 5]); 691b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov close(fd); 692b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov} 693b916e6a9b3efa4907b70a2dcd418c76b044171e7Evgeniy Stepanov 6940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// FIXME: fails now. 6950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, DISABLED_ioctl) { 6960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov struct winsize ws; 6970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov EXPECT_EQ(ioctl(2, TIOCGWINSZ, &ws), 0); 69811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(ws.ws_col); 6990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 7000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 7010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, readlink) { 7020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov char *x = new char[1000]; 70386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines readlink(SYMLINK_TO_READ, x, 1000); 70411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(x[0]); 7050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov delete [] x; 7060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 7070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 7080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, stat) { 7090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov struct stat* st = new struct stat; 71086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines int res = stat(FILE_TO_READ, st); 7112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(0, res); 71211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(st->st_dev); 71311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(st->st_mode); 71411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(st->st_size); 7150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 7160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 717bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy StepanovTEST(MemorySanitizer, fstatat) { 718bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov struct stat* st = new struct stat; 71986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines int dirfd = open(DIR_TO_READ, O_RDONLY); 7202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_GT(dirfd, 0); 72186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines int res = fstatat(dirfd, SUBFILE_TO_READ, st, 0); 7222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(0, res); 723bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov EXPECT_NOT_POISONED(st->st_dev); 724bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov EXPECT_NOT_POISONED(st->st_mode); 725bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov EXPECT_NOT_POISONED(st->st_size); 726bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov close(dirfd); 727bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov} 728bb22942b91bf0855da4a9da132c77f325b187b84Evgeniy Stepanov 7290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, statfs) { 7305cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov struct statfs st; 7315cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov int res = statfs("/", &st); 7322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(0, res); 7335cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov EXPECT_NOT_POISONED(st.f_type); 7345cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov EXPECT_NOT_POISONED(st.f_bfree); 7355cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov EXPECT_NOT_POISONED(st.f_namelen); 7365cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov} 7375cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov 7385cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy StepanovTEST(MemorySanitizer, statvfs) { 7395cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov struct statvfs st; 7405cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov int res = statvfs("/", &st); 7412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(0, res); 7425cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov EXPECT_NOT_POISONED(st.f_bsize); 7435cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov EXPECT_NOT_POISONED(st.f_blocks); 7445cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov EXPECT_NOT_POISONED(st.f_bfree); 7455cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov EXPECT_NOT_POISONED(st.f_namemax); 7465cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov} 7475cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov 7485cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy StepanovTEST(MemorySanitizer, fstatvfs) { 7495cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov struct statvfs st; 7505cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov int fd = open("/", O_RDONLY | O_DIRECTORY); 7515cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov int res = fstatvfs(fd, &st); 7522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(0, res); 7535cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov EXPECT_NOT_POISONED(st.f_bsize); 7545cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov EXPECT_NOT_POISONED(st.f_blocks); 7555cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov EXPECT_NOT_POISONED(st.f_bfree); 7565cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov EXPECT_NOT_POISONED(st.f_namemax); 7575cee73e486aaa617a9627bb69a6447d3369b62ccEvgeniy Stepanov close(fd); 7580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 7590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 7600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, pipe) { 7610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int* pipefd = new int[2]; 7620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int res = pipe(pipefd); 7632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(0, res); 76411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(pipefd[0]); 76511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(pipefd[1]); 7660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov close(pipefd[0]); 7670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov close(pipefd[1]); 7680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 7690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 770134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy StepanovTEST(MemorySanitizer, pipe2) { 771134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov int* pipefd = new int[2]; 772134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov int res = pipe2(pipefd, O_NONBLOCK); 7732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(0, res); 774134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov EXPECT_NOT_POISONED(pipefd[0]); 775134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov EXPECT_NOT_POISONED(pipefd[1]); 776134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov close(pipefd[0]); 777134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov close(pipefd[1]); 778134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov} 779134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov 780134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy StepanovTEST(MemorySanitizer, socketpair) { 781134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov int sv[2]; 782134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov int res = socketpair(AF_UNIX, SOCK_STREAM, 0, sv); 7832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(0, res); 784134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov EXPECT_NOT_POISONED(sv[0]); 785134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov EXPECT_NOT_POISONED(sv[1]); 786134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov close(sv[0]); 787134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov close(sv[1]); 788134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov} 789134fe8ae5090d39aa2d37a5db5298e49467399c8Evgeniy Stepanov 790e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy StepanovTEST(MemorySanitizer, poll) { 791e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov int* pipefd = new int[2]; 792e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov int res = pipe(pipefd); 793e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov ASSERT_EQ(0, res); 794e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov 795e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov char data = 42; 796e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov res = write(pipefd[1], &data, 1); 797e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov ASSERT_EQ(1, res); 798e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov 799e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov pollfd fds[2]; 800e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov fds[0].fd = pipefd[0]; 801e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov fds[0].events = POLLIN; 802e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov fds[1].fd = pipefd[1]; 803e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov fds[1].events = POLLIN; 804e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov res = poll(fds, 2, 500); 805e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov ASSERT_EQ(1, res); 806e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov EXPECT_NOT_POISONED(fds[0].revents); 807e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov EXPECT_NOT_POISONED(fds[1].revents); 808e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov 809e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov close(pipefd[0]); 810e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov close(pipefd[1]); 811e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov} 812e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov 81386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There is no ppoll() on FreeBSD. 81486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined (__FreeBSD__) 81547177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy StepanovTEST(MemorySanitizer, ppoll) { 81647177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov int* pipefd = new int[2]; 81747177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov int res = pipe(pipefd); 81847177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov ASSERT_EQ(0, res); 81947177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov 82047177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov char data = 42; 82147177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov res = write(pipefd[1], &data, 1); 82247177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov ASSERT_EQ(1, res); 82347177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov 82447177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov pollfd fds[2]; 82547177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov fds[0].fd = pipefd[0]; 82647177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov fds[0].events = POLLIN; 82747177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov fds[1].fd = pipefd[1]; 82847177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov fds[1].events = POLLIN; 82947177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov sigset_t ss; 83047177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov sigemptyset(&ss); 83147177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov res = ppoll(fds, 2, NULL, &ss); 83247177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov ASSERT_EQ(1, res); 83347177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov EXPECT_NOT_POISONED(fds[0].revents); 83447177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov EXPECT_NOT_POISONED(fds[1].revents); 83547177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov 83647177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov close(pipefd[0]); 83747177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov close(pipefd[1]); 83847177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov} 83986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif 84047177efc15d2a75c7c85ba31aa61e41e7b47b5a3Evgeniy Stepanov 841e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy StepanovTEST(MemorySanitizer, poll_positive) { 842e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov int* pipefd = new int[2]; 843e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov int res = pipe(pipefd); 844e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov ASSERT_EQ(0, res); 845e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov 846e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov pollfd fds[2]; 847e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov fds[0].fd = pipefd[0]; 848e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov fds[0].events = POLLIN; 849e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov // fds[1].fd uninitialized 850e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov fds[1].events = POLLIN; 851e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov EXPECT_UMR(poll(fds, 2, 0)); 852e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov 853e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov close(pipefd[0]); 854e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov close(pipefd[1]); 855e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov} 856e18e3f07802c420eb4b2da407e148084b75cecc9Evgeniy Stepanov 8579f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy StepanovTEST(MemorySanitizer, bind_getsockname) { 8589f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov int sock = socket(AF_UNIX, SOCK_STREAM, 0); 8599f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov 8609f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov struct sockaddr_in sai; 8619f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov memset(&sai, 0, sizeof(sai)); 8629f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov sai.sin_family = AF_UNIX; 8639f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov int res = bind(sock, (struct sockaddr *)&sai, sizeof(sai)); 8649f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov 8652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(0, res); 8669f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov char buf[200]; 8679f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov socklen_t addrlen; 8689f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov EXPECT_UMR(getsockname(sock, (struct sockaddr *)&buf, &addrlen)); 8699f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov 8709f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov addrlen = sizeof(buf); 8719f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov res = getsockname(sock, (struct sockaddr *)&buf, &addrlen); 8729f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov EXPECT_NOT_POISONED(addrlen); 8739f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov EXPECT_NOT_POISONED(buf[0]); 8749f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov EXPECT_NOT_POISONED(buf[addrlen - 1]); 8759f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov EXPECT_POISONED(buf[addrlen]); 8769f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov close(sock); 8779f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov} 8789f58c5c60a56d9c39d36b5313dc87ad4bb713163Evgeniy Stepanov 8799d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy StepanovTEST(MemorySanitizer, accept) { 8809d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov int listen_socket = socket(AF_INET, SOCK_STREAM, 0); 8819d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov ASSERT_LT(0, listen_socket); 8829d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov 8839d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov struct sockaddr_in sai; 884ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov memset(&sai, 0, sizeof(sai)); 8859d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov sai.sin_family = AF_INET; 8869d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov sai.sin_port = 0; 8879d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov sai.sin_addr.s_addr = htonl(INADDR_LOOPBACK); 8889d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov int res = bind(listen_socket, (struct sockaddr *)&sai, sizeof(sai)); 8899d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov ASSERT_EQ(0, res); 8909d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov 8919d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov res = listen(listen_socket, 1); 8929d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov ASSERT_EQ(0, res); 8939d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov 8949d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov socklen_t sz = sizeof(sai); 8959d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov res = getsockname(listen_socket, (struct sockaddr *)&sai, &sz); 8969d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov ASSERT_EQ(0, res); 8979d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov ASSERT_EQ(sizeof(sai), sz); 898bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov 8999d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov int connect_socket = socket(AF_INET, SOCK_STREAM, 0); 9009d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov ASSERT_LT(0, connect_socket); 9019d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov res = fcntl(connect_socket, F_SETFL, O_NONBLOCK); 9029d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov ASSERT_EQ(0, res); 9039d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov res = connect(connect_socket, (struct sockaddr *)&sai, sizeof(sai)); 90486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines // On FreeBSD this connection completes immediately. 90586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines if (res != 0) { 90686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines ASSERT_EQ(-1, res); 90786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines ASSERT_EQ(EINPROGRESS, errno); 90886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines } 9099d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov 9109d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov __msan_poison(&sai, sizeof(sai)); 911bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov int new_sock = accept(listen_socket, (struct sockaddr *)&sai, &sz); 9129d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov ASSERT_LT(0, new_sock); 9139d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov ASSERT_EQ(sizeof(sai), sz); 9149d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov EXPECT_NOT_POISONED(sai); 9159d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov 916bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov __msan_poison(&sai, sizeof(sai)); 917bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov res = getpeername(new_sock, (struct sockaddr *)&sai, &sz); 918bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov ASSERT_EQ(0, res); 919bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov ASSERT_EQ(sizeof(sai), sz); 920bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov EXPECT_NOT_POISONED(sai); 921bc33e138d82759074f8333239f96506027731e20Evgeniy Stepanov 9229d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov close(new_sock); 9239d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov close(connect_socket); 9249d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov close(listen_socket); 9259d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov} 9269d1525ec52430d0b8ffd6d0893b7f5529105b321Evgeniy Stepanov 927512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy StepanovTEST(MemorySanitizer, getaddrinfo) { 928512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov struct addrinfo *ai; 929512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov struct addrinfo hints; 930512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov memset(&hints, 0, sizeof(hints)); 931512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov hints.ai_family = AF_INET; 932512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov int res = getaddrinfo("localhost", NULL, &hints, &ai); 933512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov ASSERT_EQ(0, res); 934512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov EXPECT_NOT_POISONED(*ai); 935512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov ASSERT_EQ(sizeof(sockaddr_in), ai->ai_addrlen); 936512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov EXPECT_NOT_POISONED(*(sockaddr_in*)ai->ai_addr); 937512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov} 938512c616cacf70ca029a2bf719a482b902f3687cdEvgeniy Stepanov 9399eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy StepanovTEST(MemorySanitizer, getnameinfo) { 9409eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov struct sockaddr_in sai; 941ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov memset(&sai, 0, sizeof(sai)); 9429eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov sai.sin_family = AF_INET; 9439eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov sai.sin_port = 80; 9449eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov sai.sin_addr.s_addr = htonl(INADDR_LOOPBACK); 9459eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov char host[500]; 9469eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov char serv[500]; 9479eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov int res = getnameinfo((struct sockaddr *)&sai, sizeof(sai), host, 9489eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov sizeof(host), serv, sizeof(serv), 0); 9499eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov ASSERT_EQ(0, res); 9509eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov EXPECT_NOT_POISONED(host[0]); 9519eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov EXPECT_POISONED(host[sizeof(host) - 1]); 9529eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov 9532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_NE(0U, strlen(host)); 9549eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov EXPECT_NOT_POISONED(serv[0]); 9559eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov EXPECT_POISONED(serv[sizeof(serv) - 1]); 9562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_NE(0U, strlen(serv)); 9579eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov} 9589eedf489075c24b2b1ed9f88bf5102066fffdeb1Evgeniy Stepanov 9590a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov#define EXPECT_HOSTENT_NOT_POISONED(he) \ 9600a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov do { \ 9610a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov EXPECT_NOT_POISONED(*(he)); \ 9620a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov ASSERT_NE((void *) 0, (he)->h_name); \ 9630a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov ASSERT_NE((void *) 0, (he)->h_aliases); \ 9640a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov ASSERT_NE((void *) 0, (he)->h_addr_list); \ 9650a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov EXPECT_NOT_POISONED(strlen((he)->h_name)); \ 9660a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov char **p = (he)->h_aliases; \ 9670a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov while (*p) { \ 9680a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov EXPECT_NOT_POISONED(strlen(*p)); \ 9690a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov ++p; \ 9700a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov } \ 9710a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov char **q = (he)->h_addr_list; \ 9720a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov while (*q) { \ 9730a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov EXPECT_NOT_POISONED(*q[0]); \ 9740a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov ++q; \ 9750a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov } \ 9760a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov EXPECT_NOT_POISONED(*q); \ 9770a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov } while (0) 9780a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov 9790a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovTEST(MemorySanitizer, gethostent) { 9800a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov struct hostent *he = gethostent(); 9810a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov ASSERT_NE((void *)NULL, he); 9820a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov EXPECT_HOSTENT_NOT_POISONED(he); 9830a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov} 9840a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov 985263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov#ifndef MSAN_TEST_DISABLE_GETHOSTBYNAME 986263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov 9870a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovTEST(MemorySanitizer, gethostbyname) { 9880a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov struct hostent *he = gethostbyname("localhost"); 9890a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov ASSERT_NE((void *)NULL, he); 9900a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov EXPECT_HOSTENT_NOT_POISONED(he); 9910a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov} 9920a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov 993263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov#endif // MSAN_TEST_DISABLE_GETHOSTBYNAME 994263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov 995ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy StepanovTEST(MemorySanitizer, recvmsg) { 996ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov int server_socket = socket(AF_INET, SOCK_DGRAM, 0); 997ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov ASSERT_LT(0, server_socket); 998ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov 999ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov struct sockaddr_in sai; 1000ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov memset(&sai, 0, sizeof(sai)); 1001ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov sai.sin_family = AF_INET; 1002ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov sai.sin_port = 0; 1003ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov sai.sin_addr.s_addr = htonl(INADDR_LOOPBACK); 1004ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov int res = bind(server_socket, (struct sockaddr *)&sai, sizeof(sai)); 1005ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov ASSERT_EQ(0, res); 1006ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov 1007ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov socklen_t sz = sizeof(sai); 1008ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov res = getsockname(server_socket, (struct sockaddr *)&sai, &sz); 1009ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov ASSERT_EQ(0, res); 1010ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov ASSERT_EQ(sizeof(sai), sz); 1011ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov 1012ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov 1013ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov int client_socket = socket(AF_INET, SOCK_DGRAM, 0); 1014ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov ASSERT_LT(0, client_socket); 1015ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov 1016ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov struct sockaddr_in client_sai; 1017ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov memset(&client_sai, 0, sizeof(client_sai)); 1018ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov client_sai.sin_family = AF_INET; 1019ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov client_sai.sin_port = 0; 1020ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov client_sai.sin_addr.s_addr = htonl(INADDR_LOOPBACK); 1021ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov res = bind(client_socket, (struct sockaddr *)&client_sai, sizeof(client_sai)); 1022ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov ASSERT_EQ(0, res); 1023ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov 1024ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov sz = sizeof(client_sai); 1025ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov res = getsockname(client_socket, (struct sockaddr *)&client_sai, &sz); 1026ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov ASSERT_EQ(0, res); 1027ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov ASSERT_EQ(sizeof(client_sai), sz); 1028ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov 1029ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov const char *s = "message text"; 1030ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov struct iovec iov; 1031ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov iov.iov_base = (void *)s; 1032ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov iov.iov_len = strlen(s) + 1; 1033ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov struct msghdr msg; 1034ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov memset(&msg, 0, sizeof(msg)); 1035ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov msg.msg_name = &sai; 1036ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov msg.msg_namelen = sizeof(sai); 1037ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov msg.msg_iov = &iov; 1038ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov msg.msg_iovlen = 1; 1039ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov res = sendmsg(client_socket, &msg, 0); 1040ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov ASSERT_LT(0, res); 1041ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov 1042ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov 1043ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov char buf[1000]; 1044ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov struct iovec recv_iov; 1045ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov recv_iov.iov_base = (void *)&buf; 1046ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov recv_iov.iov_len = sizeof(buf); 1047ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov struct sockaddr_in recv_sai; 1048ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov struct msghdr recv_msg; 1049ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov memset(&recv_msg, 0, sizeof(recv_msg)); 1050ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov recv_msg.msg_name = &recv_sai; 1051ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov recv_msg.msg_namelen = sizeof(recv_sai); 1052ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov recv_msg.msg_iov = &recv_iov; 1053ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov recv_msg.msg_iovlen = 1; 1054ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov res = recvmsg(server_socket, &recv_msg, 0); 1055ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov ASSERT_LT(0, res); 1056ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov 1057ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov ASSERT_EQ(sizeof(recv_sai), recv_msg.msg_namelen); 1058ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov EXPECT_NOT_POISONED(*(struct sockaddr_in *)recv_msg.msg_name); 1059ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov EXPECT_STREQ(s, buf); 1060ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov 1061ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov close(server_socket); 1062ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov close(client_socket); 1063ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov} 1064ab8bf09f11d76af6bf9bf6b573f36cb29aa3e557Evgeniy Stepanov 10650a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovTEST(MemorySanitizer, gethostbyname2) { 10660a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov struct hostent *he = gethostbyname2("localhost", AF_INET); 10670a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov ASSERT_NE((void *)NULL, he); 10680a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov EXPECT_HOSTENT_NOT_POISONED(he); 10690a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov} 10700a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov 10710a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovTEST(MemorySanitizer, gethostbyaddr) { 10720a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov in_addr_t addr = inet_addr("127.0.0.1"); 10730a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov EXPECT_NOT_POISONED(addr); 10740a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov struct hostent *he = gethostbyaddr(&addr, sizeof(addr), AF_INET); 10750a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov ASSERT_NE((void *)NULL, he); 10760a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov EXPECT_HOSTENT_NOT_POISONED(he); 10770a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov} 10780a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov 10790a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovTEST(MemorySanitizer, gethostent_r) { 10800a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov char buf[2000]; 10810a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov struct hostent he; 10820a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov struct hostent *result; 10830a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov int err; 10840a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov int res = gethostent_r(&he, buf, sizeof(buf), &result, &err); 10850a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov ASSERT_EQ(0, res); 10860a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov EXPECT_NOT_POISONED(result); 10870a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov ASSERT_NE((void *)NULL, result); 10880a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov EXPECT_HOSTENT_NOT_POISONED(result); 10890a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov EXPECT_NOT_POISONED(err); 10900a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov} 10910a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov 10920a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovTEST(MemorySanitizer, gethostbyname_r) { 10930a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov char buf[2000]; 10940a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov struct hostent he; 10950a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov struct hostent *result; 10960a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov int err; 10970a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov int res = gethostbyname_r("localhost", &he, buf, sizeof(buf), &result, &err); 10980a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov ASSERT_EQ(0, res); 10990a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov EXPECT_NOT_POISONED(result); 11000a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov ASSERT_NE((void *)NULL, result); 11010a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov EXPECT_HOSTENT_NOT_POISONED(result); 11020a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov EXPECT_NOT_POISONED(err); 11030a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov} 11040a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov 11052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, gethostbyname_r_bad_host_name) { 11062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char buf[2000]; 11072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct hostent he; 11082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct hostent *result; 11092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int err; 11102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int res = gethostbyname_r("bad-host-name", &he, buf, sizeof(buf), &result, &err); 11112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ((struct hostent *)0, result); 11122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(err); 11132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 11142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 11152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, gethostbyname_r_erange) { 11162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char buf[5]; 11172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct hostent he; 11182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct hostent *result; 11192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int err; 11202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int res = gethostbyname_r("localhost", &he, buf, sizeof(buf), &result, &err); 11212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(ERANGE, res); 11222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(err); 11232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 11242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 11250a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovTEST(MemorySanitizer, gethostbyname2_r) { 11260a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov char buf[2000]; 11270a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov struct hostent he; 11280a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov struct hostent *result; 11290a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov int err; 11300a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov int res = gethostbyname2_r("localhost", AF_INET, &he, buf, sizeof(buf), 11310a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov &result, &err); 11320a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov ASSERT_EQ(0, res); 11330a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov EXPECT_NOT_POISONED(result); 11340a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov ASSERT_NE((void *)NULL, result); 11350a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov EXPECT_HOSTENT_NOT_POISONED(result); 11360a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov EXPECT_NOT_POISONED(err); 11370a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov} 11380a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov 11390a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy StepanovTEST(MemorySanitizer, gethostbyaddr_r) { 11400a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov char buf[2000]; 11410a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov struct hostent he; 11420a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov struct hostent *result; 11430a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov int err; 11440a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov in_addr_t addr = inet_addr("127.0.0.1"); 11450a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov EXPECT_NOT_POISONED(addr); 11460a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov int res = gethostbyaddr_r(&addr, sizeof(addr), AF_INET, &he, buf, sizeof(buf), 11470a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov &result, &err); 11480a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov ASSERT_EQ(0, res); 11490a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov EXPECT_NOT_POISONED(result); 11500a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov ASSERT_NE((void *)NULL, result); 11510a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov EXPECT_HOSTENT_NOT_POISONED(result); 11520a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov EXPECT_NOT_POISONED(err); 11530a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov} 11540a2cc37712a452525f9f03b3bf67b1f0a97c8d3aEvgeniy Stepanov 1155f32be42523a199674ea665a499db131591e64e08Evgeniy StepanovTEST(MemorySanitizer, getsockopt) { 1156f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov int sock = socket(AF_UNIX, SOCK_STREAM, 0); 1157f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov struct linger l[2]; 1158f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov socklen_t sz = sizeof(l[0]); 1159f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov int res = getsockopt(sock, SOL_SOCKET, SO_LINGER, &l[0], &sz); 1160f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov ASSERT_EQ(0, res); 1161f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov ASSERT_EQ(sizeof(l[0]), sz); 1162f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov EXPECT_NOT_POISONED(l[0]); 1163f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov EXPECT_POISONED(*(char *)(l + 1)); 1164f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov} 1165f32be42523a199674ea665a499db131591e64e08Evgeniy Stepanov 11660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, getcwd) { 11670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov char path[PATH_MAX + 1]; 11680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov char* res = getcwd(path, sizeof(path)); 11692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_TRUE(res != NULL); 117011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(path[0]); 11710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 11720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 11737eed04c4dce69ad1e485edbf6dd963e176b52e0dEvgeniy StepanovTEST(MemorySanitizer, getcwd_gnu) { 11747eed04c4dce69ad1e485edbf6dd963e176b52e0dEvgeniy Stepanov char* res = getcwd(NULL, 0); 11752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_TRUE(res != NULL); 11767eed04c4dce69ad1e485edbf6dd963e176b52e0dEvgeniy Stepanov EXPECT_NOT_POISONED(res[0]); 11777eed04c4dce69ad1e485edbf6dd963e176b52e0dEvgeniy Stepanov free(res); 11787eed04c4dce69ad1e485edbf6dd963e176b52e0dEvgeniy Stepanov} 11797eed04c4dce69ad1e485edbf6dd963e176b52e0dEvgeniy Stepanov 118086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no get_current_dir_name() on FreeBSD. 118186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__) 1182801448950d645813efb398575bbc62b48e5b1dfcEvgeniy StepanovTEST(MemorySanitizer, get_current_dir_name) { 1183801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov char* res = get_current_dir_name(); 11842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_TRUE(res != NULL); 1185801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov EXPECT_NOT_POISONED(res[0]); 1186801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov free(res); 1187801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov} 118886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif 1189801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov 119010362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy StepanovTEST(MemorySanitizer, shmctl) { 119110362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov int id = shmget(IPC_PRIVATE, 4096, 0644 | IPC_CREAT); 119210362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov ASSERT_GT(id, -1); 119310362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov 119410362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov struct shmid_ds ds; 119510362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov int res = shmctl(id, IPC_STAT, &ds); 119610362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov ASSERT_GT(res, -1); 119710362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov EXPECT_NOT_POISONED(ds); 119810362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov 119986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines // FreeBSD does not support shmctl(IPC_INFO) and shmctl(SHM_INFO). 120086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__) 120110362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov struct shminfo si; 120210362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov res = shmctl(id, IPC_INFO, (struct shmid_ds *)&si); 120310362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov ASSERT_GT(res, -1); 120410362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov EXPECT_NOT_POISONED(si); 120510362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov 120610362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov struct shm_info s_i; 120710362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov res = shmctl(id, SHM_INFO, (struct shmid_ds *)&s_i); 120810362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov ASSERT_GT(res, -1); 120910362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov EXPECT_NOT_POISONED(s_i); 121086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif 121110362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov 121210362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov res = shmctl(id, IPC_RMID, 0); 121310362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov ASSERT_GT(res, -1); 121410362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov} 121510362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov 1216f3603890015c130420def39d67a02c2fdafc6f84Evgeniy StepanovTEST(MemorySanitizer, shmat) { 1217f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov void *p = mmap(NULL, 4096, PROT_READ | PROT_WRITE, 121886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); 1219f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov ASSERT_NE(MAP_FAILED, p); 1220f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov 1221f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov ((char *)p)[10] = *GetPoisoned<U1>(); 1222f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov ((char *)p)[4095] = *GetPoisoned<U1>(); 1223f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov 1224f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov int res = munmap(p, 4096); 1225f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov ASSERT_EQ(0, res); 1226f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov 1227f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov int id = shmget(IPC_PRIVATE, 4096, 0644 | IPC_CREAT); 1228f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov ASSERT_GT(id, -1); 1229f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov 1230f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov void *q = shmat(id, p, 0); 1231f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov ASSERT_EQ(p, q); 1232f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov 1233f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov EXPECT_NOT_POISONED(((char *)q)[0]); 1234f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov EXPECT_NOT_POISONED(((char *)q)[10]); 1235f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov EXPECT_NOT_POISONED(((char *)q)[4095]); 1236f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov 1237f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov res = shmdt(q); 1238f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov ASSERT_EQ(0, res); 1239f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov 1240f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov res = shmctl(id, IPC_RMID, 0); 1241f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov ASSERT_GT(res, -1); 1242f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov} 1243f3603890015c130420def39d67a02c2fdafc6f84Evgeniy Stepanov 124486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no random_r() on FreeBSD. 124586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__) 1246aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy StepanovTEST(MemorySanitizer, random_r) { 1247aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov int32_t x; 1248aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov char z[64]; 1249e46ecb155b22c8ea37235ebe317e0de1edf6b001Evgeniy Stepanov memset(z, 0, sizeof(z)); 1250e46ecb155b22c8ea37235ebe317e0de1edf6b001Evgeniy Stepanov 1251aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov struct random_data buf; 1252e46ecb155b22c8ea37235ebe317e0de1edf6b001Evgeniy Stepanov memset(&buf, 0, sizeof(buf)); 1253aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov 1254aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov int res = initstate_r(0, z, sizeof(z), &buf); 1255aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov ASSERT_EQ(0, res); 1256aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov 1257aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov res = random_r(&buf, &x); 1258aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov ASSERT_EQ(0, res); 1259aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov EXPECT_NOT_POISONED(x); 1260aff25aa02098a510eff6eda1a3ec823e5b1fe1aaEvgeniy Stepanov} 126186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif 126210362d66fffcd99bd5ced983e4b389dfeba114d0Evgeniy Stepanov 12635ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy StepanovTEST(MemorySanitizer, confstr) { 12645ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov char buf[3]; 12655ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov size_t res = confstr(_CS_PATH, buf, sizeof(buf)); 12665ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov ASSERT_GT(res, sizeof(buf)); 12675ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov EXPECT_NOT_POISONED(buf[0]); 12685ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov EXPECT_NOT_POISONED(buf[sizeof(buf) - 1]); 12695ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov 12705ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov char buf2[1000]; 12715ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov res = confstr(_CS_PATH, buf2, sizeof(buf2)); 12725ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov ASSERT_LT(res, sizeof(buf2)); 12735ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov EXPECT_NOT_POISONED(buf2[0]); 12745ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov EXPECT_NOT_POISONED(buf2[res - 1]); 12755ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov EXPECT_POISONED(buf2[res]); 12765ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov ASSERT_EQ(res, strlen(buf2) + 1); 12775ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov} 12785ec19bc74b52fd962f079086c2fa615d6d3f0864Evgeniy Stepanov 127986277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST(MemorySanitizer, opendir) { 128086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines DIR *dir = opendir("."); 128186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines closedir(dir); 128286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines 128386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines char name[10] = "."; 128486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines __msan_poison(name, sizeof(name)); 128586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines EXPECT_UMR(dir = opendir(name)); 128686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines closedir(dir); 128786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines} 128886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines 1289d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy StepanovTEST(MemorySanitizer, readdir) { 1290d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov DIR *dir = opendir("."); 1291d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov struct dirent *d = readdir(dir); 12922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_TRUE(d != NULL); 1293d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov EXPECT_NOT_POISONED(d->d_name[0]); 1294d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov closedir(dir); 1295d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov} 1296d97a15a931ae6696a1071e1471c9a019e821904bEvgeniy Stepanov 1297b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy StepanovTEST(MemorySanitizer, readdir_r) { 1298b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov DIR *dir = opendir("."); 1299b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov struct dirent d; 1300b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov struct dirent *pd; 1301b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov int res = readdir_r(dir, &d, &pd); 13022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(0, res); 1303b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov EXPECT_NOT_POISONED(pd); 1304b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov EXPECT_NOT_POISONED(d.d_name[0]); 1305b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov closedir(dir); 1306b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov} 1307b5cf98f76fd62236f2945bff17b3cdb4e8a5c2f4Evgeniy Stepanov 13080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, realpath) { 13090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov const char* relpath = "."; 13100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov char path[PATH_MAX + 1]; 13110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov char* res = realpath(relpath, path); 13122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_TRUE(res != NULL); 131311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(path[0]); 13140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 13150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 131612eb79dd701d9d40551759330a9257316601373bEvgeniy StepanovTEST(MemorySanitizer, realpath_null) { 131712eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov const char* relpath = "."; 131812eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov char* res = realpath(relpath, NULL); 131912eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov printf("%d, %s\n", errno, strerror(errno)); 13202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_TRUE(res != NULL); 132112eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov EXPECT_NOT_POISONED(res[0]); 132212eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov free(res); 132312eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov} 132412eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov 132586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no canonicalize_file_name() on FreeBSD. 132686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__) 132712eb79dd701d9d40551759330a9257316601373bEvgeniy StepanovTEST(MemorySanitizer, canonicalize_file_name) { 132812eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov const char* relpath = "."; 132912eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov char* res = canonicalize_file_name(relpath); 13302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_TRUE(res != NULL); 133112eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov EXPECT_NOT_POISONED(res[0]); 133212eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov free(res); 1333534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov} 133486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif 1335534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov 1336534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanovextern char **environ; 1337534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov 1338534e2ba5188e1a74b340f9507755806357835f62Evgeniy StepanovTEST(MemorySanitizer, setenv) { 1339534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov setenv("AAA", "BBB", 1); 1340534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov for (char **envp = environ; *envp; ++envp) { 1341534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov EXPECT_NOT_POISONED(*envp); 1342534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov EXPECT_NOT_POISONED(*envp[0]); 1343534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov } 1344534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov} 1345534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov 1346534e2ba5188e1a74b340f9507755806357835f62Evgeniy StepanovTEST(MemorySanitizer, putenv) { 1347534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov char s[] = "AAA=BBB"; 1348534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov putenv(s); 1349534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov for (char **envp = environ; *envp; ++envp) { 1350534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov EXPECT_NOT_POISONED(*envp); 1351534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov EXPECT_NOT_POISONED(*envp[0]); 1352534e2ba5188e1a74b340f9507755806357835f62Evgeniy Stepanov } 135312eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov} 135412eb79dd701d9d40551759330a9257316601373bEvgeniy Stepanov 13550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, memcpy) { 13560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov char* x = new char[2]; 13570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov char* y = new char[2]; 13580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov x[0] = 1; 13590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov x[1] = *GetPoisoned<char>(); 13600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov memcpy(y, x, 2); 136111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(y[0]); 136211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(y[1]); 13630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 13640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 13656a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hinesvoid TestUnalignedMemcpy(unsigned left, unsigned right, bool src_is_aligned, 13666a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines bool src_is_poisoned, bool dst_is_poisoned) { 13676a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines fprintf(stderr, "%s(%d, %d, %d, %d, %d)\n", __func__, left, right, 13686a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines src_is_aligned, src_is_poisoned, dst_is_poisoned); 13696a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 13706a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines const unsigned sz = 20; 13716a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines U4 dst_origin, src_origin; 1372450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov char *dst = (char *)malloc(sz); 13736a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines if (dst_is_poisoned) 13746a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines dst_origin = __msan_get_origin(dst); 13756a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines else 13766a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines memset(dst, 0, sz); 1377450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov 1378450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov char *src = (char *)malloc(sz); 13796a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines if (src_is_poisoned) 13806a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines src_origin = __msan_get_origin(src); 13816a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines else 13826a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines memset(src, 0, sz); 1383450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov 1384450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov memcpy(dst + left, src_is_aligned ? src + left : src, sz - left - right); 13856a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 13866a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines for (unsigned i = 0; i < (left & (~3U)); ++i) 13876a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines if (dst_is_poisoned) 13886a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_POISONED_O(dst[i], dst_origin); 13896a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines else 13906a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_NOT_POISONED(dst[i]); 13916a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 13926a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines for (unsigned i = 0; i < (right & (~3U)); ++i) 13936a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines if (dst_is_poisoned) 13946a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_POISONED_O(dst[sz - i - 1], dst_origin); 13956a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines else 13966a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_NOT_POISONED(dst[sz - i - 1]); 13976a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 13986a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines for (unsigned i = left; i < sz - right; ++i) 13996a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines if (src_is_poisoned) 14006a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_POISONED_O(dst[i], src_origin); 14016a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines else 14026a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_NOT_POISONED(dst[i]); 1403450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov 1404450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov free(dst); 1405450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov free(src); 1406450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov} 1407450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov 1408450eee655289a622ab9acf87d863f38991b184c9Evgeniy StepanovTEST(MemorySanitizer, memcpy_unaligned) { 14096a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines for (int i = 0; i < 10; ++i) 14106a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines for (int j = 0; j < 10; ++j) 14116a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines for (int aligned = 0; aligned < 2; ++aligned) 14126a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines for (int srcp = 0; srcp < 2; ++srcp) 14136a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines for (int dstp = 0; dstp < 2; ++dstp) 14146a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines TestUnalignedMemcpy(i, j, aligned, srcp, dstp); 1415450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov} 1416450eee655289a622ab9acf87d863f38991b184c9Evgeniy Stepanov 14170231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, memmove) { 14180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov char* x = new char[2]; 14190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov char* y = new char[2]; 14200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov x[0] = 1; 14210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov x[1] = *GetPoisoned<char>(); 14220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov memmove(y, x, 2); 142311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(y[0]); 142411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(y[1]); 14250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 14260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 14275492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy StepanovTEST(MemorySanitizer, memccpy_nomatch) { 14285492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov char* x = new char[5]; 14295492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov char* y = new char[5]; 14305492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov strcpy(x, "abc"); 14315492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov memccpy(y, x, 'd', 4); 14325492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov EXPECT_NOT_POISONED(y[0]); 14335492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov EXPECT_NOT_POISONED(y[1]); 14345492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov EXPECT_NOT_POISONED(y[2]); 14355492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov EXPECT_NOT_POISONED(y[3]); 14365492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov EXPECT_POISONED(y[4]); 14375492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov delete[] x; 14385492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov delete[] y; 14395492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov} 14405492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov 14415492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy StepanovTEST(MemorySanitizer, memccpy_match) { 14425492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov char* x = new char[5]; 14435492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov char* y = new char[5]; 14445492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov strcpy(x, "abc"); 14455492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov memccpy(y, x, 'b', 4); 14465492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov EXPECT_NOT_POISONED(y[0]); 14475492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov EXPECT_NOT_POISONED(y[1]); 14485492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov EXPECT_POISONED(y[2]); 14495492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov EXPECT_POISONED(y[3]); 14505492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov EXPECT_POISONED(y[4]); 14515492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov delete[] x; 14525492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov delete[] y; 14535492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov} 14545492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov 14555492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy StepanovTEST(MemorySanitizer, memccpy_nomatch_positive) { 14565492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov char* x = new char[5]; 14575492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov char* y = new char[5]; 14585492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov strcpy(x, "abc"); 14595492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov EXPECT_UMR(memccpy(y, x, 'd', 5)); 14605492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov delete[] x; 14615492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov delete[] y; 14625492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov} 14635492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov 14645492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy StepanovTEST(MemorySanitizer, memccpy_match_positive) { 14655492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov char* x = new char[5]; 14665492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov char* y = new char[5]; 14675492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov x[0] = 'a'; 14685492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov x[2] = 'b'; 14695492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov EXPECT_UMR(memccpy(y, x, 'b', 5)); 14705492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov delete[] x; 14715492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov delete[] y; 14725492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov} 14735492ff9a1730b6b7a6d7ab70a14e60be1f44b0c9Evgeniy Stepanov 1474ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy StepanovTEST(MemorySanitizer, bcopy) { 1475ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov char* x = new char[2]; 1476ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov char* y = new char[2]; 1477ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov x[0] = 1; 1478ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov x[1] = *GetPoisoned<char>(); 1479ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov bcopy(x, y, 2); 1480ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov EXPECT_NOT_POISONED(y[0]); 1481ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov EXPECT_POISONED(y[1]); 1482ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov} 1483ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov 14840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, strdup) { 14858aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov char buf[4] = "abc"; 14868aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov __msan_poison(buf + 2, sizeof(*buf)); 14878aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov char *x = strdup(buf); 14888aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov EXPECT_NOT_POISONED(x[0]); 14898aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov EXPECT_NOT_POISONED(x[1]); 14908aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov EXPECT_POISONED(x[2]); 14918aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov EXPECT_NOT_POISONED(x[3]); 14928aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov free(x); 14938aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov} 14948aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov 14958aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy StepanovTEST(MemorySanitizer, strndup) { 14968aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov char buf[4] = "abc"; 14978aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov __msan_poison(buf + 2, sizeof(*buf)); 14988aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov char *x = strndup(buf, 3); 14998aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov EXPECT_NOT_POISONED(x[0]); 15008aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov EXPECT_NOT_POISONED(x[1]); 15018aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov EXPECT_POISONED(x[2]); 15028aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov EXPECT_NOT_POISONED(x[3]); 15030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov free(x); 15040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 15050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 15068aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy StepanovTEST(MemorySanitizer, strndup_short) { 15078aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov char buf[4] = "abc"; 15088aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov __msan_poison(buf + 1, sizeof(*buf)); 15098aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov __msan_poison(buf + 2, sizeof(*buf)); 15108aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov char *x = strndup(buf, 2); 15118aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov EXPECT_NOT_POISONED(x[0]); 15128aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov EXPECT_POISONED(x[1]); 15131d21bd159c3830dd7a6c05854408442d91a336adEvgeniy Stepanov EXPECT_NOT_POISONED(x[2]); 15148aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov free(x); 15158aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov} 15168aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov 15178aa1ae03e339ee9365c05dcf831f59b3a817bd84Evgeniy Stepanov 15180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T, int size> 15190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovvoid TestOverlapMemmove() { 15200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov T *x = new T[size]; 15212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_GE(size, 3); 15220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov x[2] = 0; 15230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov memmove(x, x + 1, (size - 1) * sizeof(T)); 152411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(x[1]); 15256d1862363c88c183b0ed7740fca876342cf0474bStephen Hines EXPECT_POISONED(x[0]); 15266d1862363c88c183b0ed7740fca876342cf0474bStephen Hines EXPECT_POISONED(x[2]); 15270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov delete [] x; 15280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 15290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 15300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, overlap_memmove) { 15310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov TestOverlapMemmove<U1, 10>(); 15320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov TestOverlapMemmove<U1, 1000>(); 15330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov TestOverlapMemmove<U8, 4>(); 15340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov TestOverlapMemmove<U8, 1000>(); 15350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 15360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 15370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, strcpy) { // NOLINT 15380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov char* x = new char[3]; 15390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov char* y = new char[3]; 15400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov x[0] = 'a'; 15410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov x[1] = *GetPoisoned<char>(1, 1); 15420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov x[2] = 0; 15430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov strcpy(y, x); // NOLINT 154411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(y[0]); 154511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(y[1]); 154611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(y[2]); 15470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 15480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 15490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, strncpy) { // NOLINT 15500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov char* x = new char[3]; 15516d1862363c88c183b0ed7740fca876342cf0474bStephen Hines char* y = new char[5]; 15520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov x[0] = 'a'; 15530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov x[1] = *GetPoisoned<char>(1, 1); 15546d1862363c88c183b0ed7740fca876342cf0474bStephen Hines x[2] = '\0'; 15556d1862363c88c183b0ed7740fca876342cf0474bStephen Hines strncpy(y, x, 4); // NOLINT 155611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(y[0]); 155711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(y[1]); 15586d1862363c88c183b0ed7740fca876342cf0474bStephen Hines EXPECT_NOT_POISONED(y[2]); 15596d1862363c88c183b0ed7740fca876342cf0474bStephen Hines EXPECT_NOT_POISONED(y[3]); 15606d1862363c88c183b0ed7740fca876342cf0474bStephen Hines EXPECT_POISONED(y[4]); 15610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 15620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 15634bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy StepanovTEST(MemorySanitizer, stpcpy) { // NOLINT 15644bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov char* x = new char[3]; 15654bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov char* y = new char[3]; 15664bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov x[0] = 'a'; 15674bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov x[1] = *GetPoisoned<char>(1, 1); 15684bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov x[2] = 0; 15694bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov char *res = stpcpy(y, x); // NOLINT 15704bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov ASSERT_EQ(res, y + 2); 15714bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov EXPECT_NOT_POISONED(y[0]); 15724bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov EXPECT_POISONED(y[1]); 15734bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov EXPECT_NOT_POISONED(y[2]); 15744bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov} 15754bbbe136fe6a19a8288a6d92af29075756dd8fa5Evgeniy Stepanov 15762d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, strcat) { // NOLINT 15772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char a[10]; 15782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char b[] = "def"; 15792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines strcpy(a, "abc"); 15802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_poison(b + 1, 1); 15812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines strcat(a, b); 15822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(a[3]); 15832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(a[4]); 15842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(a[5]); 15852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(a[6]); 15862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(a[7]); 15872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 15882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 15892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, strncat) { // NOLINT 15902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char a[10]; 15912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char b[] = "def"; 15922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines strcpy(a, "abc"); 15932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_poison(b + 1, 1); 15942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines strncat(a, b, 5); 15952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(a[3]); 15962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(a[4]); 15972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(a[5]); 15982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(a[6]); 15992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(a[7]); 16002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 16012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 16022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, strncat_overflow) { // NOLINT 16032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char a[10]; 16042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char b[] = "def"; 16052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines strcpy(a, "abc"); 16062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_poison(b + 1, 1); 16072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines strncat(a, b, 2); 16082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(a[3]); 16092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(a[4]); 16102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(a[5]); 16112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(a[6]); 16122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(a[7]); 16132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 16142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 161586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#define TEST_STRTO_INT(func_name, char_type, str_prefix) \ 161686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines TEST(MemorySanitizer, func_name) { \ 161786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines char_type *e; \ 161886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines EXPECT_EQ(1U, func_name(str_prefix##"1", &e, 10)); \ 161986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines EXPECT_NOT_POISONED((S8)e); \ 16202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 16210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 162286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#define TEST_STRTO_FLOAT(func_name, char_type, str_prefix) \ 162386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines TEST(MemorySanitizer, func_name) { \ 162486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines char_type *e; \ 162586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines EXPECT_NE(0, func_name(str_prefix##"1.5", &e)); \ 162686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines EXPECT_NOT_POISONED((S8)e); \ 16272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 16280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 162986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#define TEST_STRTO_FLOAT_LOC(func_name, char_type, str_prefix) \ 16302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines TEST(MemorySanitizer, func_name) { \ 16312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines locale_t loc = newlocale(LC_NUMERIC_MASK, "C", (locale_t)0); \ 163286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines char_type *e; \ 163386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines EXPECT_NE(0, func_name(str_prefix##"1.5", &e, loc)); \ 16342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED((S8)e); \ 16352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines freelocale(loc); \ 16362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 16370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 163886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#define TEST_STRTO_INT_LOC(func_name, char_type, str_prefix) \ 16392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines TEST(MemorySanitizer, func_name) { \ 16402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines locale_t loc = newlocale(LC_NUMERIC_MASK, "C", (locale_t)0); \ 164186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines char_type *e; \ 164286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines ASSERT_EQ(1U, func_name(str_prefix##"1", &e, 10, loc)); \ 16432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED((S8)e); \ 16442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines freelocale(loc); \ 16452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 16460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 164786277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_INT(strtol, char, ) 164886277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_INT(strtoll, char, ) 164986277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_INT(strtoul, char, ) 165086277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_INT(strtoull, char, ) 165186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines 165286277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_FLOAT(strtof, char, ) 165386277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_FLOAT(strtod, char, ) 165486277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_FLOAT(strtold, char, ) 165586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines 165686277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_FLOAT_LOC(strtof_l, char, ) 165786277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_FLOAT_LOC(strtod_l, char, ) 165886277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_FLOAT_LOC(strtold_l, char, ) 1659ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov 166086277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_INT_LOC(strtol_l, char, ) 166186277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_INT_LOC(strtoll_l, char, ) 166286277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_INT_LOC(strtoul_l, char, ) 166386277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_INT_LOC(strtoull_l, char, ) 16642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 166586277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_INT(wcstol, wchar_t, L) 166686277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_INT(wcstoll, wchar_t, L) 166786277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_INT(wcstoul, wchar_t, L) 166886277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_INT(wcstoull, wchar_t, L) 166986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines 167086277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_FLOAT(wcstof, wchar_t, L) 167186277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_FLOAT(wcstod, wchar_t, L) 167286277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_FLOAT(wcstold, wchar_t, L) 167386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines 167486277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_FLOAT_LOC(wcstof_l, wchar_t, L) 167586277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_FLOAT_LOC(wcstod_l, wchar_t, L) 167686277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_FLOAT_LOC(wcstold_l, wchar_t, L) 167786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines 167886277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_INT_LOC(wcstol_l, wchar_t, L) 167986277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_INT_LOC(wcstoll_l, wchar_t, L) 168086277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_INT_LOC(wcstoul_l, wchar_t, L) 168186277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_INT_LOC(wcstoull_l, wchar_t, L) 16822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 16832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 16846a211c5814e25d6745a5058cc0e499e5235d3821Stephen HinesTEST(MemorySanitizer, strtoimax) { 1685ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov char *e; 16862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(1, strtoimax("1", &e, 10)); 1687ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov EXPECT_NOT_POISONED((S8) e); 1688ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov} 1689ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov 16906a211c5814e25d6745a5058cc0e499e5235d3821Stephen HinesTEST(MemorySanitizer, strtoumax) { 1691e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov char *e; 16922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(1U, strtoumax("1", &e, 10)); 169311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED((S8) e); 1694e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov} 1695e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov 16963f4beff5efdd0d30844ca8b270876f7d59a608e7Evgeniy Stepanov#ifdef __GLIBC__ 16972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesextern "C" float __strtof_l(const char *nptr, char **endptr, locale_t loc); 169886277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_FLOAT_LOC(__strtof_l, char, ) 16993f4beff5efdd0d30844ca8b270876f7d59a608e7Evgeniy Stepanovextern "C" double __strtod_l(const char *nptr, char **endptr, locale_t loc); 170086277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_FLOAT_LOC(__strtod_l, char, ) 17012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesextern "C" long double __strtold_l(const char *nptr, char **endptr, 17022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines locale_t loc); 170386277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_FLOAT_LOC(__strtold_l, char, ) 170486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines 170586277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesextern "C" float __wcstof_l(const wchar_t *nptr, wchar_t **endptr, locale_t loc); 170686277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_FLOAT_LOC(__wcstof_l, wchar_t, L) 170786277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesextern "C" double __wcstod_l(const wchar_t *nptr, wchar_t **endptr, locale_t loc); 170886277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_FLOAT_LOC(__wcstod_l, wchar_t, L) 170986277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesextern "C" long double __wcstold_l(const wchar_t *nptr, wchar_t **endptr, 171086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines locale_t loc); 171186277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST_STRTO_FLOAT_LOC(__wcstold_l, wchar_t, L) 17123f4beff5efdd0d30844ca8b270876f7d59a608e7Evgeniy Stepanov#endif // __GLIBC__ 17133f4beff5efdd0d30844ca8b270876f7d59a608e7Evgeniy Stepanov 1714c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy StepanovTEST(MemorySanitizer, modf) { 1715c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov double x, y; 1716c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov x = modf(2.1, &y); 1717c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov EXPECT_NOT_POISONED(y); 1718c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov} 1719c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov 1720c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy StepanovTEST(MemorySanitizer, modff) { 1721c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov float x, y; 1722c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov x = modff(2.1, &y); 1723c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov EXPECT_NOT_POISONED(y); 1724c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov} 1725c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov 1726c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy StepanovTEST(MemorySanitizer, modfl) { 1727c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov long double x, y; 1728c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov x = modfl(2.1, &y); 1729c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov EXPECT_NOT_POISONED(y); 1730c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov} 1731c87088b54f7438d589119d314853a5f3b00d02b5Evgeniy Stepanov 173286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no sincos() on FreeBSD. 173386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__) 1734f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy StepanovTEST(MemorySanitizer, sincos) { 1735f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov double s, c; 1736f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov sincos(0.2, &s, &c); 1737f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov EXPECT_NOT_POISONED(s); 1738f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov EXPECT_NOT_POISONED(c); 1739f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov} 174086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif 1741f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov 174286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no sincosf() on FreeBSD. 174386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__) 1744f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy StepanovTEST(MemorySanitizer, sincosf) { 1745f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov float s, c; 1746f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov sincosf(0.2, &s, &c); 1747f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov EXPECT_NOT_POISONED(s); 1748f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov EXPECT_NOT_POISONED(c); 1749f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov} 175086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif 1751f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov 175286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no sincosl() on FreeBSD. 175386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__) 1754f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy StepanovTEST(MemorySanitizer, sincosl) { 1755f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov long double s, c; 1756f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov sincosl(0.2, &s, &c); 1757f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov EXPECT_NOT_POISONED(s); 1758f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov EXPECT_NOT_POISONED(c); 1759f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov} 176086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif 1761f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov 1762f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy StepanovTEST(MemorySanitizer, remquo) { 1763f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov int quo; 1764f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov double res = remquo(29.0, 3.0, &quo); 1765f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov ASSERT_NE(0.0, res); 1766f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov EXPECT_NOT_POISONED(quo); 1767f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov} 1768f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov 1769f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy StepanovTEST(MemorySanitizer, remquof) { 1770f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov int quo; 1771f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov float res = remquof(29.0, 3.0, &quo); 1772f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov ASSERT_NE(0.0, res); 1773f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov EXPECT_NOT_POISONED(quo); 1774f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov} 1775f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov 1776f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy StepanovTEST(MemorySanitizer, remquol) { 1777f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov int quo; 1778f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov long double res = remquof(29.0, 3.0, &quo); 1779f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov ASSERT_NE(0.0, res); 1780f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov EXPECT_NOT_POISONED(quo); 1781f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov} 1782f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov 1783f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy StepanovTEST(MemorySanitizer, lgamma) { 1784f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov double res = lgamma(1.1); 1785f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov ASSERT_NE(0.0, res); 1786f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov EXPECT_NOT_POISONED(signgam); 1787f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov} 1788f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov 1789f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy StepanovTEST(MemorySanitizer, lgammaf) { 1790f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov float res = lgammaf(1.1); 1791f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov ASSERT_NE(0.0, res); 1792f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov EXPECT_NOT_POISONED(signgam); 1793f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov} 1794f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov 1795f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy StepanovTEST(MemorySanitizer, lgammal) { 1796f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov long double res = lgammal(1.1); 1797f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov ASSERT_NE(0.0, res); 1798f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov EXPECT_NOT_POISONED(signgam); 1799f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov} 1800f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov 1801f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy StepanovTEST(MemorySanitizer, lgamma_r) { 1802f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov int sgn; 1803f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov double res = lgamma_r(1.1, &sgn); 1804f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov ASSERT_NE(0.0, res); 1805f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov EXPECT_NOT_POISONED(sgn); 1806f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov} 1807f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov 1808f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy StepanovTEST(MemorySanitizer, lgammaf_r) { 1809f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov int sgn; 1810f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov float res = lgammaf_r(1.1, &sgn); 1811f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov ASSERT_NE(0.0, res); 1812f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov EXPECT_NOT_POISONED(sgn); 1813f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov} 1814f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov 181586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no lgammal_r() on FreeBSD. 181686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__) 1817f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy StepanovTEST(MemorySanitizer, lgammal_r) { 1818f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov int sgn; 1819f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov long double res = lgammal_r(1.1, &sgn); 1820f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov ASSERT_NE(0.0, res); 1821f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov EXPECT_NOT_POISONED(sgn); 1822f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov} 182386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif 1824f814b43ed659512203439bc8c3f6d468155a1d3fEvgeniy Stepanov 182586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no drand48_r() on FreeBSD. 182686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__) 182778d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy StepanovTEST(MemorySanitizer, drand48_r) { 182878d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov struct drand48_data buf; 182978d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov srand48_r(0, &buf); 183078d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov double d; 183178d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov drand48_r(&buf, &d); 183278d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov EXPECT_NOT_POISONED(d); 183378d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov} 183486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif 183578d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov 183686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no lrand48_r() on FreeBSD. 183786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__) 183878d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy StepanovTEST(MemorySanitizer, lrand48_r) { 183978d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov struct drand48_data buf; 184078d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov srand48_r(0, &buf); 184178d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov long d; 184278d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov lrand48_r(&buf, &d); 184378d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov EXPECT_NOT_POISONED(d); 184478d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov} 184586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif 184678d77c2638b8e02020737c9b296ce2198e4c58e6Evgeniy Stepanov 18470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, sprintf) { // NOLINT 18480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov char buff[10]; 184912c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov break_optimization(buff); 185011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(buff[0]); 18510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int res = sprintf(buff, "%d", 1234567); // NOLINT 18522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(res, 7); 18532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(buff[0], '1'); 18542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(buff[1], '2'); 18552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(buff[2], '3'); 18562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(buff[6], '7'); 18572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(buff[7], 0); 185811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(buff[8]); 18590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 18600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 18610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, snprintf) { 18620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov char buff[10]; 186312c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov break_optimization(buff); 186411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(buff[0]); 18650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int res = snprintf(buff, sizeof(buff), "%d", 1234567); 18662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(res, 7); 18672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(buff[0], '1'); 18682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(buff[1], '2'); 18692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(buff[2], '3'); 18702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(buff[6], '7'); 18712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(buff[7], 0); 187211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(buff[8]); 18730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 18740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 18750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, swprintf) { 18760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov wchar_t buff[10]; 18772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(4U, sizeof(wchar_t)); 187812c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov break_optimization(buff); 187911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(buff[0]); 18800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int res = swprintf(buff, 9, L"%d", 1234567); 18812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(res, 7); 18822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(buff[0], '1'); 18832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(buff[1], '2'); 18842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(buff[2], '3'); 18852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(buff[6], '7'); 18863d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar ASSERT_EQ(buff[7], L'\0'); 188711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(buff[8]); 18880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 18890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 18900797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy StepanovTEST(MemorySanitizer, asprintf) { // NOLINT 18910797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov char *pbuf; 18920797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov EXPECT_POISONED(pbuf); 18930797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov int res = asprintf(&pbuf, "%d", 1234567); // NOLINT 18942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(res, 7); 18950797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov EXPECT_NOT_POISONED(pbuf); 18962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(pbuf[0], '1'); 18972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(pbuf[1], '2'); 18982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(pbuf[2], '3'); 18992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(pbuf[6], '7'); 19002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(pbuf[7], 0); 19010797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov free(pbuf); 19020797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov} 19030797ed4bfc4adaa1436dbd153b276ed9c917f1b7Evgeniy Stepanov 1904e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey SamsonovTEST(MemorySanitizer, mbstowcs) { 1905e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov const char *x = "abc"; 1906e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov wchar_t buff[10]; 1907e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov int res = mbstowcs(buff, x, 2); 1908e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov EXPECT_EQ(2, res); 1909e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov EXPECT_EQ(L'a', buff[0]); 1910e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov EXPECT_EQ(L'b', buff[1]); 1911e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov EXPECT_POISONED(buff[2]); 1912e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov res = mbstowcs(buff, x, 10); 1913e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov EXPECT_EQ(3, res); 1914e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov EXPECT_NOT_POISONED(buff[3]); 1915e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov} 1916e43d2108ec7622afb34b8281005a12fcdb26d6faAlexey Samsonov 19170231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, wcstombs) { 19180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov const wchar_t *x = L"abc"; 19190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov char buff[10]; 19200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int res = wcstombs(buff, x, 4); 19210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov EXPECT_EQ(res, 3); 19220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov EXPECT_EQ(buff[0], 'a'); 19230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov EXPECT_EQ(buff[1], 'b'); 19240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov EXPECT_EQ(buff[2], 'c'); 19250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 19260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 1927ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy StepanovTEST(MemorySanitizer, wcsrtombs) { 1928ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov const wchar_t *x = L"abc"; 1929ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov const wchar_t *p = x; 1930ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov char buff[10]; 1931ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov mbstate_t mbs; 193257a1095fca7b95db8a0ec87fce7a6f0e331a5b99Evgeniy Stepanov memset(&mbs, 0, sizeof(mbs)); 1933ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov int res = wcsrtombs(buff, &p, 4, &mbs); 1934ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov EXPECT_EQ(res, 3); 1935ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov EXPECT_EQ(buff[0], 'a'); 1936ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov EXPECT_EQ(buff[1], 'b'); 1937ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov EXPECT_EQ(buff[2], 'c'); 19389b21ba6f661a6b14e3e81bb4f06ffb769be028c4Evgeniy Stepanov EXPECT_EQ(buff[3], '\0'); 19399b21ba6f661a6b14e3e81bb4f06ffb769be028c4Evgeniy Stepanov EXPECT_POISONED(buff[4]); 1940ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov} 1941ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov 1942ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy StepanovTEST(MemorySanitizer, wcsnrtombs) { 1943ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov const wchar_t *x = L"abc"; 1944ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov const wchar_t *p = x; 1945ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov char buff[10]; 1946ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov mbstate_t mbs; 194757a1095fca7b95db8a0ec87fce7a6f0e331a5b99Evgeniy Stepanov memset(&mbs, 0, sizeof(mbs)); 1948ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov int res = wcsnrtombs(buff, &p, 2, 4, &mbs); 1949ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov EXPECT_EQ(res, 2); 1950ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov EXPECT_EQ(buff[0], 'a'); 1951ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov EXPECT_EQ(buff[1], 'b'); 19529b21ba6f661a6b14e3e81bb4f06ffb769be028c4Evgeniy Stepanov EXPECT_POISONED(buff[2]); 1953ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov} 1954ff6c9fb3ee83529dc28cd60a3797a8b783f3e892Evgeniy Stepanov 19553d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga NainarTEST(MemorySanitizer, wcrtomb) { 19563d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar wchar_t x = L'a'; 19573d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar char buff[10]; 19583d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar mbstate_t mbs; 19593d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar memset(&mbs, 0, sizeof(mbs)); 19603d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar size_t res = wcrtomb(buff, x, &mbs); 19613d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar EXPECT_EQ(res, (size_t)1); 19623d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar EXPECT_EQ(buff[0], 'a'); 19633d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar} 19643d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 196586277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST(MemorySanitizer, wmemset) { 196686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines wchar_t x[25]; 196786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines break_optimization(x); 196886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines EXPECT_POISONED(x[0]); 196986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines wmemset(x, L'A', 10); 197086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines EXPECT_EQ(x[0], L'A'); 197186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines EXPECT_EQ(x[9], L'A'); 197286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines EXPECT_POISONED(x[10]); 197386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines} 197486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines 1975801448950d645813efb398575bbc62b48e5b1dfcEvgeniy StepanovTEST(MemorySanitizer, mbtowc) { 1976801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov const char *x = "abc"; 1977801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov wchar_t wx; 1978801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov int res = mbtowc(&wx, x, 3); 1979801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov EXPECT_GT(res, 0); 1980801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov EXPECT_NOT_POISONED(wx); 1981801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov} 1982801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov 1983801448950d645813efb398575bbc62b48e5b1dfcEvgeniy StepanovTEST(MemorySanitizer, mbrtowc) { 1984801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov const char *x = "abc"; 1985801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov wchar_t wx; 1986801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov mbstate_t mbs; 1987801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov memset(&mbs, 0, sizeof(mbs)); 1988801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov int res = mbrtowc(&wx, x, 3, &mbs); 1989801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov EXPECT_GT(res, 0); 1990801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov EXPECT_NOT_POISONED(wx); 1991801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov} 1992801448950d645813efb398575bbc62b48e5b1dfcEvgeniy Stepanov 19932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, wcsftime) { 19942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines wchar_t x[100]; 19952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines time_t t = time(NULL); 19962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct tm tms; 19972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct tm *tmres = localtime_r(&t, &tms); 19982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_NE((void *)0, tmres); 19992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines size_t res = wcsftime(x, sizeof(x) / sizeof(x[0]), L"%Y-%m-%d", tmres); 20002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_GT(res, 0UL); 20012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_EQ(res, wcslen(x)); 20022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 20032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 20040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, gettimeofday) { 20050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov struct timeval tv; 20060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov struct timezone tz; 200712c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov break_optimization(&tv); 200812c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov break_optimization(&tz); 20092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(16U, sizeof(tv)); 20102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(8U, sizeof(tz)); 201111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(tv.tv_sec); 201211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(tv.tv_usec); 201311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(tz.tz_minuteswest); 201411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(tz.tz_dsttime); 20152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(0, gettimeofday(&tv, &tz)); 201611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(tv.tv_sec); 201711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(tv.tv_usec); 201811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(tz.tz_minuteswest); 201911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(tz.tz_dsttime); 20200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 20210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 2022e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovTEST(MemorySanitizer, clock_gettime) { 2023e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov struct timespec tp; 2024e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov EXPECT_POISONED(tp.tv_sec); 2025e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov EXPECT_POISONED(tp.tv_nsec); 20262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(0, clock_gettime(CLOCK_REALTIME, &tp)); 2027e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov EXPECT_NOT_POISONED(tp.tv_sec); 2028e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov EXPECT_NOT_POISONED(tp.tv_nsec); 2029e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov} 2030e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov 20317cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy StepanovTEST(MemorySanitizer, clock_getres) { 20327cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov struct timespec tp; 20337cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov EXPECT_POISONED(tp.tv_sec); 20347cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov EXPECT_POISONED(tp.tv_nsec); 20352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(0, clock_getres(CLOCK_REALTIME, 0)); 20367cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov EXPECT_POISONED(tp.tv_sec); 20377cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov EXPECT_POISONED(tp.tv_nsec); 20382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(0, clock_getres(CLOCK_REALTIME, &tp)); 20397cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov EXPECT_NOT_POISONED(tp.tv_sec); 20407cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov EXPECT_NOT_POISONED(tp.tv_nsec); 20417cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov} 20427cdae1683c9c2fcd4473a5862c90c64be3a8c5fdEvgeniy Stepanov 2043e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovTEST(MemorySanitizer, getitimer) { 2044e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov struct itimerval it1, it2; 2045e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov int res; 2046e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov EXPECT_POISONED(it1.it_interval.tv_sec); 2047e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov EXPECT_POISONED(it1.it_interval.tv_usec); 2048e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov EXPECT_POISONED(it1.it_value.tv_sec); 2049e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov EXPECT_POISONED(it1.it_value.tv_usec); 2050e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov res = getitimer(ITIMER_VIRTUAL, &it1); 20512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(0, res); 2052e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov EXPECT_NOT_POISONED(it1.it_interval.tv_sec); 2053e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov EXPECT_NOT_POISONED(it1.it_interval.tv_usec); 2054e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov EXPECT_NOT_POISONED(it1.it_value.tv_sec); 2055e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov EXPECT_NOT_POISONED(it1.it_value.tv_usec); 2056e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov 2057e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov it1.it_interval.tv_sec = it1.it_value.tv_sec = 10000; 2058e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov it1.it_interval.tv_usec = it1.it_value.tv_usec = 0; 2059e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov 2060e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov res = setitimer(ITIMER_VIRTUAL, &it1, &it2); 20612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(0, res); 2062e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov EXPECT_NOT_POISONED(it2.it_interval.tv_sec); 2063e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov EXPECT_NOT_POISONED(it2.it_interval.tv_usec); 2064e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov EXPECT_NOT_POISONED(it2.it_value.tv_sec); 2065e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov EXPECT_NOT_POISONED(it2.it_value.tv_usec); 2066e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov 2067e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov // Check that old_value can be 0, and disable the timer. 2068e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov memset(&it1, 0, sizeof(it1)); 2069e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov res = setitimer(ITIMER_VIRTUAL, &it1, 0); 20702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(0, res); 2071e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov} 2072e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov 207339d68edd461abb5058a4b96fd16f1741ad89bba7Evgeniy StepanovTEST(MemorySanitizer, setitimer_null) { 207439d68edd461abb5058a4b96fd16f1741ad89bba7Evgeniy Stepanov setitimer(ITIMER_VIRTUAL, 0, 0); 207539d68edd461abb5058a4b96fd16f1741ad89bba7Evgeniy Stepanov // Not testing the return value, since it the behaviour seems to differ 207639d68edd461abb5058a4b96fd16f1741ad89bba7Evgeniy Stepanov // between libc implementations and POSIX. 207739d68edd461abb5058a4b96fd16f1741ad89bba7Evgeniy Stepanov // Should never crash, though. 207839d68edd461abb5058a4b96fd16f1741ad89bba7Evgeniy Stepanov} 207939d68edd461abb5058a4b96fd16f1741ad89bba7Evgeniy Stepanov 2080fef660506e9e5703fedfee01d614abd4b741c738Evgeniy StepanovTEST(MemorySanitizer, time) { 2081fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov time_t t; 2082fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov EXPECT_POISONED(t); 2083fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov time_t t2 = time(&t); 20842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_NE(t2, (time_t)-1); 2085fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov EXPECT_NOT_POISONED(t); 2086fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov} 2087fef660506e9e5703fedfee01d614abd4b741c738Evgeniy Stepanov 2088e4f9f8a1296768a7a6b6646a3b241a379f4a5e15Evgeniy StepanovTEST(MemorySanitizer, strptime) { 2089e4f9f8a1296768a7a6b6646a3b241a379f4a5e15Evgeniy Stepanov struct tm time; 2090e4f9f8a1296768a7a6b6646a3b241a379f4a5e15Evgeniy Stepanov char *p = strptime("11/1/2013-05:39", "%m/%d/%Y-%H:%M", &time); 20912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_TRUE(p != NULL); 2092e4f9f8a1296768a7a6b6646a3b241a379f4a5e15Evgeniy Stepanov EXPECT_NOT_POISONED(time.tm_sec); 2093e4f9f8a1296768a7a6b6646a3b241a379f4a5e15Evgeniy Stepanov EXPECT_NOT_POISONED(time.tm_hour); 2094e4f9f8a1296768a7a6b6646a3b241a379f4a5e15Evgeniy Stepanov EXPECT_NOT_POISONED(time.tm_year); 2095e4f9f8a1296768a7a6b6646a3b241a379f4a5e15Evgeniy Stepanov} 2096e4f9f8a1296768a7a6b6646a3b241a379f4a5e15Evgeniy Stepanov 20979358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy StepanovTEST(MemorySanitizer, localtime) { 20989358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov time_t t = 123; 20999358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov struct tm *time = localtime(&t); 21002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_TRUE(time != NULL); 21019358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov EXPECT_NOT_POISONED(time->tm_sec); 21029358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov EXPECT_NOT_POISONED(time->tm_hour); 21039358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov EXPECT_NOT_POISONED(time->tm_year); 21049358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov EXPECT_NOT_POISONED(time->tm_isdst); 21052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NE(0U, strlen(time->tm_zone)); 21069358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov} 21079358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov 21089358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy StepanovTEST(MemorySanitizer, localtime_r) { 21099358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov time_t t = 123; 21109358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov struct tm time; 21119358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov struct tm *res = localtime_r(&t, &time); 21122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_TRUE(res != NULL); 21139358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov EXPECT_NOT_POISONED(time.tm_sec); 21149358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov EXPECT_NOT_POISONED(time.tm_hour); 21159358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov EXPECT_NOT_POISONED(time.tm_year); 21169358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov EXPECT_NOT_POISONED(time.tm_isdst); 21172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NE(0U, strlen(time.tm_zone)); 21189358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov} 21199358c58d0aaf1b20f17362af354d4c3c1309276aEvgeniy Stepanov 212086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no getmntent() on FreeBSD. 212186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__) 21224d7297daef90ad59446250617b72d184141436fcEvgeniy StepanovTEST(MemorySanitizer, getmntent) { 21234d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov FILE *fp = setmntent("/etc/fstab", "r"); 21244d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov struct mntent *mnt = getmntent(fp); 21252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_TRUE(mnt != NULL); 21262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_NE(0U, strlen(mnt->mnt_fsname)); 21272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_NE(0U, strlen(mnt->mnt_dir)); 21282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_NE(0U, strlen(mnt->mnt_type)); 21292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_NE(0U, strlen(mnt->mnt_opts)); 21304d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov EXPECT_NOT_POISONED(mnt->mnt_freq); 21314d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov EXPECT_NOT_POISONED(mnt->mnt_passno); 21324d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov fclose(fp); 21334d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov} 213486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif 21354d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov 213686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no getmntent_r() on FreeBSD. 213786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__) 21384d7297daef90ad59446250617b72d184141436fcEvgeniy StepanovTEST(MemorySanitizer, getmntent_r) { 21394d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov FILE *fp = setmntent("/etc/fstab", "r"); 21404d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov struct mntent mntbuf; 21414d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov char buf[1000]; 21424d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov struct mntent *mnt = getmntent_r(fp, &mntbuf, buf, sizeof(buf)); 21432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_TRUE(mnt != NULL); 21442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_NE(0U, strlen(mnt->mnt_fsname)); 21452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_NE(0U, strlen(mnt->mnt_dir)); 21462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_NE(0U, strlen(mnt->mnt_type)); 21472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_NE(0U, strlen(mnt->mnt_opts)); 21484d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov EXPECT_NOT_POISONED(mnt->mnt_freq); 21494d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov EXPECT_NOT_POISONED(mnt->mnt_passno); 21504d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov fclose(fp); 21514d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov} 215286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif 21534d7297daef90ad59446250617b72d184141436fcEvgeniy Stepanov 2154369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy StepanovTEST(MemorySanitizer, ether) { 2155369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov const char *asc = "11:22:33:44:55:66"; 2156369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov struct ether_addr *paddr = ether_aton(asc); 2157369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov EXPECT_NOT_POISONED(*paddr); 2158369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov 2159369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov struct ether_addr addr; 2160369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov paddr = ether_aton_r(asc, &addr); 2161369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov ASSERT_EQ(paddr, &addr); 2162369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov EXPECT_NOT_POISONED(addr); 2163369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov 2164369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov char *s = ether_ntoa(&addr); 21652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_NE(0U, strlen(s)); 2166369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov 2167369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov char buf[100]; 2168369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov s = ether_ntoa_r(&addr, buf); 2169369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov ASSERT_EQ(s, buf); 21702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_NE(0U, strlen(buf)); 2171369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov} 2172369a9a6d4297af031227db1c6fedd21ee7033dc1Evgeniy Stepanov 21730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, mmap) { 21740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov const int size = 4096; 21750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov void *p1, *p2; 21760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov p1 = mmap(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0); 21770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __msan_poison(p1, size); 21780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov munmap(p1, size); 21790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov for (int i = 0; i < 1000; i++) { 21800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov p2 = mmap(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0); 21810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov if (p2 == p1) 21820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov break; 21830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov else 21840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov munmap(p2, size); 21850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov } 21860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov if (p1 == p2) { 218711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(*(char*)p2); 21880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov munmap(p2, size); 21890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov } 21900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 21910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 219286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no fcvt() on FreeBSD. 219386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__) 21940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// FIXME: enable and add ecvt. 21950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// FIXME: check why msandr does nt handle fcvt. 21960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, fcvt) { 21970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int a, b; 219812c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov break_optimization(&a); 219912c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov break_optimization(&b); 220011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(a); 220111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(b); 22020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov char *str = fcvt(12345.6789, 10, &a, &b); 220311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(a); 220411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(b); 22056d1862363c88c183b0ed7740fca876342cf0474bStephen Hines ASSERT_NE(nullptr, str); 22066d1862363c88c183b0ed7740fca876342cf0474bStephen Hines EXPECT_NOT_POISONED(str[0]); 22076d1862363c88c183b0ed7740fca876342cf0474bStephen Hines ASSERT_NE(0U, strlen(str)); 22080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 220986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif 22100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 221186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no fcvt_long() on FreeBSD. 221286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__) 22136d1862363c88c183b0ed7740fca876342cf0474bStephen HinesTEST(MemorySanitizer, fcvt_long) { 22146d1862363c88c183b0ed7740fca876342cf0474bStephen Hines int a, b; 22156d1862363c88c183b0ed7740fca876342cf0474bStephen Hines break_optimization(&a); 22166d1862363c88c183b0ed7740fca876342cf0474bStephen Hines break_optimization(&b); 22176d1862363c88c183b0ed7740fca876342cf0474bStephen Hines EXPECT_POISONED(a); 22186d1862363c88c183b0ed7740fca876342cf0474bStephen Hines EXPECT_POISONED(b); 22196d1862363c88c183b0ed7740fca876342cf0474bStephen Hines char *str = fcvt(111111112345.6789, 10, &a, &b); 22206d1862363c88c183b0ed7740fca876342cf0474bStephen Hines EXPECT_NOT_POISONED(a); 22216d1862363c88c183b0ed7740fca876342cf0474bStephen Hines EXPECT_NOT_POISONED(b); 22226d1862363c88c183b0ed7740fca876342cf0474bStephen Hines ASSERT_NE(nullptr, str); 22236d1862363c88c183b0ed7740fca876342cf0474bStephen Hines EXPECT_NOT_POISONED(str[0]); 22246d1862363c88c183b0ed7740fca876342cf0474bStephen Hines ASSERT_NE(0U, strlen(str)); 22256d1862363c88c183b0ed7740fca876342cf0474bStephen Hines} 222686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif 22276d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 22282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, memchr) { 22292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char x[10]; 22302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines break_optimization(x); 22312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(x[0]); 22322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines x[2] = '2'; 22332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines void *res; 22342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_UMR(res = memchr(x, '2', 10)); 22352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(res); 22362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines x[0] = '0'; 22372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines x[1] = '1'; 22382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines res = memchr(x, '2', 10); 22392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_EQ(&x[2], res); 22402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_UMR(res = memchr(x, '3', 10)); 22412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(res); 22422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 22432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 22442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, memrchr) { 22452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char x[10]; 22462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines break_optimization(x); 22472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(x[0]); 22482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines x[9] = '9'; 22492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines void *res; 22502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_UMR(res = memrchr(x, '9', 10)); 22512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(res); 22522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines x[0] = '0'; 22532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines x[1] = '1'; 22542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines res = memrchr(x, '0', 2); 22552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_EQ(&x[0], res); 22562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_UMR(res = memrchr(x, '7', 10)); 22572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(res); 22582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 22592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 22607cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy StepanovTEST(MemorySanitizer, frexp) { 22617cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov int x; 22627cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov x = *GetPoisoned<int>(); 22637cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov double r = frexp(1.1, &x); 22647cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov EXPECT_NOT_POISONED(r); 22657cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov EXPECT_NOT_POISONED(x); 22667cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov 22677cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov x = *GetPoisoned<int>(); 22687cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov float rf = frexpf(1.1, &x); 22697cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov EXPECT_NOT_POISONED(rf); 22707cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov EXPECT_NOT_POISONED(x); 22717cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov 22727cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov x = *GetPoisoned<int>(); 22737cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov double rl = frexpl(1.1, &x); 22747cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov EXPECT_NOT_POISONED(rl); 22757cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov EXPECT_NOT_POISONED(x); 22767cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov} 22777cbbb2943527ff852bdace822c8592cfc7e450d7Evgeniy Stepanov 227806658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanovnamespace { 227906658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov 228006658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanovstatic int cnt; 228106658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov 228206658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanovvoid SigactionHandler(int signo, siginfo_t* si, void* uc) { 22832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(signo, SIGPROF); 22842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_TRUE(si != NULL); 228506658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov EXPECT_NOT_POISONED(si->si_errno); 228606658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov EXPECT_NOT_POISONED(si->si_pid); 228706658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov#if __linux__ 228806658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov# if defined(__x86_64__) 228906658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov EXPECT_NOT_POISONED(((ucontext_t*)uc)->uc_mcontext.gregs[REG_RIP]); 229006658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov# elif defined(__i386__) 229106658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov EXPECT_NOT_POISONED(((ucontext_t*)uc)->uc_mcontext.gregs[REG_EIP]); 229206658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov# endif 229306658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov#endif 229406658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov ++cnt; 229506658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov} 229606658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov 229706658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy StepanovTEST(MemorySanitizer, sigaction) { 229806658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov struct sigaction act = {}; 2299cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov struct sigaction oldact = {}; 23006d0b7f6c41bed64419dd74a8daf83de5e9f54de9Evgeniy Stepanov struct sigaction origact = {}; 23016d0b7f6c41bed64419dd74a8daf83de5e9f54de9Evgeniy Stepanov 23026d0b7f6c41bed64419dd74a8daf83de5e9f54de9Evgeniy Stepanov sigaction(SIGPROF, 0, &origact); 23036d0b7f6c41bed64419dd74a8daf83de5e9f54de9Evgeniy Stepanov 230406658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov act.sa_flags |= SA_SIGINFO; 230506658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov act.sa_sigaction = &SigactionHandler; 230606658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov sigaction(SIGPROF, &act, 0); 230706658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov 230806658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov kill(getpid(), SIGPROF); 230906658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov 231006658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov act.sa_flags &= ~SA_SIGINFO; 231106658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov act.sa_handler = SIG_DFL; 231206658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov sigaction(SIGPROF, &act, 0); 231306658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov 231406658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov act.sa_flags &= ~SA_SIGINFO; 231506658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov act.sa_handler = SIG_IGN; 2316cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov sigaction(SIGPROF, &act, &oldact); 2317cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov EXPECT_FALSE(oldact.sa_flags & SA_SIGINFO); 2318cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov EXPECT_EQ(SIG_DFL, oldact.sa_handler); 231906658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov kill(getpid(), SIGPROF); 232006658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov 232106658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov act.sa_flags |= SA_SIGINFO; 232206658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov act.sa_sigaction = &SigactionHandler; 2323cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov sigaction(SIGPROF, &act, &oldact); 2324cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov EXPECT_FALSE(oldact.sa_flags & SA_SIGINFO); 2325cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov EXPECT_EQ(SIG_IGN, oldact.sa_handler); 232606658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov kill(getpid(), SIGPROF); 232706658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov 232806658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov act.sa_flags &= ~SA_SIGINFO; 232906658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov act.sa_handler = SIG_DFL; 2330cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov sigaction(SIGPROF, &act, &oldact); 2331cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov EXPECT_TRUE(oldact.sa_flags & SA_SIGINFO); 2332cd3049da150124156502b1a8c05e4c4887786cc5Evgeniy Stepanov EXPECT_EQ(&SigactionHandler, oldact.sa_sigaction); 233306658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov EXPECT_EQ(2, cnt); 23346d0b7f6c41bed64419dd74a8daf83de5e9f54de9Evgeniy Stepanov 23356d0b7f6c41bed64419dd74a8daf83de5e9f54de9Evgeniy Stepanov sigaction(SIGPROF, &origact, 0); 233606658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov} 233706658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov 233806658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov} // namespace 233906658ea68c4912fffafef6e65f36dce7faa4a174Evgeniy Stepanov 23409a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov 23419a949a8909f652b28e9084de785c848743139fd5Evgeniy StepanovTEST(MemorySanitizer, sigemptyset) { 23429a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov sigset_t s; 23439a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov EXPECT_POISONED(s); 23449a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov int res = sigemptyset(&s); 23459a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov ASSERT_EQ(0, res); 23469a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov EXPECT_NOT_POISONED(s); 23479a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov} 23489a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov 23499a949a8909f652b28e9084de785c848743139fd5Evgeniy StepanovTEST(MemorySanitizer, sigfillset) { 23509a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov sigset_t s; 23519a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov EXPECT_POISONED(s); 23529a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov int res = sigfillset(&s); 23539a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov ASSERT_EQ(0, res); 23549a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov EXPECT_NOT_POISONED(s); 23559a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov} 23569a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov 23579a949a8909f652b28e9084de785c848743139fd5Evgeniy StepanovTEST(MemorySanitizer, sigpending) { 23589a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov sigset_t s; 23599a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov EXPECT_POISONED(s); 23609a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov int res = sigpending(&s); 23619a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov ASSERT_EQ(0, res); 23629a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov EXPECT_NOT_POISONED(s); 23639a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov} 23649a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov 23659a949a8909f652b28e9084de785c848743139fd5Evgeniy StepanovTEST(MemorySanitizer, sigprocmask) { 23669a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov sigset_t s; 23679a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov EXPECT_POISONED(s); 23689a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov int res = sigprocmask(SIG_BLOCK, 0, &s); 23699a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov ASSERT_EQ(0, res); 23709a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov EXPECT_NOT_POISONED(s); 23719a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov} 23729a949a8909f652b28e9084de785c848743139fd5Evgeniy Stepanov 23730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct StructWithDtor { 23740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov ~StructWithDtor(); 23750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}; 23760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 23770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE StructWithDtor::~StructWithDtor() { 237812c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov break_optimization(0); 23790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 23800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 23810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, Invoke) { 23820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov StructWithDtor s; // Will cause the calls to become invokes. 238311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(0); 238411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*GetPoisoned<int>()); 238511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(0); 238611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(*GetPoisoned<int>()); 238711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(ReturnPoisoned<S4>()); 23880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 23890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 23900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, ptrtoint) { 23910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov // Test that shadow is propagated through pointer-to-integer conversion. 23920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov void* p = (void*)0xABCD; 23930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __msan_poison(((char*)&p) + 1, sizeof(p)); 2394250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov EXPECT_NOT_POISONED((((uintptr_t)p) & 0xFF) == 0); 23950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 23960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov void* q = (void*)0xABCD; 23970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __msan_poison(&q, sizeof(q) - 1); 2398250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov EXPECT_POISONED((((uintptr_t)q) & 0xFF) == 0); 23990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 24000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 24010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn2(int guard, ...) { 24020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov va_list vl; 24030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov va_start(vl, guard); 240411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(va_arg(vl, int)); 240511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(va_arg(vl, int)); 240611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(va_arg(vl, int)); 240711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(va_arg(vl, double)); 24080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov va_end(vl); 24090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 24100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 24110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn(int guard, ...) { 24120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov va_list vl; 24130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov va_start(vl, guard); 241411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(va_arg(vl, int)); 241511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(va_arg(vl, int)); 24160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov // The following call will overwrite __msan_param_tls. 24170231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov // Checks after it test that arg shadow was somehow saved across the call. 24180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov vaargsfn2(1, 2, 3, 4, *GetPoisoned<double>()); 241911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(va_arg(vl, int)); 242011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(va_arg(vl, int)); 24210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov va_end(vl); 24220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 24230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 24240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, VAArgTest) { 24250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int* x = GetPoisoned<int>(); 24260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int* y = GetPoisoned<int>(4); 24270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov vaargsfn(1, 13, *x, 42, *y); 24280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 24290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 24300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_many(int guard, ...) { 24310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov va_list vl; 24320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov va_start(vl, guard); 243311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(va_arg(vl, int)); 243411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(va_arg(vl, int)); 243511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(va_arg(vl, int)); 243611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(va_arg(vl, int)); 243711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(va_arg(vl, int)); 243811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(va_arg(vl, int)); 243911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(va_arg(vl, int)); 244011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(va_arg(vl, int)); 244111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(va_arg(vl, int)); 244211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(va_arg(vl, int)); 24430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov va_end(vl); 24440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 24450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 24460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, VAArgManyTest) { 24470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int* x = GetPoisoned<int>(); 24480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int* y = GetPoisoned<int>(4); 24490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov vaargsfn_many(1, 2, *x, 3, 4, 5, 6, 7, 8, 9, *y); 24500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 24510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 24520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_pass2(va_list vl) { 245311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(va_arg(vl, int)); 245411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(va_arg(vl, int)); 245511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(va_arg(vl, int)); 24560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 24570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 24580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_pass(int guard, ...) { 24590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov va_list vl; 24600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov va_start(vl, guard); 246111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(va_arg(vl, int)); 24620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov vaargsfn_pass2(vl); 24630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov va_end(vl); 24640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 24650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 24660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, VAArgPass) { 24670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int* x = GetPoisoned<int>(); 24680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int* y = GetPoisoned<int>(4); 24690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov vaargsfn_pass(1, *x, 2, 3, *y); 24700231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 24710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 24720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_copy2(va_list vl) { 247311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(va_arg(vl, int)); 247411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(va_arg(vl, int)); 24750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 24760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 24770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_copy(int guard, ...) { 24780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov va_list vl; 24790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov va_start(vl, guard); 248011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(va_arg(vl, int)); 248111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(va_arg(vl, int)); 24820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov va_list vl2; 24830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov va_copy(vl2, vl); 24840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov vaargsfn_copy2(vl2); 248511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(va_arg(vl, int)); 248611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(va_arg(vl, int)); 24870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov va_end(vl); 24880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 24890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 24900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, VAArgCopy) { 24910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int* x = GetPoisoned<int>(); 24920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int* y = GetPoisoned<int>(4); 24930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov vaargsfn_copy(1, 2, *x, 3, *y); 24940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 24950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 24960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_ptr(int guard, ...) { 24970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov va_list vl; 24980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov va_start(vl, guard); 249911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(va_arg(vl, int*)); 250011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(va_arg(vl, int*)); 250111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(va_arg(vl, int*)); 250211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(va_arg(vl, double*)); 25030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov va_end(vl); 25040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 25050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 25060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, VAArgPtr) { 25070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int** x = GetPoisoned<int*>(); 25080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov double** y = GetPoisoned<double*>(8); 25090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int z; 25100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov vaargsfn_ptr(1, &z, *x, &z, *y); 25110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 25120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 25130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_overflow(int guard, ...) { 25140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov va_list vl; 25150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov va_start(vl, guard); 251611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(va_arg(vl, int)); 251711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(va_arg(vl, int)); 251811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(va_arg(vl, int)); 251911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(va_arg(vl, int)); 252011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(va_arg(vl, int)); 252111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(va_arg(vl, int)); 252211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov 252311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(va_arg(vl, double)); 252411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(va_arg(vl, double)); 252511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(va_arg(vl, double)); 252611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(va_arg(vl, double)); 252711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(va_arg(vl, double)); 252811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(va_arg(vl, int*)); 252911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(va_arg(vl, double)); 253011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(va_arg(vl, double)); 253111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov 253211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(va_arg(vl, int)); 253311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(va_arg(vl, double)); 253411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(va_arg(vl, int*)); 253511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov 253611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(va_arg(vl, int)); 253711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(va_arg(vl, double)); 253811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(va_arg(vl, int*)); 253911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov 254011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(va_arg(vl, int)); 254111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(va_arg(vl, double)); 254211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(va_arg(vl, int*)); 25430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 25440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov va_end(vl); 25450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 25460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 25470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, VAArgOverflow) { 25480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int* x = GetPoisoned<int>(); 25490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov double* y = GetPoisoned<double>(8); 25500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int** p = GetPoisoned<int*>(16); 25510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int z; 25520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov vaargsfn_overflow(1, 25530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 1, 2, *x, 4, 5, 6, 25540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 1.1, 2.2, 3.3, *y, 5.5, *p, 7.7, 8.8, 25550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov // the following args will overflow for sure 25560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov *x, *y, *p, 25570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 7, 9.9, &z, 25580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov *x, *y, *p); 25590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 25600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 25610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_tlsoverwrite2(int guard, ...) { 25620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov va_list vl; 25630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov va_start(vl, guard); 25643c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov for (int i = 0; i < 20; ++i) 25653c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov EXPECT_NOT_POISONED(va_arg(vl, int)); 25660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov va_end(vl); 25670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 25680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 25690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstatic void vaargsfn_tlsoverwrite(int guard, ...) { 25700231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov // This call will overwrite TLS contents unless it's backed up somewhere. 25713c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov vaargsfn_tlsoverwrite2(2, 25723c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov 42, 42, 42, 42, 42, 25733c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov 42, 42, 42, 42, 42, 25743c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov 42, 42, 42, 42, 42, 25753c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov 42, 42, 42, 42, 42); // 20x 25760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov va_list vl; 25770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov va_start(vl, guard); 25783c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov for (int i = 0; i < 20; ++i) 25793c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov EXPECT_POISONED(va_arg(vl, int)); 25800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov va_end(vl); 25810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 25820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 25830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, VAArgTLSOverwrite) { 25840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int* x = GetPoisoned<int>(); 25853c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov vaargsfn_tlsoverwrite(1, 25863c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov *x, *x, *x, *x, *x, 25873c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov *x, *x, *x, *x, *x, 25883c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov *x, *x, *x, *x, *x, 25893c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov *x, *x, *x, *x, *x); // 20x 25903c531dfb0f06a53826bd55e1cae949abb03a6d6dEvgeniy Stepanov 25910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 25920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 25930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct StructByVal { 25940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int a, b, c, d, e, f; 25950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}; 25960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 25972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesstatic void vaargsfn_structbyval(int guard, ...) { 25982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines va_list vl; 25992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines va_start(vl, guard); 26002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines { 26012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines StructByVal s = va_arg(vl, StructByVal); 26022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(s.a); 26032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(s.b); 26042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(s.c); 26052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(s.d); 26062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(s.e); 26072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(s.f); 26082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 26092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines { 26102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines StructByVal s = va_arg(vl, StructByVal); 26112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(s.a); 26122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(s.b); 26132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(s.c); 26142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(s.d); 26152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(s.e); 26162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(s.f); 26172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 26182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines va_end(vl); 26192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 26202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 26212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, VAArgStructByVal) { 26222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines StructByVal s; 26232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines s.a = 1; 26242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines s.b = *GetPoisoned<int>(); 26252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines s.c = 2; 26262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines s.d = *GetPoisoned<int>(); 26272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines s.e = 3; 26282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines s.f = *GetPoisoned<int>(); 26292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines vaargsfn_structbyval(0, s, s); 26302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 26312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 26320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE void StructByValTestFunc(struct StructByVal s) { 263311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(s.a); 263411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(s.b); 263511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(s.c); 263611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(s.d); 263711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(s.e); 263811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(s.f); 26390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 26400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 26410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE void StructByValTestFunc1(struct StructByVal s) { 26420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov StructByValTestFunc(s); 26430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 26440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 26450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE void StructByValTestFunc2(int z, struct StructByVal s) { 26460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov StructByValTestFunc(s); 26470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 26480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 26490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, StructByVal) { 26500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov // Large aggregates are passed as "byval" pointer argument in LLVM. 26510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov struct StructByVal s; 26520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov s.a = 1; 26530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov s.b = *GetPoisoned<int>(); 26540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov s.c = 2; 26550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov s.d = *GetPoisoned<int>(); 26560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov s.e = 3; 26570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov s.f = *GetPoisoned<int>(); 26580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov StructByValTestFunc(s); 26590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov StructByValTestFunc1(s); 26600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov StructByValTestFunc2(0, s); 26610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 26620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 26630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 26640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#if MSAN_HAS_M128 2665b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy StepanovNOINLINE __m128i m128Eq(__m128i *a, __m128i *b) { return _mm_cmpeq_epi16(*a, *b); } 2666b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy StepanovNOINLINE __m128i m128Lt(__m128i *a, __m128i *b) { return _mm_cmplt_epi16(*a, *b); } 26670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, m128) { 26680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __m128i a = _mm_set1_epi16(0x1234); 26690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __m128i b = _mm_set1_epi16(0x7890); 267011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(m128Eq(&a, &b)); 267111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(m128Lt(&a, &b)); 26720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 26730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// FIXME: add more tests for __m128i. 26740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#endif // MSAN_HAS_M128 26750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 26760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov// We should not complain when copying this poisoned hole. 26770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct StructWithHole { 26780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov U4 a; 26790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov // 4-byte hole. 26800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov U8 b; 26810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}; 26820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 26830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE StructWithHole ReturnStructWithHole() { 26840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov StructWithHole res; 26850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __msan_poison(&res, sizeof(res)); 26860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov res.a = 1; 26870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov res.b = 2; 26880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov return res; 26890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 26900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 26910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, StructWithHole) { 26920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov StructWithHole a = ReturnStructWithHole(); 269312c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov break_optimization(&a); 26940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 26950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 26960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate <class T> 26970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE T ReturnStruct() { 26980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov T res; 26990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __msan_poison(&res, sizeof(res)); 27000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov res.a = 1; 27010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov return res; 27020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 27030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 27040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate <class T> 27050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE void TestReturnStruct() { 27060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov T s1 = ReturnStruct<T>(); 270711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(s1.a); 270811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(s1.b); 27090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 27100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 27110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS1 { 27120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int a, b, c; 27130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}; 27140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS2 { 27150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int b, a, c; 27160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}; 27170231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS3 { 27180231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int b, c, a; 27190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}; 27200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS4 { 27210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int c, b, a; 27220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}; 27230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 27240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS5 { 27250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int a; 27260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov float b; 27270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}; 27280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS6 { 27290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int a; 27300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov double b; 27310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}; 27320231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS7 { 27330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov S8 b; 27340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int a; 27350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}; 27360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct SSS8 { 27370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov S2 b; 27380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov S8 a; 27390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}; 27400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 27410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, IntStruct3) { 27420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov TestReturnStruct<SSS1>(); 27430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov TestReturnStruct<SSS2>(); 27440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov TestReturnStruct<SSS3>(); 27450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov TestReturnStruct<SSS4>(); 27460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov TestReturnStruct<SSS5>(); 27470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov TestReturnStruct<SSS6>(); 27480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov TestReturnStruct<SSS7>(); 27490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov TestReturnStruct<SSS8>(); 27500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 27510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 27520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct LongStruct { 27530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov U1 a1, b1; 27540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov U2 a2, b2; 27550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov U4 a4, b4; 27560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov U8 a8, b8; 27570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}; 27580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 27590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE LongStruct ReturnLongStruct1() { 27600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov LongStruct res; 27610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __msan_poison(&res, sizeof(res)); 27620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov res.a1 = res.a2 = res.a4 = res.a8 = 111; 27630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov // leaves b1, .., b8 poisoned. 27640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov return res; 27650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 27660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 27670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE LongStruct ReturnLongStruct2() { 27680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov LongStruct res; 27690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __msan_poison(&res, sizeof(res)); 27700231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov res.b1 = res.b2 = res.b4 = res.b8 = 111; 27710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov // leaves a1, .., a8 poisoned. 27720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov return res; 27730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 27740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 27750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, LongStruct) { 27760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov LongStruct s1 = ReturnLongStruct1(); 27770231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __msan_print_shadow(&s1, sizeof(s1)); 277811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(s1.a1); 277911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(s1.a2); 278011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(s1.a4); 278111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(s1.a8); 27820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 278311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(s1.b1); 278411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(s1.b2); 278511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(s1.b4); 278611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(s1.b8); 27870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 27880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov LongStruct s2 = ReturnLongStruct2(); 27890231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __msan_print_shadow(&s2, sizeof(s2)); 279011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(s2.b1); 279111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(s2.b2); 279211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(s2.b4); 279311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(s2.b8); 27940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 279511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(s2.a1); 279611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(s2.a2); 279711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(s2.a4); 279811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(s2.a8); 27990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 28000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 28010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, getrlimit) { 28020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov struct rlimit limit; 28030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __msan_poison(&limit, sizeof(limit)); 28040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int result = getrlimit(RLIMIT_DATA, &limit); 28052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(result, 0); 28062bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov EXPECT_NOT_POISONED(limit.rlim_cur); 28072bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov EXPECT_NOT_POISONED(limit.rlim_max); 28080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 28090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 2810e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy StepanovTEST(MemorySanitizer, getrusage) { 2811e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov struct rusage usage; 2812e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov __msan_poison(&usage, sizeof(usage)); 2813e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov int result = getrusage(RUSAGE_SELF, &usage); 28142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(result, 0); 281511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(usage.ru_utime.tv_sec); 281611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(usage.ru_utime.tv_usec); 281711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(usage.ru_stime.tv_sec); 281811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(usage.ru_stime.tv_usec); 281911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(usage.ru_maxrss); 282011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(usage.ru_minflt); 282111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(usage.ru_majflt); 282211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(usage.ru_inblock); 282311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(usage.ru_oublock); 282411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(usage.ru_nvcsw); 282511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(usage.ru_nivcsw); 2826e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov} 2827e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov 282886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if defined(__FreeBSD__) 282986277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesstatic void GetProgramPath(char *buf, size_t sz) { 283086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 }; 283186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines int res = sysctl(mib, 4, buf, &sz, NULL, 0); 283286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines ASSERT_EQ(0, res); 283386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines} 283486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#elif defined(__GLIBC__) 283586277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesstatic void GetProgramPath(char *buf, size_t sz) { 283686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines extern char *program_invocation_name; 283786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines int res = snprintf(buf, sz, "%s", program_invocation_name); 283886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines ASSERT_GE(res, 0); 283986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines ASSERT_LT((size_t)res, sz); 284086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines} 284186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#else 28421aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov# error "TODO: port this" 28431aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov#endif 28441aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov 2845e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanovstatic void dladdr_testfn() {} 2846e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov 2847e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy StepanovTEST(MemorySanitizer, dladdr) { 2848e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov Dl_info info; 2849e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov __msan_poison(&info, sizeof(info)); 2850e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov int result = dladdr((const void*)dladdr_testfn, &info); 28512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_NE(result, 0); 285211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED((unsigned long)info.dli_fname); 2853e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov if (info.dli_fname) 285411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(strlen(info.dli_fname)); 285511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED((unsigned long)info.dli_fbase); 285611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED((unsigned long)info.dli_sname); 2857e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov if (info.dli_sname) 285811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(strlen(info.dli_sname)); 285911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED((unsigned long)info.dli_saddr); 2860e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov} 2861e03345ba3da0450f7ff1410de6a2a00fd304089dEvgeniy Stepanov 286208104e6f77f4e5279f8cb4a74784ffb7afd5073fEvgeniy Stepanov#ifndef MSAN_TEST_DISABLE_DLOPEN 286308104e6f77f4e5279f8cb4a74784ffb7afd5073fEvgeniy Stepanov 28642bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanovstatic int dl_phdr_callback(struct dl_phdr_info *info, size_t size, void *data) { 28652bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov (*(int *)data)++; 28662bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov EXPECT_NOT_POISONED(info->dlpi_addr); 28672bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov EXPECT_NOT_POISONED(strlen(info->dlpi_name)); 28682bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov EXPECT_NOT_POISONED(info->dlpi_phnum); 28692bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov for (int i = 0; i < info->dlpi_phnum; ++i) 28702bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov EXPECT_NOT_POISONED(info->dlpi_phdr[i]); 28712bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov return 0; 28722bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov} 28732bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov 2874263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov// Compute the path to our loadable DSO. We assume it's in the same 2875263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov// directory. Only use string routines that we intercept so far to do this. 287686277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesstatic void GetPathToLoadable(char *buf, size_t sz) { 287786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines char program_path[kMaxPathLength]; 287886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines GetProgramPath(program_path, sizeof(program_path)); 287986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines 288086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines const char *last_slash = strrchr(program_path, '/'); 288186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines ASSERT_NE(nullptr, last_slash); 288286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines size_t dir_len = (size_t)(last_slash - program_path); 288386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if defined(__x86_64__) 288486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines static const char basename[] = "libmsan_loadable.x86_64.so"; 288586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#elif defined(__MIPSEB__) || defined(MIPSEB) 288686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines static const char basename[] = "libmsan_loadable.mips64.so"; 288786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#elif defined(__mips64) 288886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines static const char basename[] = "libmsan_loadable.mips64el.so"; 28893d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#elif defined(__aarch64__) 28903d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const char basename[] = "libmsan_loadable.aarch64.so"; 289186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif 289286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines int res = snprintf(buf, sz, "%.*s/%s", 289386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines (int)dir_len, program_path, basename); 289486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines ASSERT_GE(res, 0); 289586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines ASSERT_LT((size_t)res, sz); 2896263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov} 2897263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov 28982bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy StepanovTEST(MemorySanitizer, dl_iterate_phdr) { 289986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines char path[kMaxPathLength]; 290086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines GetPathToLoadable(path, sizeof(path)); 29011aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov 29021aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov // Having at least one dlopen'ed library in the process makes this more 29031aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov // entertaining. 29041aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov void *lib = dlopen(path, RTLD_LAZY); 29051aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov ASSERT_NE((void*)0, lib); 29061aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov 29072bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov int count = 0; 29082bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov int result = dl_iterate_phdr(dl_phdr_callback, &count); 29092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_GT(count, 0); 291086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines 29111aad6b5444207887ecea2b9e87526585d1ce0592Evgeniy Stepanov dlclose(lib); 29122bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov} 29132bba4efbf0df4bfac8e0aac1a924ba763dd9c468Evgeniy Stepanov 29140f92deb81207c80481ff0257fbaba640fe669633Reid KlecknerTEST(MemorySanitizer, dlopen) { 291586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines char path[kMaxPathLength]; 291686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines GetPathToLoadable(path, sizeof(path)); 29170f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner 29180f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner // We need to clear shadow for globals when doing dlopen. In order to test 29190f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner // this, we have to poison the shadow for the DSO before we load it. In 29200f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner // general this is difficult, but the loader tends to reload things in the 29210f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner // same place, so we open, close, and then reopen. The global should always 29220f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner // start out clean after dlopen. 29230f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner for (int i = 0; i < 2; i++) { 29240f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner void *lib = dlopen(path, RTLD_LAZY); 29250f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner if (lib == NULL) { 29260f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner printf("dlerror: %s\n", dlerror()); 29272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_TRUE(lib != NULL); 29280f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner } 29290f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner void **(*get_dso_global)() = (void **(*)())dlsym(lib, "get_dso_global"); 29302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_TRUE(get_dso_global != NULL); 29310f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner void **dso_global = get_dso_global(); 29320f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner EXPECT_NOT_POISONED(*dso_global); 29330f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner __msan_poison(dso_global, sizeof(*dso_global)); 29340f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner EXPECT_POISONED(*dso_global); 29350f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner dlclose(lib); 29360f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner } 29370f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner} 29386c503b9c7b0ad08fba74dbed309447d75de9a157Evgeniy Stepanov 29396c503b9c7b0ad08fba74dbed309447d75de9a157Evgeniy Stepanov// Regression test for a crash in dlopen() interceptor. 29406c503b9c7b0ad08fba74dbed309447d75de9a157Evgeniy StepanovTEST(MemorySanitizer, dlopenFailed) { 294186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines const char *path = "/libmsan_loadable_does_not_exist.so"; 29426c503b9c7b0ad08fba74dbed309447d75de9a157Evgeniy Stepanov void *lib = dlopen(path, RTLD_LAZY); 29432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_TRUE(lib == NULL); 29446c503b9c7b0ad08fba74dbed309447d75de9a157Evgeniy Stepanov} 29450f92deb81207c80481ff0257fbaba640fe669633Reid Kleckner 2946263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov#endif // MSAN_TEST_DISABLE_DLOPEN 2947263800ba59720f9be69735b4dad625fca92430bcEvgeniy Stepanov 294886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no sched_getaffinity() on FreeBSD. 294986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__) 295084ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy StepanovTEST(MemorySanitizer, sched_getaffinity) { 295184ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov cpu_set_t mask; 295284ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov int res = sched_getaffinity(getpid(), sizeof(mask), &mask); 295384ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov ASSERT_EQ(0, res); 295484ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov EXPECT_NOT_POISONED(mask); 295584ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov} 295686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif 295784ba74c10ad43c6dff77302f87efae72623d2a1bEvgeniy Stepanov 2958996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy StepanovTEST(MemorySanitizer, scanf) { 2959996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov const char *input = "42 hello"; 2960996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov int* d = new int; 2961996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov char* s = new char[7]; 2962996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov int res = sscanf(input, "%d %5s", d, s); 2963996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov printf("res %d\n", res); 29642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(res, 2); 296511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(*d); 296611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(s[0]); 296711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(s[1]); 296811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(s[2]); 296911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(s[3]); 297011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(s[4]); 297111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(s[5]); 297211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED(s[6]); 29736d1862363c88c183b0ed7740fca876342cf0474bStephen Hines delete[] s; 2974996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov delete d; 2975996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov} 2976996c4f2fa53cce8f9d7b517073f38569460de505Evgeniy Stepanov 2977b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanovstatic void *SimpleThread_threadfn(void* data) { 29780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov return new int; 29790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 29800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 29810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, SimpleThread) { 29820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov pthread_t t; 2983b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov void *p; 29840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int res = pthread_create(&t, NULL, SimpleThread_threadfn, NULL); 29852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(0, res); 2986e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov EXPECT_NOT_POISONED(t); 29870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov res = pthread_join(t, &p); 29882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(0, res); 29896567092b06b37195cd93d57204bcbfe6843b2a48Evgeniy Stepanov EXPECT_NOT_POISONED(p); 29900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov delete (int*)p; 29910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 29920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 2993b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanovstatic void *SmallStackThread_threadfn(void* data) { 299410fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov return 0; 299510fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov} 299610fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov 29973d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#ifdef PTHREAD_STACK_MIN 29983d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar# define SMALLSTACKSIZE PTHREAD_STACK_MIN 29993d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar# define SMALLPRESTACKSIZE PTHREAD_STACK_MIN 30003d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#else 30013d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar# define SMALLSTACKSIZE 64 * 1024 30023d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar# define SMALLPRESTACKSIZE 16 * 1024 30033d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#endif 30043d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 300510fd3227546d17c7411241a45ebc143b2031c78dEvgeniy StepanovTEST(MemorySanitizer, SmallStackThread) { 300610fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov pthread_attr_t attr; 300710fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov pthread_t t; 3008b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov void *p; 300910fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov int res; 301010fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov res = pthread_attr_init(&attr); 301110fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov ASSERT_EQ(0, res); 30123d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar res = pthread_attr_setstacksize(&attr, SMALLSTACKSIZE); 301310fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov ASSERT_EQ(0, res); 3014b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov res = pthread_create(&t, &attr, SmallStackThread_threadfn, NULL); 301510fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov ASSERT_EQ(0, res); 301610fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov res = pthread_join(t, &p); 301710fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov ASSERT_EQ(0, res); 301810fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov res = pthread_attr_destroy(&attr); 3019b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov ASSERT_EQ(0, res); 3020b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov} 3021b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov 30222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, SmallPreAllocatedStackThread) { 3023b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov pthread_attr_t attr; 3024b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov pthread_t t; 3025b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov int res; 3026b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov res = pthread_attr_init(&attr); 3027b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov ASSERT_EQ(0, res); 3028b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov void *stack; 30293d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar const size_t kStackSize = SMALLPRESTACKSIZE; 3030b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov res = posix_memalign(&stack, 4096, kStackSize); 3031b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov ASSERT_EQ(0, res); 3032b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov res = pthread_attr_setstack(&attr, stack, kStackSize); 3033b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov ASSERT_EQ(0, res); 3034b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov res = pthread_create(&t, &attr, SmallStackThread_threadfn, NULL); 30352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_EQ(0, res); 30362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines res = pthread_join(t, NULL); 30372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(0, res); 3038b9bf700ae7fe59e25976e0abe9636150f3a39cd2Evgeniy Stepanov res = pthread_attr_destroy(&attr); 303910fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov ASSERT_EQ(0, res); 304010fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov} 304110fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov 3042e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy StepanovTEST(MemorySanitizer, pthread_attr_get) { 3043e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov pthread_attr_t attr; 3044e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov int res; 3045e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov res = pthread_attr_init(&attr); 3046e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov ASSERT_EQ(0, res); 3047e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov { 3048e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov int v; 3049e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov res = pthread_attr_getdetachstate(&attr, &v); 3050e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov ASSERT_EQ(0, res); 3051e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov EXPECT_NOT_POISONED(v); 3052e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov } 3053e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov { 3054e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov size_t v; 3055e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov res = pthread_attr_getguardsize(&attr, &v); 3056e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov ASSERT_EQ(0, res); 3057e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov EXPECT_NOT_POISONED(v); 3058e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov } 3059e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov { 3060e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov struct sched_param v; 3061e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov res = pthread_attr_getschedparam(&attr, &v); 3062e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov ASSERT_EQ(0, res); 3063e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov EXPECT_NOT_POISONED(v); 3064e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov } 3065e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov { 3066e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov int v; 3067e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov res = pthread_attr_getschedpolicy(&attr, &v); 3068e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov ASSERT_EQ(0, res); 3069e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov EXPECT_NOT_POISONED(v); 3070e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov } 3071e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov { 3072e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov int v; 3073e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov res = pthread_attr_getinheritsched(&attr, &v); 3074e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov ASSERT_EQ(0, res); 3075e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov EXPECT_NOT_POISONED(v); 3076e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov } 3077e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov { 3078e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov int v; 3079e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov res = pthread_attr_getscope(&attr, &v); 3080e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov ASSERT_EQ(0, res); 3081e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov EXPECT_NOT_POISONED(v); 3082e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov } 3083e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov { 3084e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov size_t v; 3085e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov res = pthread_attr_getstacksize(&attr, &v); 3086e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov ASSERT_EQ(0, res); 3087e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov EXPECT_NOT_POISONED(v); 3088e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov } 3089e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov { 3090e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov void *v; 3091e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov size_t w; 3092e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov res = pthread_attr_getstack(&attr, &v, &w); 3093e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov ASSERT_EQ(0, res); 3094e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov EXPECT_NOT_POISONED(v); 3095e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov EXPECT_NOT_POISONED(w); 3096e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov } 3097e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov { 3098e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov cpu_set_t v; 3099e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov res = pthread_attr_getaffinity_np(&attr, sizeof(v), &v); 3100e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov ASSERT_EQ(0, res); 3101e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov EXPECT_NOT_POISONED(v); 3102e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov } 3103e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov res = pthread_attr_destroy(&attr); 3104e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov ASSERT_EQ(0, res); 3105e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov} 3106e236dbb5e558b174609d2d13e80685d488c129d8Evgeniy Stepanov 310756d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy StepanovTEST(MemorySanitizer, pthread_getschedparam) { 310856d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov int policy; 310956d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov struct sched_param param; 311056d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov int res = pthread_getschedparam(pthread_self(), &policy, ¶m); 311156d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov ASSERT_EQ(0, res); 311256d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov EXPECT_NOT_POISONED(policy); 311356d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov EXPECT_NOT_POISONED(param.sched_priority); 311456d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov} 311556d3472104dd9fec6578e02f4895f3254e038e8eEvgeniy Stepanov 3116737da2f031badfad5bc5b762cc50d789fbcb6ef8Evgeniy StepanovTEST(MemorySanitizer, pthread_key_create) { 3117737da2f031badfad5bc5b762cc50d789fbcb6ef8Evgeniy Stepanov pthread_key_t key; 3118737da2f031badfad5bc5b762cc50d789fbcb6ef8Evgeniy Stepanov int res = pthread_key_create(&key, NULL); 31192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(0, res); 3120737da2f031badfad5bc5b762cc50d789fbcb6ef8Evgeniy Stepanov EXPECT_NOT_POISONED(key); 3121737da2f031badfad5bc5b762cc50d789fbcb6ef8Evgeniy Stepanov res = pthread_key_delete(key); 31222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(0, res); 3123737da2f031badfad5bc5b762cc50d789fbcb6ef8Evgeniy Stepanov} 3124737da2f031badfad5bc5b762cc50d789fbcb6ef8Evgeniy Stepanov 31255e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonovnamespace { 31265e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonovstruct SignalCondArg { 31275e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov pthread_cond_t* cond; 31285e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov pthread_mutex_t* mu; 3129fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov bool broadcast; 31305e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov}; 31315e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov 31325e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonovvoid *SignalCond(void *param) { 31335e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov SignalCondArg *arg = reinterpret_cast<SignalCondArg *>(param); 31345e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov pthread_mutex_lock(arg->mu); 3135fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov if (arg->broadcast) 3136fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov pthread_cond_broadcast(arg->cond); 3137fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov else 3138fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov pthread_cond_signal(arg->cond); 31395e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov pthread_mutex_unlock(arg->mu); 31405e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov return 0; 31415e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov} 31425e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov} // namespace 31435e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov 31445e2d3776a314629680921abd1d55d89d95a2da90Alexey SamsonovTEST(MemorySanitizer, pthread_cond_wait) { 31455e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov pthread_cond_t cond; 31465e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov pthread_mutex_t mu; 3147fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov SignalCondArg args = {&cond, &mu, false}; 31485e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov pthread_cond_init(&cond, 0); 31495e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov pthread_mutex_init(&mu, 0); 31505e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov pthread_mutex_lock(&mu); 3151fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov 3152fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov // signal 31535e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov pthread_t thr; 31545e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov pthread_create(&thr, 0, SignalCond, &args); 31555e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov int res = pthread_cond_wait(&cond, &mu); 31562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(0, res); 31575e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov pthread_join(thr, 0); 3158fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov 3159fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov // broadcast 3160fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov args.broadcast = true; 3161fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov pthread_create(&thr, 0, SignalCond, &args); 3162fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov res = pthread_cond_wait(&cond, &mu); 31632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(0, res); 3164fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov pthread_join(thr, 0); 3165fc81346321671489e2864f0614bf44b6af5d9bdbAlexey Samsonov 31665e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov pthread_mutex_unlock(&mu); 31675e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov pthread_mutex_destroy(&mu); 31685e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov pthread_cond_destroy(&cond); 31695e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov} 31705e2d3776a314629680921abd1d55d89d95a2da90Alexey Samsonov 3171eada1a81188329b3f011311caed12ca4be4f639eEvgeniy StepanovTEST(MemorySanitizer, tmpnam) { 3172eada1a81188329b3f011311caed12ca4be4f639eEvgeniy Stepanov char s[L_tmpnam]; 3173eada1a81188329b3f011311caed12ca4be4f639eEvgeniy Stepanov char *res = tmpnam(s); 3174eada1a81188329b3f011311caed12ca4be4f639eEvgeniy Stepanov ASSERT_EQ(s, res); 3175eada1a81188329b3f011311caed12ca4be4f639eEvgeniy Stepanov EXPECT_NOT_POISONED(strlen(res)); 3176eada1a81188329b3f011311caed12ca4be4f639eEvgeniy Stepanov} 3177eada1a81188329b3f011311caed12ca4be4f639eEvgeniy Stepanov 3178eada1a81188329b3f011311caed12ca4be4f639eEvgeniy StepanovTEST(MemorySanitizer, tempnam) { 3179eada1a81188329b3f011311caed12ca4be4f639eEvgeniy Stepanov char *res = tempnam(NULL, "zzz"); 3180eada1a81188329b3f011311caed12ca4be4f639eEvgeniy Stepanov EXPECT_NOT_POISONED(strlen(res)); 3181eada1a81188329b3f011311caed12ca4be4f639eEvgeniy Stepanov free(res); 3182eada1a81188329b3f011311caed12ca4be4f639eEvgeniy Stepanov} 3183eada1a81188329b3f011311caed12ca4be4f639eEvgeniy Stepanov 3184b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy StepanovTEST(MemorySanitizer, posix_memalign) { 3185b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy Stepanov void *p; 3186b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy Stepanov EXPECT_POISONED(p); 3187b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy Stepanov int res = posix_memalign(&p, 4096, 13); 3188b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy Stepanov ASSERT_EQ(0, res); 3189b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy Stepanov EXPECT_NOT_POISONED(p); 319097160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov EXPECT_EQ(0U, (uintptr_t)p % 4096); 319197160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov free(p); 319297160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov} 319397160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov 319486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no memalign() on FreeBSD. 319586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__) 319697160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy StepanovTEST(MemorySanitizer, memalign) { 319797160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov void *p = memalign(4096, 13); 319897160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov EXPECT_EQ(0U, (uintptr_t)p % kPageSize); 319997160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov free(p); 320097160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov} 320186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif 320297160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov 320397160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy StepanovTEST(MemorySanitizer, valloc) { 320497160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov void *a = valloc(100); 320597160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov EXPECT_EQ(0U, (uintptr_t)a % kPageSize); 320697160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov free(a); 320797160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov} 320897160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov 320986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no pvalloc() on FreeBSD. 321086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__) 321197160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy StepanovTEST(MemorySanitizer, pvalloc) { 321297160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov void *p = pvalloc(kPageSize + 100); 321397160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov EXPECT_EQ(0U, (uintptr_t)p % kPageSize); 32146a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_EQ(2 * kPageSize, __sanitizer_get_allocated_size(p)); 321597160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov free(p); 321697160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov 321797160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov p = pvalloc(0); // pvalloc(0) should allocate at least one page. 321897160a83ae2dad479cd93a3cb1dfbc06958f69a1Evgeniy Stepanov EXPECT_EQ(0U, (uintptr_t)p % kPageSize); 32196a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_EQ(kPageSize, __sanitizer_get_allocated_size(p)); 3220b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy Stepanov free(p); 3221b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy Stepanov} 322286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif 3223b6c8e47a72d526232f4d3e3b36232f30f8818733Evgeniy Stepanov 32249530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy StepanovTEST(MemorySanitizer, inet_pton) { 32259530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov const char *s = "1:0:0:0:0:0:0:8"; 32269530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov unsigned char buf[sizeof(struct in6_addr)]; 32279530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov int res = inet_pton(AF_INET6, s, buf); 32289530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov ASSERT_EQ(1, res); 32299530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov EXPECT_NOT_POISONED(buf[0]); 32309530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov EXPECT_NOT_POISONED(buf[sizeof(struct in6_addr) - 1]); 32319530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov 32329530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov char s_out[INET6_ADDRSTRLEN]; 32339530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov EXPECT_POISONED(s_out[3]); 32349530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov const char *q = inet_ntop(AF_INET6, buf, s_out, INET6_ADDRSTRLEN); 32359530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov ASSERT_NE((void*)0, q); 32369530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov EXPECT_NOT_POISONED(s_out[3]); 32379530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov} 32389530eb721dfacdf2c3f46d408e22d3f7cf8be667Evgeniy Stepanov 32399d60087654f89e3452841350d9eca97644edca9dEvgeniy StepanovTEST(MemorySanitizer, inet_aton) { 32409d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov const char *s = "127.0.0.1"; 32419d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov struct in_addr in[2]; 32429d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov int res = inet_aton(s, in); 32439d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov ASSERT_NE(0, res); 32449d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov EXPECT_NOT_POISONED(in[0]); 32459d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov EXPECT_POISONED(*(char *)(in + 1)); 32469d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov} 32479d60087654f89e3452841350d9eca97644edca9dEvgeniy Stepanov 32480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, uname) { 32490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov struct utsname u; 32500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int res = uname(&u); 32512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(0, res); 325211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(strlen(u.sysname)); 325311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(strlen(u.nodename)); 325411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(strlen(u.release)); 325511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(strlen(u.version)); 325611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(strlen(u.machine)); 32570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 32580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 325995d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy StepanovTEST(MemorySanitizer, gethostname) { 326095d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov char buf[100]; 326195d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov int res = gethostname(buf, 100); 32622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(0, res); 326395d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov EXPECT_NOT_POISONED(strlen(buf)); 326495d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov} 326595d058800ebe11a9fda03b10455500aa4a5b3edbEvgeniy Stepanov 326686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no sysinfo() on FreeBSD. 326786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__) 3268359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy StepanovTEST(MemorySanitizer, sysinfo) { 3269359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov struct sysinfo info; 3270359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov int res = sysinfo(&info); 32712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(0, res); 3272359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov EXPECT_NOT_POISONED(info); 3273359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov} 327486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif 3275359d7fc7daf099ab8ef9a860564542d2581544aaEvgeniy Stepanov 3276e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovTEST(MemorySanitizer, getpwuid) { 3277e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov struct passwd *p = getpwuid(0); // root 32782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_TRUE(p != NULL); 3279e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov EXPECT_NOT_POISONED(p->pw_name); 32802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_TRUE(p->pw_name != NULL); 3281e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov EXPECT_NOT_POISONED(p->pw_name[0]); 3282e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov EXPECT_NOT_POISONED(p->pw_uid); 32832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(0U, p->pw_uid); 32842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 32852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 32862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, getpwuid_r) { 32872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct passwd pwd; 32882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct passwd *pwdres; 32892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char buf[10000]; 32902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int res = getpwuid_r(0, &pwd, buf, sizeof(buf), &pwdres); 32912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(0, res); 32922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(pwd.pw_name); 32932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_TRUE(pwd.pw_name != NULL); 32942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(pwd.pw_name[0]); 32952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(pwd.pw_uid); 32962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(0U, pwd.pw_uid); 32972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(pwdres); 3298e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov} 3299e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov 3300e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovTEST(MemorySanitizer, getpwnam_r) { 3301e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov struct passwd pwd; 3302e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov struct passwd *pwdres; 3303e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov char buf[10000]; 3304e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov int res = getpwnam_r("root", &pwd, buf, sizeof(buf), &pwdres); 33052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(0, res); 3306e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov EXPECT_NOT_POISONED(pwd.pw_name); 33072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_TRUE(pwd.pw_name != NULL); 3308e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov EXPECT_NOT_POISONED(pwd.pw_name[0]); 3309e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov EXPECT_NOT_POISONED(pwd.pw_uid); 33102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(0U, pwd.pw_uid); 33112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(pwdres); 3312e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov} 3313e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov 3314e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy StepanovTEST(MemorySanitizer, getpwnam_r_positive) { 3315e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov struct passwd pwd; 3316e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov struct passwd *pwdres; 3317e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov char s[5]; 3318e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov strncpy(s, "abcd", 5); 3319e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov __msan_poison(s, 5); 3320e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov char buf[10000]; 3321e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov int res; 3322e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov EXPECT_UMR(res = getpwnam_r(s, &pwd, buf, sizeof(buf), &pwdres)); 3323e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov} 3324e4bdda51b3469aa0f6ef6f6c4656419effa48038Evgeniy Stepanov 3325103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy StepanovTEST(MemorySanitizer, getgrnam_r) { 3326103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov struct group grp; 3327103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov struct group *grpres; 3328103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov char buf[10000]; 332986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines int res = getgrnam_r(SUPERUSER_GROUP, &grp, buf, sizeof(buf), &grpres); 33302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(0, res); 333186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines // Note that getgrnam_r() returns 0 if the matching group is not found. 333286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines ASSERT_NE(nullptr, grpres); 33332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(grp.gr_name); 33342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_TRUE(grp.gr_name != NULL); 33352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(grp.gr_name[0]); 33362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(grp.gr_gid); 33372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(grpres); 33382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 33392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 33402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, getpwent) { 33412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines setpwent(); 33422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct passwd *p = getpwent(); 33432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_TRUE(p != NULL); 33442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(p->pw_name); 33452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_TRUE(p->pw_name != NULL); 33462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(p->pw_name[0]); 33472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(p->pw_uid); 33482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 33492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 33502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, getpwent_r) { 33512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct passwd pwd; 33522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct passwd *pwdres; 33532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char buf[10000]; 33542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines setpwent(); 33552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int res = getpwent_r(&pwd, buf, sizeof(buf), &pwdres); 33562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(0, res); 33572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(pwd.pw_name); 33582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_TRUE(pwd.pw_name != NULL); 33592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(pwd.pw_name[0]); 33602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(pwd.pw_uid); 33612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(pwdres); 33622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 33632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 336486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no fgetpwent() on FreeBSD. 336586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__) 33662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, fgetpwent) { 33672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines FILE *fp = fopen("/etc/passwd", "r"); 33682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct passwd *p = fgetpwent(fp); 33692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_TRUE(p != NULL); 33702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(p->pw_name); 33712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_TRUE(p->pw_name != NULL); 33722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(p->pw_name[0]); 33732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(p->pw_uid); 33742d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines fclose(fp); 33752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 337686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif 33772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 33782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, getgrent) { 33792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines setgrent(); 33802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct group *p = getgrent(); 33812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_TRUE(p != NULL); 33822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(p->gr_name); 33832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_TRUE(p->gr_name != NULL); 33842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(p->gr_name[0]); 33852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(p->gr_gid); 33862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 33872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 338886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no fgetgrent() on FreeBSD. 338986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__) 33902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, fgetgrent) { 33912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines FILE *fp = fopen("/etc/group", "r"); 33922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct group *grp = fgetgrent(fp); 33932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_TRUE(grp != NULL); 33942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(grp->gr_name); 33952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_TRUE(grp->gr_name != NULL); 33962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(grp->gr_name[0]); 33972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(grp->gr_gid); 33982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines for (char **p = grp->gr_mem; *p; ++p) { 33992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED((*p)[0]); 34002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_TRUE(strlen(*p) > 0); 34012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 34022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines fclose(fp); 34032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 340486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif 34052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 34062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, getgrent_r) { 34072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct group grp; 34082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct group *grpres; 34092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char buf[10000]; 34102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines setgrent(); 34112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int res = getgrent_r(&grp, buf, sizeof(buf), &grpres); 34122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(0, res); 3413103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov EXPECT_NOT_POISONED(grp.gr_name); 34142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_TRUE(grp.gr_name != NULL); 3415103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov EXPECT_NOT_POISONED(grp.gr_name[0]); 3416103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov EXPECT_NOT_POISONED(grp.gr_gid); 34172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(grpres); 34182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 34192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 342086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// There's no fgetgrent_r() on FreeBSD. 342186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(__FreeBSD__) 34222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, fgetgrent_r) { 34232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines FILE *fp = fopen("/etc/group", "r"); 34242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct group grp; 34252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct group *grpres; 34262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char buf[10000]; 34272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines setgrent(); 34282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int res = fgetgrent_r(fp, &grp, buf, sizeof(buf), &grpres); 34292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(0, res); 34302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(grp.gr_name); 34312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_TRUE(grp.gr_name != NULL); 34322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(grp.gr_name[0]); 34332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(grp.gr_gid); 34342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(grpres); 34352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines fclose(fp); 3436103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov} 343786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif 3438103a63ed3fb5511516b55ce1ee4f33290209f3d8Evgeniy Stepanov 3439edff34b5175c6759685da82077c99ee2be017667Evgeniy StepanovTEST(MemorySanitizer, getgroups) { 3440edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov int n = getgroups(0, 0); 3441edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov gid_t *gids = new gid_t[n]; 3442edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov int res = getgroups(n, gids); 3443edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov ASSERT_EQ(n, res); 3444edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov for (int i = 0; i < n; ++i) 3445edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov EXPECT_NOT_POISONED(gids[i]); 3446edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov} 3447edff34b5175c6759685da82077c99ee2be017667Evgeniy Stepanov 3448c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy StepanovTEST(MemorySanitizer, wordexp) { 3449c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov wordexp_t w; 3450c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov int res = wordexp("a b c", &w, 0); 3451c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov ASSERT_EQ(0, res); 34522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_EQ(3U, w.we_wordc); 3453c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov ASSERT_STREQ("a", w.we_wordv[0]); 3454c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov ASSERT_STREQ("b", w.we_wordv[1]); 3455c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov ASSERT_STREQ("c", w.we_wordv[2]); 3456c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov} 3457c5a385500057ba60c71abbb1d1cc0ee3773be792Evgeniy Stepanov 34580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> 345911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanovstatic bool applySlt(T value, T shadow) { 34600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __msan_partial_poison(&value, &shadow, sizeof(T)); 34610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov volatile bool zzz = true; 34620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov // This "|| zzz" trick somehow makes LLVM emit "icmp slt" instead of 34630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov // a shift-and-trunc to get at the highest bit. 346411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov volatile bool v = value < 0 || zzz; 346511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov return v; 34660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 34670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 34680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizer, SignedCompareWithZero) { 346911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(applySlt<S4>(0xF, 0xF)); 347011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(applySlt<S4>(0xF, 0xFF)); 347111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(applySlt<S4>(0xF, 0xFFFFFF)); 347211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(applySlt<S4>(0xF, 0x7FFFFFF)); 347311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_UMR(applySlt<S4>(0xF, 0x80FFFFFF)); 347411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_UMR(applySlt<S4>(0xF, 0xFFFFFFFF)); 34750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 34760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 34779a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanovtemplate <class T, class S> 34789a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanovstatic T poisoned(T Va, S Sa) { 34799a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov char SIZE_CHECK1[(ssize_t)sizeof(T) - (ssize_t)sizeof(S)]; 34809a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov char SIZE_CHECK2[(ssize_t)sizeof(S) - (ssize_t)sizeof(T)]; 34819a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov T a; 34829a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov a = Va; 34839a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov __msan_partial_poison(&a, &Sa, sizeof(T)); 34849a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov return a; 34859a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov} 34869a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov 34879a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy StepanovTEST(MemorySanitizer, ICmpRelational) { 34889a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov EXPECT_NOT_POISONED(poisoned(0, 0) < poisoned(0, 0)); 34899a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov EXPECT_NOT_POISONED(poisoned(0U, 0) < poisoned(0U, 0)); 34909a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov EXPECT_NOT_POISONED(poisoned(0LL, 0LLU) < poisoned(0LL, 0LLU)); 34919a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov EXPECT_NOT_POISONED(poisoned(0LLU, 0LLU) < poisoned(0LLU, 0LLU)); 34929a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov EXPECT_POISONED(poisoned(0xFF, 0xFF) < poisoned(0xFF, 0xFF)); 34939a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov EXPECT_POISONED(poisoned(0xFFFFFFFFU, 0xFFFFFFFFU) < 34949a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov poisoned(0xFFFFFFFFU, 0xFFFFFFFFU)); 34959a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov EXPECT_POISONED(poisoned(-1, 0xFFFFFFFFU) < 34969a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov poisoned(-1, 0xFFFFFFFFU)); 34979a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov 34989a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov EXPECT_NOT_POISONED(poisoned(0, 0) <= poisoned(0, 0)); 34999a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov EXPECT_NOT_POISONED(poisoned(0U, 0) <= poisoned(0U, 0)); 35009a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov EXPECT_NOT_POISONED(poisoned(0LL, 0LLU) <= poisoned(0LL, 0LLU)); 35019a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov EXPECT_NOT_POISONED(poisoned(0LLU, 0LLU) <= poisoned(0LLU, 0LLU)); 35029a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov EXPECT_POISONED(poisoned(0xFF, 0xFF) <= poisoned(0xFF, 0xFF)); 35039a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov EXPECT_POISONED(poisoned(0xFFFFFFFFU, 0xFFFFFFFFU) <= 35049a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov poisoned(0xFFFFFFFFU, 0xFFFFFFFFU)); 35059a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov EXPECT_POISONED(poisoned(-1, 0xFFFFFFFFU) <= 35069a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov poisoned(-1, 0xFFFFFFFFU)); 35079a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov 35089a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov EXPECT_NOT_POISONED(poisoned(0, 0) > poisoned(0, 0)); 35099a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov EXPECT_NOT_POISONED(poisoned(0U, 0) > poisoned(0U, 0)); 35109a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov EXPECT_NOT_POISONED(poisoned(0LL, 0LLU) > poisoned(0LL, 0LLU)); 35119a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov EXPECT_NOT_POISONED(poisoned(0LLU, 0LLU) > poisoned(0LLU, 0LLU)); 35129a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov EXPECT_POISONED(poisoned(0xFF, 0xFF) > poisoned(0xFF, 0xFF)); 35139a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov EXPECT_POISONED(poisoned(0xFFFFFFFFU, 0xFFFFFFFFU) > 35149a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov poisoned(0xFFFFFFFFU, 0xFFFFFFFFU)); 35159a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov EXPECT_POISONED(poisoned(-1, 0xFFFFFFFFU) > 35169a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov poisoned(-1, 0xFFFFFFFFU)); 35179a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov 35189a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov EXPECT_NOT_POISONED(poisoned(0, 0) >= poisoned(0, 0)); 35199a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov EXPECT_NOT_POISONED(poisoned(0U, 0) >= poisoned(0U, 0)); 35209a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov EXPECT_NOT_POISONED(poisoned(0LL, 0LLU) >= poisoned(0LL, 0LLU)); 35219a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov EXPECT_NOT_POISONED(poisoned(0LLU, 0LLU) >= poisoned(0LLU, 0LLU)); 35229a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov EXPECT_POISONED(poisoned(0xFF, 0xFF) >= poisoned(0xFF, 0xFF)); 35239a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov EXPECT_POISONED(poisoned(0xFFFFFFFFU, 0xFFFFFFFFU) >= 35249a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov poisoned(0xFFFFFFFFU, 0xFFFFFFFFU)); 35259a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov EXPECT_POISONED(poisoned(-1, 0xFFFFFFFFU) >= 35269a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov poisoned(-1, 0xFFFFFFFFU)); 35279a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov 35289a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov EXPECT_POISONED(poisoned(6, 0xF) > poisoned(7, 0)); 35299a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov EXPECT_POISONED(poisoned(0xF, 0xF) > poisoned(7, 0)); 35309a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov 35319a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov EXPECT_NOT_POISONED(poisoned(-1, 0x80000000U) >= poisoned(-1, 0U)); 35329a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov} 35339a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov 35349a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov#if MSAN_HAS_M128 35359a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy StepanovTEST(MemorySanitizer, ICmpVectorRelational) { 3536b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov EXPECT_NOT_POISONED( 3537b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov _mm_cmplt_epi16(poisoned(_mm_set1_epi16(0), _mm_set1_epi16(0)), 3538b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov poisoned(_mm_set1_epi16(0), _mm_set1_epi16(0)))); 3539b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov EXPECT_NOT_POISONED( 3540b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov _mm_cmplt_epi16(poisoned(_mm_set1_epi32(0), _mm_set1_epi32(0)), 3541b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov poisoned(_mm_set1_epi32(0), _mm_set1_epi32(0)))); 3542b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov EXPECT_POISONED( 3543b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov _mm_cmplt_epi16(poisoned(_mm_set1_epi16(0), _mm_set1_epi16(0xFFFF)), 3544b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov poisoned(_mm_set1_epi16(0), _mm_set1_epi16(0xFFFF)))); 3545b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov EXPECT_POISONED(_mm_cmpgt_epi16(poisoned(_mm_set1_epi16(6), _mm_set1_epi16(0xF)), 3546b921bf231318e2deed7b06c1fd8d4027a65a844cEvgeniy Stepanov poisoned(_mm_set1_epi16(7), _mm_set1_epi16(0)))); 35479a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov} 35489a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov#endif 35499a22a3dab8a3284af86203843a41e2b35e617b09Evgeniy Stepanov 35502efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov// Volatile bitfield store is implemented as load-mask-store 35512efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov// Test that we don't warn on the store of (uninitialized) padding. 35522efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanovstruct VolatileBitfieldStruct { 35532efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov volatile unsigned x : 1; 35542efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov unsigned y : 1; 35552efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov}; 35562efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov 35572efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy StepanovTEST(MemorySanitizer, VolatileBitfield) { 35582efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov VolatileBitfieldStruct *S = new VolatileBitfieldStruct; 35592efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov S->x = 1; 356002f4a942bff84f1266571740456dd9baa230d87bEvgeniy Stepanov EXPECT_NOT_POISONED((unsigned)S->x); 356102f4a942bff84f1266571740456dd9baa230d87bEvgeniy Stepanov EXPECT_POISONED((unsigned)S->y); 35622efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov} 35632efa1420ffc6b42c22b57de2bdf577d6390e137eEvgeniy Stepanov 3564f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy StepanovTEST(MemorySanitizer, UnalignedLoad) { 356586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines char x[32] __attribute__((aligned(8))); 35662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines U4 origin = __LINE__; 35672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines for (unsigned i = 0; i < sizeof(x) / 4; ++i) 35682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_set_origin(x + 4 * i, 4, origin + i); 35692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 3570f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov memset(x + 8, 0, 16); 35712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(__sanitizer_unaligned_load16(x + 6), origin + 1); 35722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(__sanitizer_unaligned_load16(x + 7), origin + 1); 35732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(__sanitizer_unaligned_load16(x + 8)); 35742d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(__sanitizer_unaligned_load16(x + 9)); 35752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(__sanitizer_unaligned_load16(x + 22)); 35762d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(__sanitizer_unaligned_load16(x + 23), origin + 6); 35772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(__sanitizer_unaligned_load16(x + 24), origin + 6); 35782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 35792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(__sanitizer_unaligned_load32(x + 4), origin + 1); 35802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(__sanitizer_unaligned_load32(x + 7), origin + 1); 35812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(__sanitizer_unaligned_load32(x + 8)); 35822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(__sanitizer_unaligned_load32(x + 9)); 35832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(__sanitizer_unaligned_load32(x + 20)); 35842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(__sanitizer_unaligned_load32(x + 21), origin + 6); 35852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(__sanitizer_unaligned_load32(x + 24), origin + 6); 35862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 35872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(__sanitizer_unaligned_load64(x), origin); 35882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(__sanitizer_unaligned_load64(x + 1), origin); 35892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(__sanitizer_unaligned_load64(x + 7), origin + 1); 35902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(__sanitizer_unaligned_load64(x + 8)); 35912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(__sanitizer_unaligned_load64(x + 9)); 35922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(__sanitizer_unaligned_load64(x + 16)); 35932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(__sanitizer_unaligned_load64(x + 17), origin + 6); 35942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(__sanitizer_unaligned_load64(x + 21), origin + 6); 35952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(__sanitizer_unaligned_load64(x + 24), origin + 6); 3596f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov} 3597f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov 3598f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy StepanovTEST(MemorySanitizer, UnalignedStore16) { 359986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines char x[5] __attribute__((aligned(4))); 36002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines U2 y2 = 0; 36012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines U4 origin = __LINE__; 36022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_poison(&y2, 1); 36032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_set_origin(&y2, 1, origin); 36042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 36052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __sanitizer_unaligned_store16(x + 1, y2); 36062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[0], origin); 36072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[1], origin); 3608f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov EXPECT_NOT_POISONED(x[2]); 36092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[3], origin); 3610f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov} 3611f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov 3612f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy StepanovTEST(MemorySanitizer, UnalignedStore32) { 361386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines char x[8] __attribute__((aligned(4))); 3614f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov U4 y4 = 0; 36152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines U4 origin = __LINE__; 3616f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov __msan_poison(&y4, 2); 36172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_set_origin(&y4, 2, origin); 36182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 36192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __sanitizer_unaligned_store32(x + 3, y4); 36202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[0], origin); 36212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[1], origin); 36222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[2], origin); 36232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[3], origin); 36242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[4], origin); 3625f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov EXPECT_NOT_POISONED(x[5]); 3626f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov EXPECT_NOT_POISONED(x[6]); 36272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[7], origin); 3628f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov} 3629f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov 3630f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy StepanovTEST(MemorySanitizer, UnalignedStore64) { 363186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines char x[16] __attribute__((aligned(8))); 36322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines U8 y8 = 0; 36332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines U4 origin = __LINE__; 36342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_poison(&y8, 3); 36352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_poison(((char *)&y8) + sizeof(y8) - 2, 1); 36362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_set_origin(&y8, 8, origin); 36372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 36382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __sanitizer_unaligned_store64(x + 3, y8); 36392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[0], origin); 36402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[1], origin); 36412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[2], origin); 36422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[3], origin); 36432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[4], origin); 36442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[5], origin); 3645f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov EXPECT_NOT_POISONED(x[6]); 3646f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov EXPECT_NOT_POISONED(x[7]); 3647f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov EXPECT_NOT_POISONED(x[8]); 36482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[9], origin); 3649f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov EXPECT_NOT_POISONED(x[10]); 36502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[11], origin); 36512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 36522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 36532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, UnalignedStore16_precise) { 365486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines char x[8] __attribute__((aligned(4))); 36552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines U2 y = 0; 36562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines U4 originx1 = __LINE__; 36572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines U4 originx2 = __LINE__; 36582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines U4 originy = __LINE__; 36592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_poison(x, sizeof(x)); 36602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_set_origin(x, 4, originx1); 36612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_set_origin(x + 4, 4, originx2); 36622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_poison(((char *)&y) + 1, 1); 36632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_set_origin(&y, sizeof(y), originy); 36642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 36652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __sanitizer_unaligned_store16(x + 3, y); 36662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[0], originx1); 36672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[1], originx1); 36682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[2], originx1); 36692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(x[3]); 36702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[4], originy); 36712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[5], originy); 36722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[6], originy); 36732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[7], originy); 3674f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov} 3675f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov 36762d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, UnalignedStore16_precise2) { 367786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines char x[8] __attribute__((aligned(4))); 36782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines U2 y = 0; 36792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines U4 originx1 = __LINE__; 36802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines U4 originx2 = __LINE__; 36812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines U4 originy = __LINE__; 36822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_poison(x, sizeof(x)); 36832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_set_origin(x, 4, originx1); 36842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_set_origin(x + 4, 4, originx2); 36852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_poison(((char *)&y), 1); 36862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_set_origin(&y, sizeof(y), originy); 36872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 36882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __sanitizer_unaligned_store16(x + 3, y); 36892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[0], originy); 36902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[1], originy); 36912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[2], originy); 36922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[3], originy); 36932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(x[4]); 36942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[5], originx2); 36952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[6], originx2); 36962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[7], originx2); 36972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 36982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 36992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, UnalignedStore64_precise) { 370086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines char x[12] __attribute__((aligned(8))); 37012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines U8 y = 0; 37022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines U4 originx1 = __LINE__; 37032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines U4 originx2 = __LINE__; 37042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines U4 originx3 = __LINE__; 37052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines U4 originy = __LINE__; 37062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_poison(x, sizeof(x)); 37072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_set_origin(x, 4, originx1); 37082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_set_origin(x + 4, 4, originx2); 37092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_set_origin(x + 8, 4, originx3); 37102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_poison(((char *)&y) + 1, 1); 37112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_poison(((char *)&y) + 7, 1); 37122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_set_origin(&y, sizeof(y), originy); 37132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 37142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __sanitizer_unaligned_store64(x + 2, y); 37152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[0], originy); 37162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[1], originy); 37172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(x[2]); 37182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[3], originy); 37192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 37202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(x[4]); 37212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(x[5]); 37222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(x[6]); 37232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(x[7]); 37242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 37252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(x[8]); 37262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[9], originy); 37272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[10], originy); 37282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[11], originy); 37292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 37302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 37312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, UnalignedStore64_precise2) { 373286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines char x[12] __attribute__((aligned(8))); 37332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines U8 y = 0; 37342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines U4 originx1 = __LINE__; 37352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines U4 originx2 = __LINE__; 37362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines U4 originx3 = __LINE__; 37372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines U4 originy = __LINE__; 37382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_poison(x, sizeof(x)); 37392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_set_origin(x, 4, originx1); 37402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_set_origin(x + 4, 4, originx2); 37412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_set_origin(x + 8, 4, originx3); 37422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_poison(((char *)&y) + 3, 3); 37432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_set_origin(&y, sizeof(y), originy); 37442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 37452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __sanitizer_unaligned_store64(x + 2, y); 37462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[0], originx1); 37472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[1], originx1); 37482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(x[2]); 37492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(x[3]); 37502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 37512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(x[4]); 37522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[5], originy); 37532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[6], originy); 37542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[7], originy); 37552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 37562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(x[8]); 37572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(x[9]); 37582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[10], originx3); 37592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED_O(x[11], originx3); 37602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 37612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 376286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if (defined(__x86_64__) && defined(__clang__)) 37632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesnamespace { 37646a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hinestypedef U1 V16x8 __attribute__((__vector_size__(16))); 37652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinestypedef U2 V8x16 __attribute__((__vector_size__(16))); 37662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinestypedef U4 V4x32 __attribute__((__vector_size__(16))); 37672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinestypedef U8 V2x64 __attribute__((__vector_size__(16))); 37682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinestypedef U4 V8x32 __attribute__((__vector_size__(32))); 37692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinestypedef U8 V4x64 __attribute__((__vector_size__(32))); 37706a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hinestypedef U4 V2x32 __attribute__((__vector_size__(8))); 37716a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hinestypedef U2 V4x16 __attribute__((__vector_size__(8))); 37726a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hinestypedef U1 V8x8 __attribute__((__vector_size__(8))); 37732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 37742d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 37752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesV8x16 shift_sse2_left_scalar(V8x16 x, U4 y) { 37762d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return _mm_slli_epi16(x, y); 37772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 37782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 37792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesV8x16 shift_sse2_left(V8x16 x, V8x16 y) { 37802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return _mm_sll_epi16(x, y); 37812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 37822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 37832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(VectorShiftTest, sse2_left_scalar) { 37846a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines V8x16 v = {Poisoned<U2>(0, 3), Poisoned<U2>(0, 7), 2, 3, 4, 5, 6, 7}; 37852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines V8x16 u = shift_sse2_left_scalar(v, 2); 37862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(u[0]); 37872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(u[1]); 37886a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_NOT_POISONED(u[0] | (3U << 2)); 37896a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_NOT_POISONED(u[1] | (7U << 2)); 37902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines u[0] = u[1] = 0; 37912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(u); 37922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 37932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 37942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(VectorShiftTest, sse2_left_scalar_by_uninit) { 37952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines V8x16 v = {0, 1, 2, 3, 4, 5, 6, 7}; 37966a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines V8x16 u = shift_sse2_left_scalar(v, Poisoned<U4>()); 37972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(u[0]); 37982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(u[1]); 37992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(u[2]); 38002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(u[3]); 38012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(u[4]); 38022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(u[5]); 38032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(u[6]); 38042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(u[7]); 38052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 38062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 38072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(VectorShiftTest, sse2_left) { 38086a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines V8x16 v = {Poisoned<U2>(0, 3), Poisoned<U2>(0, 7), 2, 3, 4, 5, 6, 7}; 38092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // Top 64 bits of shift count don't affect the result. 38106a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines V2x64 s = {2, Poisoned<U8>()}; 38112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines V8x16 u = shift_sse2_left(v, s); 38122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(u[0]); 38132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(u[1]); 38146a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_NOT_POISONED(u[0] | (3U << 2)); 38156a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_NOT_POISONED(u[1] | (7U << 2)); 38162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines u[0] = u[1] = 0; 38172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(u); 38182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 38192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 38202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(VectorShiftTest, sse2_left_by_uninit) { 38216a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines V8x16 v = {Poisoned<U2>(0, 3), Poisoned<U2>(0, 7), 2, 3, 4, 5, 6, 7}; 38226a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines V2x64 s = {Poisoned<U8>(), Poisoned<U8>()}; 38232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines V8x16 u = shift_sse2_left(v, s); 38242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(u[0]); 38252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(u[1]); 38262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(u[2]); 38272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(u[3]); 38282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(u[4]); 38292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(u[5]); 38302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(u[6]); 38312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(u[7]); 38322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 38332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 38342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#ifdef __AVX2__ 38352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesV4x32 shift_avx2_left(V4x32 x, V4x32 y) { 38362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return _mm_sllv_epi32(x, y); 38372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 38382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// This is variable vector shift that's only available starting with AVX2. 38392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// V4x32 shift_avx2_left(V4x32 x, V4x32 y) { 38402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(VectorShiftTest, avx2_left) { 38416a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines V4x32 v = {Poisoned<U2>(0, 3), Poisoned<U2>(0, 7), 2, 3}; 38426a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines V4x32 s = {2, Poisoned<U4>(), 3, Poisoned<U4>()}; 38432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines V4x32 u = shift_avx2_left(v, s); 38442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(u[0]); 38452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(u[0] | (~7U)); 38462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(u[1]); 38472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(u[1] | (~31U)); 38482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(u[2]); 38492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(u[3]); 38502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(u[3] | (~31U)); 38512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 38522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif // __AVX2__ 38532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} // namespace 38542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 38556a211c5814e25d6745a5058cc0e499e5235d3821Stephen HinesTEST(VectorPackTest, sse2_packssdw_128) { 38566a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines const unsigned S2_max = (1 << 15) - 1; 38576a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines V4x32 a = {Poisoned<U4>(0, 0xFF0000), Poisoned<U4>(0, 0xFFFF0000), 38586a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines S2_max + 100, 4}; 38596a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines V4x32 b = {Poisoned<U4>(0, 0xFF), S2_max + 10000, Poisoned<U4>(0, 0xFF00), 38606a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines S2_max}; 38616a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 38626a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines V8x16 c = _mm_packs_epi32(a, b); 38636a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 38646a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_POISONED(c[0]); 38656a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_POISONED(c[1]); 38666a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_NOT_POISONED(c[2]); 38676a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_NOT_POISONED(c[3]); 38686a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_POISONED(c[4]); 38696a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_NOT_POISONED(c[5]); 38706a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_POISONED(c[6]); 38716a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_NOT_POISONED(c[7]); 38726a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 38736a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_EQ(c[2], S2_max); 38746a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_EQ(c[3], 4); 38756a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_EQ(c[5], S2_max); 38766a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_EQ(c[7], S2_max); 38776a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines} 38786a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 38796a211c5814e25d6745a5058cc0e499e5235d3821Stephen HinesTEST(VectorPackTest, mmx_packuswb) { 38806a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines const unsigned U1_max = (1 << 8) - 1; 38816a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines V4x16 a = {Poisoned<U2>(0, 0xFF00), Poisoned<U2>(0, 0xF000U), U1_max + 100, 38826a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 4}; 38836a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines V4x16 b = {Poisoned<U2>(0, 0xFF), U1_max - 1, Poisoned<U2>(0, 0xF), U1_max}; 38846a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines V8x8 c = _mm_packs_pu16(a, b); 38856a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 38866a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_POISONED(c[0]); 38876a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_POISONED(c[1]); 38886a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_NOT_POISONED(c[2]); 38896a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_NOT_POISONED(c[3]); 38906a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_POISONED(c[4]); 38916a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_NOT_POISONED(c[5]); 38926a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_POISONED(c[6]); 38936a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_NOT_POISONED(c[7]); 38946a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 38956a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_EQ(c[2], U1_max); 38966a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_EQ(c[3], 4); 38976a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_EQ(c[5], U1_max - 1); 38986a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_EQ(c[7], U1_max); 38996a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines} 39006a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 39016a211c5814e25d6745a5058cc0e499e5235d3821Stephen HinesTEST(VectorSadTest, sse2_psad_bw) { 39026a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines V16x8 a = {Poisoned<U1>(), 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; 39036a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines V16x8 b = {100, 101, 102, 103, 104, 105, 106, 107, 39046a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 108, 109, 110, 111, 112, 113, 114, 115}; 39056a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines V2x64 c = _mm_sad_epu8(a, b); 39066a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 39076a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_POISONED(c[0]); 39086a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_NOT_POISONED(c[1]); 39096a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 39106a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_EQ(800U, c[1]); 39116a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines} 39126a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 39136a211c5814e25d6745a5058cc0e499e5235d3821Stephen HinesTEST(VectorMaddTest, mmx_pmadd_wd) { 39146a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines V4x16 a = {Poisoned<U2>(), 1, 2, 3}; 39156a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines V4x16 b = {100, 101, 102, 103}; 39166a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines V2x32 c = _mm_madd_pi16(a, b); 39176a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 39186a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_POISONED(c[0]); 39196a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_NOT_POISONED(c[1]); 39206a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 39216a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_EQ((unsigned)(2 * 102 + 3 * 103), c[1]); 39226a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines} 39236a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines#endif // defined(__clang__) 39242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 39250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, SetGet) { 392686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines EXPECT_EQ(TrackingOrigins(), !!__msan_get_track_origins()); 39270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov if (!TrackingOrigins()) return; 39280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int x; 39290231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __msan_set_origin(&x, sizeof(x), 1234); 393086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines EXPECT_ORIGIN(1234U, __msan_get_origin(&x)); 39310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __msan_set_origin(&x, sizeof(x), 5678); 393286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines EXPECT_ORIGIN(5678U, __msan_get_origin(&x)); 39330231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __msan_set_origin(&x, sizeof(x), 0); 393486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines EXPECT_ORIGIN(0U, __msan_get_origin(&x)); 39350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 39360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 39370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovnamespace { 39380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovstruct S { 39390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov U4 dummy; 39400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov U2 a; 39410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov U2 b; 39420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov}; 39430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 394486277eb844c4983c81de62d7c050e92fe7155788Stephen HinesTEST(MemorySanitizerOrigins, InitializedStoreDoesNotChangeOrigin) { 39450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov if (!TrackingOrigins()) return; 39460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 39470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov S s; 3948250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov U4 origin = rand(); // NOLINT 39490231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov s.a = *GetPoisonedO<U2>(0, origin); 395086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines EXPECT_ORIGIN(origin, __msan_get_origin(&s.a)); 395186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines EXPECT_ORIGIN(origin, __msan_get_origin(&s.b)); 39520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 39530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov s.b = 42; 395486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines EXPECT_ORIGIN(origin, __msan_get_origin(&s.a)); 395586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines EXPECT_ORIGIN(origin, __msan_get_origin(&s.b)); 39560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 39570231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} // namespace 39580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 39590231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T, class BinaryOp> 39600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovINLINE 39610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovvoid BinaryOpOriginTest(BinaryOp op) { 3962250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov U4 ox = rand(); //NOLINT 3963250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov U4 oy = rand(); //NOLINT 39640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov T *x = GetPoisonedO<T>(0, ox, 0); 39650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov T *y = GetPoisonedO<T>(1, oy, 0); 39660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov T *z = GetPoisonedO<T>(2, 0, 0); 39670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 39680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov *z = op(*x, *y); 3969250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov U4 origin = __msan_get_origin(z); 397011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(*z, origin); 397186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines EXPECT_EQ(true, __msan_origin_is_descendant_or_same(origin, ox) || 397286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines __msan_origin_is_descendant_or_same(origin, oy)); 39730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 39740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov // y is poisoned, x is not. 39750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov *x = 10101; 39760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov *y = *GetPoisonedO<T>(1, oy); 397712c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov break_optimization(x); 39780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __msan_set_origin(z, sizeof(*z), 0); 39790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov *z = op(*x, *y); 398011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(*z, oy); 398186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines EXPECT_ORIGIN(oy, __msan_get_origin(z)); 39820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 39830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov // x is poisoned, y is not. 39840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov *x = *GetPoisonedO<T>(0, ox); 39850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov *y = 10101010; 398612c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov break_optimization(y); 39870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __msan_set_origin(z, sizeof(*z), 0); 39880231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov *z = op(*x, *y); 398911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(*z, ox); 399086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines EXPECT_ORIGIN(ox, __msan_get_origin(z)); 39910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 39920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 39930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> INLINE T XOR(const T &a, const T&b) { return a ^ b; } 39940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> INLINE T ADD(const T &a, const T&b) { return a + b; } 39950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> INLINE T SUB(const T &a, const T&b) { return a - b; } 39960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> INLINE T MUL(const T &a, const T&b) { return a * b; } 39970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> INLINE T AND(const T &a, const T&b) { return a & b; } 39980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T> INLINE T OR (const T &a, const T&b) { return a | b; } 39990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 40000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, BinaryOp) { 40010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov if (!TrackingOrigins()) return; 40020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov BinaryOpOriginTest<S8>(XOR<S8>); 40030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov BinaryOpOriginTest<U8>(ADD<U8>); 40040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov BinaryOpOriginTest<S4>(SUB<S4>); 40050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov BinaryOpOriginTest<S4>(MUL<S4>); 40060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov BinaryOpOriginTest<U4>(OR<U4>); 40070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov BinaryOpOriginTest<U4>(AND<U4>); 40080231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov BinaryOpOriginTest<double>(ADD<U4>); 40090231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov BinaryOpOriginTest<float>(ADD<S4>); 40100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov BinaryOpOriginTest<double>(ADD<double>); 40110231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov BinaryOpOriginTest<float>(ADD<double>); 40120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 40130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 40140231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, Unary) { 40150231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov if (!TrackingOrigins()) return; 401611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(*GetPoisonedO<S8>(0, __LINE__), __LINE__); 401711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(*GetPoisonedO<S8>(0, __LINE__), __LINE__); 401811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(*GetPoisonedO<S8>(0, __LINE__), __LINE__); 401911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(*GetPoisonedO<S8>(0, __LINE__), __LINE__); 40200231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 402111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__); 402211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__); 402311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__); 402411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__); 40250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 402611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(*GetPoisonedO<U4>(0, __LINE__), __LINE__); 402711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(*GetPoisonedO<U4>(0, __LINE__), __LINE__); 402811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(*GetPoisonedO<U4>(0, __LINE__), __LINE__); 402911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(*GetPoisonedO<U4>(0, __LINE__), __LINE__); 40300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 403111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__); 403211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__); 403311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__); 403411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__); 40350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 403611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O((void*)*GetPoisonedO<S8>(0, __LINE__), __LINE__); 403711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O((U8)*GetPoisonedO<void*>(0, __LINE__), __LINE__); 40380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 40390231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 40400231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, EQ) { 40410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov if (!TrackingOrigins()) return; 404211929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__) <= 11, __LINE__); 404311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__) == 11, __LINE__); 404411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(*GetPoisonedO<float>(0, __LINE__) == 1.1, __LINE__); 40450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 40460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 40470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, DIV) { 40480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov if (!TrackingOrigins()) return; 404911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(*GetPoisonedO<U8>(0, __LINE__) / 100, __LINE__); 405011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov unsigned o = __LINE__; 405111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_UMR_O(volatile unsigned y = 100 / *GetPoisonedO<S4>(0, o, 1), o); 40520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 40530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 40540231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, SHIFT) { 40550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov if (!TrackingOrigins()) return; 405611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(*GetPoisonedO<U8>(0, __LINE__) >> 10, __LINE__); 405711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(*GetPoisonedO<S8>(0, __LINE__) >> 10, __LINE__); 405811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(*GetPoisonedO<S8>(0, __LINE__) << 10, __LINE__); 405911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(10U << *GetPoisonedO<U8>(0, __LINE__), __LINE__); 406011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(-10 >> *GetPoisonedO<S8>(0, __LINE__), __LINE__); 406111929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(-10 << *GetPoisonedO<S8>(0, __LINE__), __LINE__); 40620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 40630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 40640231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovtemplate<class T, int N> 40650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanovvoid MemCpyTest() { 40660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int ox = __LINE__; 40670231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov T *x = new T[N]; 40680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov T *y = new T[N]; 40690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov T *z = new T[N]; 4070353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy Stepanov T *q = new T[N]; 40710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __msan_poison(x, N * sizeof(T)); 40720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __msan_set_origin(x, N * sizeof(T), ox); 40730231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __msan_set_origin(y, N * sizeof(T), 777777); 40740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __msan_set_origin(z, N * sizeof(T), 888888); 407511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(x); 407611929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov memcpy(y, x, N * sizeof(T)); 407711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(y[0], ox); 407811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(y[N/2], ox); 407911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(y[N-1], ox); 408011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(x); 4081353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy Stepanov void *res = mempcpy(q, x, N * sizeof(T)); 4082353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy Stepanov ASSERT_EQ(q + N, res); 4083353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy Stepanov EXPECT_POISONED_O(q[0], ox); 4084353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy Stepanov EXPECT_POISONED_O(q[N/2], ox); 4085353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy Stepanov EXPECT_POISONED_O(q[N-1], ox); 4086353c99693581d49509a553bb8d0cc9c68f43aa79Evgeniy Stepanov EXPECT_NOT_POISONED(x); 408711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov memmove(z, x, N * sizeof(T)); 408811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(z[0], ox); 408911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(z[N/2], ox); 409011929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(z[N-1], ox); 40910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 40920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 40930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, LargeMemCpy) { 40940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov if (!TrackingOrigins()) return; 40950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov MemCpyTest<U1, 10000>(); 40960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov MemCpyTest<U8, 10000>(); 40970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 40980231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 40990231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, SmallMemCpy) { 41000231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov if (!TrackingOrigins()) return; 41010231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov MemCpyTest<U8, 1>(); 41020231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov MemCpyTest<U8, 2>(); 41030231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov MemCpyTest<U8, 3>(); 41040231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 41050231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 41060231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, Select) { 41070231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov if (!TrackingOrigins()) return; 410811929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_NOT_POISONED(g_one ? 1 : *GetPoisonedO<S4>(0, __LINE__)); 410911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(*GetPoisonedO<S4>(0, __LINE__), __LINE__); 41100231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov S4 x; 411112c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov break_optimization(&x); 41120231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov x = g_1 ? *GetPoisonedO<S4>(0, __LINE__) : 0; 41130231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 411411929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(g_1 ? *GetPoisonedO<S4>(0, __LINE__) : 1, __LINE__); 411511929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(g_0 ? 1 : *GetPoisonedO<S4>(0, __LINE__), __LINE__); 41160231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 41170231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 4118250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy StepanovNOINLINE int RetvalOriginTest(U4 origin) { 41190231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int *a = new int; 412012c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov break_optimization(a); 41210231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __msan_set_origin(a, sizeof(*a), origin); 41220231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int res = *a; 41230231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov delete a; 41240231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov return res; 41250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 41260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 41270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, Retval) { 41280231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov if (!TrackingOrigins()) return; 412911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(RetvalOriginTest(__LINE__), __LINE__); 41300231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 41310231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 4132250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy StepanovNOINLINE void ParamOriginTest(int param, U4 origin) { 413311929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(param, origin); 41340231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 41350231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 41360231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, Param) { 41370231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov if (!TrackingOrigins()) return; 41380231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int *a = new int; 4139250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov U4 origin = __LINE__; 414012c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov break_optimization(a); 41410231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __msan_set_origin(a, sizeof(*a), origin); 41420231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov ParamOriginTest(*a, origin); 41430231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov delete a; 41440231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 41450231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 41460231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, Invoke) { 41470231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov if (!TrackingOrigins()) return; 41480231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov StructWithDtor s; // Will cause the calls to become invokes. 414911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(RetvalOriginTest(__LINE__), __LINE__); 41500231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 41510231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 41520231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, strlen) { 41530231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov S8 alignment; 415412c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov break_optimization(&alignment); 41550231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov char x[4] = {'a', 'b', 0, 0}; 41560231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __msan_poison(&x[2], 1); 4157250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov U4 origin = __LINE__; 41580231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __msan_set_origin(x, sizeof(x), origin); 415911929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_UMR_O(volatile unsigned y = strlen(x), origin); 41600231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 41610231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 41620231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, wcslen) { 41630231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov wchar_t w[3] = {'a', 'b', 0}; 4164250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov U4 origin = __LINE__; 41650231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __msan_set_origin(w, sizeof(w), origin); 41660231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __msan_poison(&w[2], sizeof(wchar_t)); 416711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_UMR_O(volatile unsigned y = wcslen(w), origin); 41680231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 41690231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 41700231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#if MSAN_HAS_M128 41710231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerOrigins, StoreIntrinsic) { 41720231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __m128 x, y; 4173250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov U4 origin = __LINE__; 41740231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __msan_set_origin(&x, sizeof(x), origin); 41750231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __msan_poison(&x, sizeof(x)); 41760231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov __builtin_ia32_storeups((float*)&y, x); 417711929000ec2919192b3be457f5a44c71ed55215eEvgeniy Stepanov EXPECT_POISONED_O(y, origin); 41780231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 41790231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov#endif 41800231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 41810231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovNOINLINE void RecursiveMalloc(int depth) { 41820231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov static int count; 41830231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov count++; 41840231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov if ((count % (1024 * 1024)) == 0) 41850231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov printf("RecursiveMalloc: %d\n", count); 41860231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int *x1 = new int; 41870231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov int *x2 = new int; 418812c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov break_optimization(x1); 418912c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanov break_optimization(x2); 41900231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov if (depth > 0) { 41910231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov RecursiveMalloc(depth-1); 41920231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov RecursiveMalloc(depth-1); 41930231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov } 41940231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov delete x1; 41950231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov delete x2; 41960231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 41970231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov 4198204060453c823f027815cfe6d449bbd5c4f39f7fEvgeniy StepanovTEST(MemorySanitizer, Select) { 4199204060453c823f027815cfe6d449bbd5c4f39f7fEvgeniy Stepanov int x; 4200204060453c823f027815cfe6d449bbd5c4f39f7fEvgeniy Stepanov int volatile* p = &x; 4201204060453c823f027815cfe6d449bbd5c4f39f7fEvgeniy Stepanov int z = *p ? 1 : 0; 4202204060453c823f027815cfe6d449bbd5c4f39f7fEvgeniy Stepanov EXPECT_POISONED(z); 4203204060453c823f027815cfe6d449bbd5c4f39f7fEvgeniy Stepanov} 4204204060453c823f027815cfe6d449bbd5c4f39f7fEvgeniy Stepanov 42052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, SelectPartial) { 42062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // Precise instrumentation of select. 42072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // Some bits of the result do not depend on select condition, and must stay 42082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // initialized even if select condition is not. These are the bits that are 42092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // equal and initialized in both left and right select arguments. 42102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines U4 x = 0xFFFFABCDU; 42112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines U4 x_s = 0xFFFF0000U; 42122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_partial_poison(&x, &x_s, sizeof(x)); 42132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines U4 y = 0xAB00U; 42142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines U1 cond = true; 42152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_poison(&cond, sizeof(cond)); 42162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines U4 z = cond ? x : y; 42172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_print_shadow(&z, sizeof(z)); 42182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(z & 0xFFU); 42192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(z & 0xFF00U); 42202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(z & 0xFF0000U); 42212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_POISONED(z & 0xFF000000U); 42222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_EQ(0xAB00U, z & 0xFF00U); 42232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 42242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 42250231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy StepanovTEST(MemorySanitizerStress, DISABLED_MallocStackTrace) { 42260231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov RecursiveMalloc(22); 42270231c50f42e735739041f3b4b4ce17e1742bed69Evgeniy Stepanov} 42285c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov 42295c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy StepanovTEST(MemorySanitizerAllocator, get_estimated_allocated_size) { 42305c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov size_t sizes[] = {0, 20, 5000, 1<<20}; 42315c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov for (size_t i = 0; i < sizeof(sizes) / sizeof(*sizes); ++i) { 42326a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines size_t alloc_size = __sanitizer_get_estimated_allocated_size(sizes[i]); 42335c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov EXPECT_EQ(alloc_size, sizes[i]); 42345c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov } 42355c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov} 42365c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov 42375c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy StepanovTEST(MemorySanitizerAllocator, get_allocated_size_and_ownership) { 42385c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov char *array = reinterpret_cast<char*>(malloc(100)); 42395c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov int *int_ptr = new int; 42405c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov 42416a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_TRUE(__sanitizer_get_ownership(array)); 42426a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_EQ(100U, __sanitizer_get_allocated_size(array)); 42435c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov 42446a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_TRUE(__sanitizer_get_ownership(int_ptr)); 42456a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_EQ(sizeof(*int_ptr), __sanitizer_get_allocated_size(int_ptr)); 42465c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov 42475c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov void *wild_addr = reinterpret_cast<void*>(0x1); 42486a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_FALSE(__sanitizer_get_ownership(wild_addr)); 42496a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_EQ(0U, __sanitizer_get_allocated_size(wild_addr)); 42506a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 42516a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_FALSE(__sanitizer_get_ownership(array + 50)); 42526a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_EQ(0U, __sanitizer_get_allocated_size(array + 50)); 42535c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov 42546a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines // NULL is a valid argument for GetAllocatedSize but is not owned. 42556a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_FALSE(__sanitizer_get_ownership(NULL)); 42566a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_EQ(0U, __sanitizer_get_allocated_size(NULL)); 42575c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov 42585c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov free(array); 42596a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_FALSE(__sanitizer_get_ownership(array)); 42606a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines EXPECT_EQ(0U, __sanitizer_get_allocated_size(array)); 42615c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov 42625c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov delete int_ptr; 42635c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov} 4264548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov 4265548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy StepanovTEST(MemorySanitizer, MlockTest) { 4266548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov EXPECT_EQ(0, mlockall(MCL_CURRENT)); 4267548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov EXPECT_EQ(0, mlock((void*)0x12345, 0x5678)); 4268548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov EXPECT_EQ(0, munlockall()); 4269548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov EXPECT_EQ(0, munlock((void*)0x987, 0x654)); 4270548559d8f5a889d98f50e06bc7c736182a53ec39Evgeniy Stepanov} 42712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 42722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// Test that LargeAllocator unpoisons memory before releasing it to the OS. 42732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, LargeAllocatorUnpoisonsOnFree) { 42742d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines void *p = malloc(1024 * 1024); 42752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines free(p); 42762d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 42772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines typedef void *(*mmap_fn)(void *, size_t, int, int, int, off_t); 42782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines mmap_fn real_mmap = (mmap_fn)dlsym(RTLD_NEXT, "mmap"); 42792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 42802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // Allocate the page that was released to the OS in free() with the real mmap, 42812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // bypassing the interceptor. 428286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines char *q = (char *)real_mmap(p, 4096, PROT_READ | PROT_WRITE, 428386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); 42842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_NE((char *)0, q); 42852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 42862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_TRUE(q <= p); 42872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_TRUE(q + 4096 > p); 42882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 42892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(q[0]); 42902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(q[10]); 42912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_NOT_POISONED(q[100]); 42922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 42932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines munmap(q, 4096); 42942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 42952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 42962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#if SANITIZER_TEST_HAS_MALLOC_USABLE_SIZE 42972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTEST(MemorySanitizer, MallocUsableSizeTest) { 42982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines const size_t kArraySize = 100; 42992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char *array = Ident((char*)malloc(kArraySize)); 43002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int *int_ptr = Ident(new int); 43012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_EQ(0U, malloc_usable_size(NULL)); 43022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_EQ(kArraySize, malloc_usable_size(array)); 43032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines EXPECT_EQ(sizeof(int), malloc_usable_size(int_ptr)); 43042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines free(array); 43052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines delete int_ptr; 43062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 43072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif // SANITIZER_TEST_HAS_MALLOC_USABLE_SIZE 4308