Home | History | Annotate | Download | only in tests
      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 "sanitizer_common/sanitizer_platform.h"
     15 #include "gtest/gtest.h"
     16 
     17 #if SANITIZER_LINUX || SANITIZER_MAC
     18 # define SANITIZER_TEST_HAS_STAT_H 1
     19 # include <sys/stat.h>
     20 #else
     21 # define SANITIZER_TEST_HAS_STAT_H 0
     22 #endif
     23 
     24 // A regression test for internal_memmove() implementation.
     25 TEST(SanitizerCommon, InternalMemmoveRegression) {
     26   char src[] = "Hello World";
     27   char *dest = src + 6;
     28   __sanitizer::internal_memmove(dest, src, 5);
     29   EXPECT_EQ(dest[0], src[0]);
     30   EXPECT_EQ(dest[4], src[4]);
     31 }
     32 
     33 TEST(SanitizerCommon, mem_is_zero) {
     34   size_t size = 128;
     35   char *x = new char[size];
     36   memset(x, 0, size);
     37   for (size_t pos = 0; pos < size; pos++) {
     38     x[pos] = 1;
     39     for (size_t beg = 0; beg < size; beg++) {
     40       for (size_t end = beg; end < size; end++) {
     41         // fprintf(stderr, "pos %zd beg %zd end %zd \n", pos, beg, end);
     42         if (beg <= pos && pos < end)
     43           EXPECT_FALSE(__sanitizer::mem_is_zero(x + beg, end - beg));
     44         else
     45           EXPECT_TRUE(__sanitizer::mem_is_zero(x + beg, end - beg));
     46       }
     47     }
     48     x[pos] = 0;
     49   }
     50   delete [] x;
     51 }
     52 
     53 struct stat_and_more {
     54   struct stat st;
     55   unsigned char z;
     56 };
     57 
     58 // FIXME: File manipulations are not yet supported on Windows
     59 #if !defined(_WIN32)
     60 TEST(SanitizerCommon, FileOps) {
     61   const char *str1 = "qwerty";
     62   uptr len1 = internal_strlen(str1);
     63   const char *str2 = "zxcv";
     64   uptr len2 = internal_strlen(str2);
     65 
     66   u32 uid = GetUid();
     67   char temp_filename[128];
     68 #if SANITIZER_ANDROID
     69   // I don't know a way to query temp directory location on Android without
     70   // going through Java interfaces. The code below is not ideal, but should
     71   // work. May require "adb root", but it is needed for almost any use of ASan
     72   // on Android already.
     73   internal_snprintf(temp_filename, sizeof(temp_filename),
     74                     "%s/sanitizer_common.tmp.%d",
     75                     GetEnv("EXTERNAL_STORAGE"), uid);
     76 #else
     77   internal_snprintf(temp_filename, sizeof(temp_filename),
     78                     "/tmp/sanitizer_common.tmp.%d", uid);
     79 #endif
     80   uptr openrv = OpenFile(temp_filename, true);
     81   EXPECT_FALSE(internal_iserror(openrv));
     82   fd_t fd = openrv;
     83   EXPECT_EQ(len1, internal_write(fd, str1, len1));
     84   EXPECT_EQ(len2, internal_write(fd, str2, len2));
     85   internal_close(fd);
     86 
     87   openrv = OpenFile(temp_filename, false);
     88   EXPECT_FALSE(internal_iserror(openrv));
     89   fd = openrv;
     90   uptr fsize = internal_filesize(fd);
     91   EXPECT_EQ(len1 + len2, fsize);
     92 
     93 #if SANITIZER_TEST_HAS_STAT_H
     94   struct stat st1, st2, st3;
     95   EXPECT_EQ(0u, internal_stat(temp_filename, &st1));
     96   EXPECT_EQ(0u, internal_lstat(temp_filename, &st2));
     97   EXPECT_EQ(0u, internal_fstat(fd, &st3));
     98   EXPECT_EQ(fsize, (uptr)st3.st_size);
     99 
    100   // Verify that internal_fstat does not write beyond the end of the supplied
    101   // buffer.
    102   struct stat_and_more sam;
    103   memset(&sam, 0xAB, sizeof(sam));
    104   EXPECT_EQ(0u, internal_fstat(fd, &sam.st));
    105   EXPECT_EQ(0xAB, sam.z);
    106   EXPECT_NE(0xAB, sam.st.st_size);
    107   EXPECT_NE(0, sam.st.st_size);
    108 #endif
    109 
    110   char buf[64] = {};
    111   EXPECT_EQ(len1, internal_read(fd, buf, len1));
    112   EXPECT_EQ(0, internal_memcmp(buf, str1, len1));
    113   EXPECT_EQ((char)0, buf[len1 + 1]);
    114   internal_memset(buf, 0, len1);
    115   EXPECT_EQ(len2, internal_read(fd, buf, len2));
    116   EXPECT_EQ(0, internal_memcmp(buf, str2, len2));
    117   internal_close(fd);
    118 }
    119 #endif
    120 
    121 TEST(SanitizerCommon, InternalStrFunctions) {
    122   const char *haystack = "haystack";
    123   EXPECT_EQ(haystack + 2, internal_strchr(haystack, 'y'));
    124   EXPECT_EQ(haystack + 2, internal_strchrnul(haystack, 'y'));
    125   EXPECT_EQ(0, internal_strchr(haystack, 'z'));
    126   EXPECT_EQ(haystack + 8, internal_strchrnul(haystack, 'z'));
    127 }
    128