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)