sanitizer_libc_test.cc revision 4c9317a7b61e136f832d2ede70f557963fd46bce
15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//===-- sanitizer_libc_test.cc --------------------------------------------===// 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// The LLVM Compiler Infrastructure 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// This file is distributed under the University of Illinois Open Source 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// License. See LICENSE.TXT for details. 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//===----------------------------------------------------------------------===// 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Tests for sanitizer_libc.h. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//===----------------------------------------------------------------------===// 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "sanitizer_common/sanitizer_common.h" 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "sanitizer_common/sanitizer_libc.h" 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "gtest/gtest.h" 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if defined(__linux__) || defined(__APPLE__) 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# define SANITIZER_TEST_HAS_STAT_H 1 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# include <sys/stat.h> 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#else 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# define SANITIZER_TEST_HAS_STAT_H 0 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// A regression test for internal_memmove() implementation. 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST(SanitizerCommon, InternalMemmoveRegression) { 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) char src[] = "Hello World"; 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) char *dest = src + 6; 2753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) __sanitizer::internal_memmove(dest, src, 5); 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_EQ(dest[0], src[0]); 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_EQ(dest[4], src[4]); 3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} 3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)TEST(SanitizerCommon, mem_is_zero) { 3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) size_t size = 128; 3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) char *x = new char[size]; 3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) memset(x, 0, size); 36e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch for (size_t pos = 0; pos < size; pos++) { 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) x[pos] = 1; 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t beg = 0; beg < size; beg++) { 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t end = beg; end < size; end++) { 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // fprintf(stderr, "pos %zd beg %zd end %zd \n", pos, beg, end); 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (beg <= pos && pos < end) 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_FALSE(__sanitizer::mem_is_zero(x + beg, end - beg)); 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_TRUE(__sanitizer::mem_is_zero(x + beg, end - beg)); 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) x[pos] = 0; 4853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) delete [] x; 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST(SanitizerCommon, FileOps) { 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const char *str1 = "qwerty"; 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) uptr len1 = internal_strlen(str1); 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const char *str2 = "zxcv"; 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) uptr len2 = internal_strlen(str2); 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const char kTempFileName[] = "/tmp/sanitizer_common.tmp"; 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fd_t fd = OpenFile(kTempFileName, true); 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_NE(fd, kInvalidFd); 61591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch EXPECT_EQ(len1, internal_write(fd, str1, len1)); 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_EQ(len2, internal_write(fd, str2, len2)); 63f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) internal_close(fd); 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fd = OpenFile(kTempFileName, false); 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_NE(fd, kInvalidFd); 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) uptr fsize = internal_filesize(fd); 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_EQ(len1 + len2, fsize); 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if SANITIZER_TEST_HAS_STAT_H 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) struct stat st1, st2, st3; 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_EQ(0, internal_stat(kTempFileName, &st1)); 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_EQ(0, internal_lstat(kTempFileName, &st2)); 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_EQ(0, internal_fstat(fd, &st3)); 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_EQ(fsize, (uptr)st3.st_size); 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) char buf[64] = {}; 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_EQ(len1, internal_read(fd, buf, len1)); 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_EQ(0, internal_memcmp(buf, str1, len1)); 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_EQ((char)0, buf[len1 + 1]); 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) internal_memset(buf, 0, len1); 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_EQ(len2, internal_read(fd, buf, len2)); 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_EQ(0, internal_memcmp(buf, str2, len2)); 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) internal_close(fd); 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)