sanitizer_libc_test.cc revision 366984e3aa286f7b4fb45f5c9e703f2768c407ed
1//===-- sanitizer_libc_test.cc --------------------------------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// Tests for sanitizer_libc.h. 10//===----------------------------------------------------------------------===// 11 12#include "sanitizer_common/sanitizer_common.h" 13#include "sanitizer_common/sanitizer_libc.h" 14#include "gtest/gtest.h" 15 16#if defined(__linux__) || defined(__APPLE__) 17# define SANITIZER_TEST_HAS_STAT_H 1 18# include <sys/stat.h> 19#else 20# define SANITIZER_TEST_HAS_STAT_H 0 21#endif 22 23// A regression test for internal_memmove() implementation. 24TEST(SanitizerCommon, InternalMemmoveRegression) { 25 char src[] = "Hello World"; 26 char *dest = src + 6; 27 __sanitizer::internal_memmove(dest, src, 5); 28 EXPECT_EQ(dest[0], src[0]); 29 EXPECT_EQ(dest[4], src[4]); 30} 31 32TEST(SanitizerCommon, mem_is_zero) { 33 size_t size = 128; 34 char *x = new char[size]; 35 memset(x, 0, size); 36 for (size_t pos = 0; pos < size; pos++) { 37 x[pos] = 1; 38 for (size_t beg = 0; beg < size; beg++) { 39 for (size_t end = beg; end < size; end++) { 40 // fprintf(stderr, "pos %zd beg %zd end %zd \n", pos, beg, end); 41 if (beg <= pos && pos < end) 42 EXPECT_FALSE(__sanitizer::mem_is_zero(x + beg, end - beg)); 43 else 44 EXPECT_TRUE(__sanitizer::mem_is_zero(x + beg, end - beg)); 45 } 46 } 47 x[pos] = 0; 48 } 49 delete [] x; 50} 51 52TEST(SanitizerCommon, FileOps) { 53 const char *str1 = "qwerty"; 54 uptr len1 = internal_strlen(str1); 55 const char *str2 = "zxcv"; 56 uptr len2 = internal_strlen(str2); 57 58 u32 uid = GetUid(); 59 char temp_filename[128]; 60 internal_snprintf(temp_filename, sizeof(temp_filename), 61 "/tmp/sanitizer_common.tmp.%d", uid); 62 fd_t fd = OpenFile(temp_filename, true); 63 EXPECT_NE(fd, kInvalidFd); 64 EXPECT_EQ(len1, internal_write(fd, str1, len1)); 65 EXPECT_EQ(len2, internal_write(fd, str2, len2)); 66 internal_close(fd); 67 68 fd = OpenFile(temp_filename, false); 69 EXPECT_NE(fd, kInvalidFd); 70 uptr fsize = internal_filesize(fd); 71 EXPECT_EQ(len1 + len2, fsize); 72 73#if SANITIZER_TEST_HAS_STAT_H 74 struct stat st1, st2, st3; 75 EXPECT_EQ(0, internal_stat(temp_filename, &st1)); 76 EXPECT_EQ(0, internal_lstat(temp_filename, &st2)); 77 EXPECT_EQ(0, internal_fstat(fd, &st3)); 78 EXPECT_EQ(fsize, (uptr)st3.st_size); 79#endif 80 81 char buf[64] = {}; 82 EXPECT_EQ(len1, internal_read(fd, buf, len1)); 83 EXPECT_EQ(0, internal_memcmp(buf, str1, len1)); 84 EXPECT_EQ((char)0, buf[len1 + 1]); 85 internal_memset(buf, 0, len1); 86 EXPECT_EQ(len2, internal_read(fd, buf, len2)); 87 EXPECT_EQ(0, internal_memcmp(buf, str2, len2)); 88 internal_close(fd); 89} 90