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