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.
TEST(SanitizerCommon,InternalMemmoveRegression)24 TEST(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
TEST(SanitizerCommon,mem_is_zero)32 TEST(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
TEST(SanitizerCommon,FileOps)52 TEST(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 #ifdef __ANDROID__
61 // I don't know a way to query temp directory location on Android without
62 // going through Java interfaces. The code below is not ideal, but should
63 // work. May require "adb root", but it is needed for almost any use of ASan
64 // on Android already.
65 internal_snprintf(temp_filename, sizeof(temp_filename),
66 "%s/sanitizer_common.tmp.%d",
67 GetEnv("EXTERNAL_STORAGE"), uid);
68 #else
69 internal_snprintf(temp_filename, sizeof(temp_filename),
70 "/tmp/sanitizer_common.tmp.%d", uid);
71 #endif
72 fd_t fd = OpenFile(temp_filename, true);
73 EXPECT_NE(fd, kInvalidFd);
74 EXPECT_EQ(len1, internal_write(fd, str1, len1));
75 EXPECT_EQ(len2, internal_write(fd, str2, len2));
76 internal_close(fd);
77
78 fd = OpenFile(temp_filename, false);
79 EXPECT_NE(fd, kInvalidFd);
80 uptr fsize = internal_filesize(fd);
81 EXPECT_EQ(len1 + len2, fsize);
82
83 #if SANITIZER_TEST_HAS_STAT_H
84 struct stat st1, st2, st3;
85 EXPECT_EQ(0, internal_stat(temp_filename, &st1));
86 EXPECT_EQ(0, internal_lstat(temp_filename, &st2));
87 EXPECT_EQ(0, internal_fstat(fd, &st3));
88 EXPECT_EQ(fsize, (uptr)st3.st_size);
89 #endif
90
91 char buf[64] = {};
92 EXPECT_EQ(len1, internal_read(fd, buf, len1));
93 EXPECT_EQ(0, internal_memcmp(buf, str1, len1));
94 EXPECT_EQ((char)0, buf[len1 + 1]);
95 internal_memset(buf, 0, len1);
96 EXPECT_EQ(len2, internal_read(fd, buf, len2));
97 EXPECT_EQ(0, internal_memcmp(buf, str2, len2));
98 internal_close(fd);
99 }
100