sanitizer_libc_test.cc revision 2be3a283939d4fc14ad86f6cd8be34b1468f22ba
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 52struct stat_and_more { 53 struct stat st; 54 unsigned char z; 55}; 56 57TEST(SanitizerCommon, FileOps) { 58 const char *str1 = "qwerty"; 59 uptr len1 = internal_strlen(str1); 60 const char *str2 = "zxcv"; 61 uptr len2 = internal_strlen(str2); 62 63 u32 uid = GetUid(); 64 char temp_filename[128]; 65#ifdef __ANDROID__ 66 // I don't know a way to query temp directory location on Android without 67 // going through Java interfaces. The code below is not ideal, but should 68 // work. May require "adb root", but it is needed for almost any use of ASan 69 // on Android already. 70 internal_snprintf(temp_filename, sizeof(temp_filename), 71 "%s/sanitizer_common.tmp.%d", 72 GetEnv("EXTERNAL_STORAGE"), uid); 73#else 74 internal_snprintf(temp_filename, sizeof(temp_filename), 75 "/tmp/sanitizer_common.tmp.%d", uid); 76#endif 77 fd_t fd = OpenFile(temp_filename, true); 78 EXPECT_NE(fd, kInvalidFd); 79 EXPECT_EQ(len1, internal_write(fd, str1, len1)); 80 EXPECT_EQ(len2, internal_write(fd, str2, len2)); 81 internal_close(fd); 82 83 fd = OpenFile(temp_filename, false); 84 EXPECT_NE(fd, kInvalidFd); 85 uptr fsize = internal_filesize(fd); 86 EXPECT_EQ(len1 + len2, fsize); 87 88#if SANITIZER_TEST_HAS_STAT_H 89 struct stat st1, st2, st3; 90 EXPECT_EQ(0, internal_stat(temp_filename, &st1)); 91 EXPECT_EQ(0, internal_lstat(temp_filename, &st2)); 92 EXPECT_EQ(0, internal_fstat(fd, &st3)); 93 EXPECT_EQ(fsize, (uptr)st3.st_size); 94 95 // Verify that internal_fstat does not write beyond the end of the supplied 96 // buffer. 97 struct stat_and_more sam; 98 memset(&sam, 0xAB, sizeof(sam)); 99 EXPECT_EQ(0, internal_fstat(fd, &sam.st)); 100 EXPECT_EQ(0xAB, sam.z); 101 EXPECT_NE(0xAB, sam.st.st_size); 102 EXPECT_NE(0, sam.st.st_size); 103#endif 104 105 char buf[64] = {}; 106 EXPECT_EQ(len1, internal_read(fd, buf, len1)); 107 EXPECT_EQ(0, internal_memcmp(buf, str1, len1)); 108 EXPECT_EQ((char)0, buf[len1 + 1]); 109 internal_memset(buf, 0, len1); 110 EXPECT_EQ(len2, internal_read(fd, buf, len2)); 111 EXPECT_EQ(0, internal_memcmp(buf, str2, len2)); 112 internal_close(fd); 113} 114 115