1b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea/* 2b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * Copyright (C) 2012 The Android Open Source Project 3b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * 4b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * Licensed under the Apache License, Version 2.0 (the "License"); 5b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * you may not use this file except in compliance with the License. 6b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * You may obtain a copy of the License at 7b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * 8b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * http://www.apache.org/licenses/LICENSE-2.0 9b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * 10b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * Unless required by applicable law or agreed to in writing, software 11b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * distributed under the License is distributed on an "AS IS" BASIS, 12b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * See the License for the specific language governing permissions and 14b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * limitations under the License. 15b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea */ 16b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 17416d7ddaff0946d480b6aa945a741b3eeaca5569Elliott Hughes#define _GNU_SOURCE 1 18416d7ddaff0946d480b6aa945a741b3eeaca5569Elliott Hughes 1909c39d6df0e952620f8c1751377b559a04e023aaElliott Hughes#include <string.h> 20b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 21b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#include <errno.h> 2209c39d6df0e952620f8c1751377b559a04e023aaElliott Hughes#include <gtest/gtest.h> 23e5fdaa4f9d102461a4d8a865e6ca84666893b9e7Dan Albert#include <malloc.h> 24036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#include <math.h> 25b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 26b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris#include "buffer_tests.h" 27b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 281468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris#if defined(__BIONIC__) 291468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris#define STRLCPY_SUPPORTED 301468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris#define STRLCAT_SUPPORTED 311468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris#endif 321468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris 33036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#define KB 1024 34036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#define SMALL 1*KB 35b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris#define MEDIUM 4*KB 36036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#define LARGE 64*KB 37036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 38036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonovastatic int signum(int i) { 39036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (i < 0) { 40036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova return -1; 41036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else if (i > 0) { 42036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova return 1; 43036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 44036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova return 0; 45036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 46036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 47b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina TirdeaTEST(string, strerror) { 48b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea // Valid. 49b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Success", strerror(0)); 50b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Operation not permitted", strerror(1)); 51b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 52b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea // Invalid. 53e6e60065ff093ff8c859ab146cf543531cb1967cElliott Hughes ASSERT_STREQ("Unknown error -1", strerror(-1)); 54b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown error 1234", strerror(1234)); 55b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea} 56b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 57f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#if defined(__BIONIC__) 58ad88a0863110798cef5169dcf917e18b967a7cf6Elliott Hughesstatic void* ConcurrentStrErrorFn(void*) { 59b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea bool equal = (strcmp("Unknown error 2002", strerror(2002)) == 0); 60b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea return reinterpret_cast<void*>(equal); 61b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea} 62f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#endif // __BIONIC__ 63b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 64f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris// glibc's strerror isn't thread safe, only its strsignal. 65b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina TirdeaTEST(string, strerror_concurrent) { 66f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#if defined(__BIONIC__) 67b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea const char* strerror1001 = strerror(1001); 68b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown error 1001", strerror1001); 69b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 70b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea pthread_t t; 71b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(0, pthread_create(&t, NULL, ConcurrentStrErrorFn, NULL)); 72b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea void* result; 73b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(0, pthread_join(t, &result)); 74b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_TRUE(static_cast<bool>(result)); 75b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 76b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown error 1001", strerror1001); 77f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#else // __BIONIC__ 781468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris GTEST_LOG_(INFO) << "Skipping test, requires a thread safe strerror."; 79f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#endif // __BIONIC__ 80b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea} 81ad88a0863110798cef5169dcf917e18b967a7cf6Elliott Hughes 82416d7ddaff0946d480b6aa945a741b3eeaca5569Elliott HughesTEST(string, gnu_strerror_r) { 83b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea char buf[256]; 84b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 85416d7ddaff0946d480b6aa945a741b3eeaca5569Elliott Hughes // Note that glibc doesn't necessarily write into the buffer. 86416d7ddaff0946d480b6aa945a741b3eeaca5569Elliott Hughes 87b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea // Valid. 88416d7ddaff0946d480b6aa945a741b3eeaca5569Elliott Hughes ASSERT_STREQ("Success", strerror_r(0, buf, sizeof(buf))); 89416d7ddaff0946d480b6aa945a741b3eeaca5569Elliott Hughes#if defined(__BIONIC__) 90b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Success", buf); 91416d7ddaff0946d480b6aa945a741b3eeaca5569Elliott Hughes#endif 92416d7ddaff0946d480b6aa945a741b3eeaca5569Elliott Hughes ASSERT_STREQ("Operation not permitted", strerror_r(1, buf, sizeof(buf))); 93416d7ddaff0946d480b6aa945a741b3eeaca5569Elliott Hughes#if defined(__BIONIC__) 94b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Operation not permitted", buf); 95416d7ddaff0946d480b6aa945a741b3eeaca5569Elliott Hughes#endif 96b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 97b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea // Invalid. 98416d7ddaff0946d480b6aa945a741b3eeaca5569Elliott Hughes ASSERT_STREQ("Unknown error -1", strerror_r(-1, buf, sizeof(buf))); 99606058933c5129cb1026960ea67624b9426c610fNick Kralevich ASSERT_STREQ("Unknown error -1", buf); 100416d7ddaff0946d480b6aa945a741b3eeaca5569Elliott Hughes ASSERT_STREQ("Unknown error 1234", strerror_r(1234, buf, sizeof(buf))); 101b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown error 1234", buf); 102b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 103b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea // Buffer too small. 104416d7ddaff0946d480b6aa945a741b3eeaca5569Elliott Hughes errno = 0; 105416d7ddaff0946d480b6aa945a741b3eeaca5569Elliott Hughes memset(buf, 0, sizeof(buf)); 106416d7ddaff0946d480b6aa945a741b3eeaca5569Elliott Hughes ASSERT_EQ(buf, strerror_r(4567, buf, 2)); 107416d7ddaff0946d480b6aa945a741b3eeaca5569Elliott Hughes ASSERT_STREQ("U", buf); 108416d7ddaff0946d480b6aa945a741b3eeaca5569Elliott Hughes // The GNU strerror_r doesn't set errno (the POSIX one sets it to ERANGE). 109416d7ddaff0946d480b6aa945a741b3eeaca5569Elliott Hughes ASSERT_EQ(0, errno); 110b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea} 111b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 112b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina TirdeaTEST(string, strsignal) { 113b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea // A regular signal. 114b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Hangup", strsignal(1)); 115b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 116b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea // A real-time signal. 1170990d4fda898ada86e557f872f5cb7d16b138e3cElliott Hughes ASSERT_STREQ("Real-time signal 14", strsignal(SIGRTMIN + 14)); 1180990d4fda898ada86e557f872f5cb7d16b138e3cElliott Hughes // One of the signals the C library keeps to itself. 1190990d4fda898ada86e557f872f5cb7d16b138e3cElliott Hughes ASSERT_STREQ("Unknown signal 32", strsignal(__SIGRTMIN)); 120b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 121b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea // Errors. 122b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown signal -1", strsignal(-1)); // Too small. 123b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown signal 0", strsignal(0)); // Still too small. 124b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown signal 1234", strsignal(1234)); // Too large. 125b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea} 126b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 127ad88a0863110798cef5169dcf917e18b967a7cf6Elliott Hughesstatic void* ConcurrentStrSignalFn(void*) { 128b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea bool equal = (strcmp("Unknown signal 2002", strsignal(2002)) == 0); 129b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea return reinterpret_cast<void*>(equal); 130b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea} 131b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 132b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina TirdeaTEST(string, strsignal_concurrent) { 133b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea const char* strsignal1001 = strsignal(1001); 134b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown signal 1001", strsignal1001); 135b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 136b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea pthread_t t; 137b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(0, pthread_create(&t, NULL, ConcurrentStrSignalFn, NULL)); 138b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea void* result; 139b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(0, pthread_join(t, &result)); 140b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_TRUE(static_cast<bool>(result)); 141b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 142b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown signal 1001", strsignal1001); 143b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea} 144036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 1451467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov// TODO: where did this number come from? 146036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#define ITER 500 147036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 148036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova// For every length we want to test, vary and change alignment 149036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova// of allocated memory, fill it with some values, calculate 150036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova// expected result and then run function and compare what we got. 151036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova// These tests contributed by Intel Corporation. 152036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova// TODO: make these tests more intention-revealing and less random. 153baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenkotemplate<class Character> 1541467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanovclass StringTestState { 1551467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov public: 1561467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov StringTestState(size_t MAX_LEN) : MAX_LEN(MAX_LEN), align1_index_(0), align2_index_(0) { 157036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int max_alignment = 64; 158036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 159036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova // TODO: fix the tests to not sometimes use twice their specified "MAX_LEN". 160e5fdaa4f9d102461a4d8a865e6ca84666893b9e7Dan Albert glob_ptr = reinterpret_cast<Character*>(memalign(sysconf(_SC_PAGESIZE), 2 * sizeof(Character) * MAX_LEN + max_alignment)); 161e5fdaa4f9d102461a4d8a865e6ca84666893b9e7Dan Albert glob_ptr1 = reinterpret_cast<Character*>(memalign(sysconf(_SC_PAGESIZE), 2 * sizeof(Character) * MAX_LEN + max_alignment)); 162e5fdaa4f9d102461a4d8a865e6ca84666893b9e7Dan Albert glob_ptr2 = reinterpret_cast<Character*>(memalign(sysconf(_SC_PAGESIZE), 2 * sizeof(Character) * MAX_LEN + max_alignment)); 163036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 164036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova InitLenArray(); 165036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 166036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova srandom(1234); 167036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 168036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 169036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ~StringTestState() { 170036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova free(glob_ptr); 171036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova free(glob_ptr1); 172036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova free(glob_ptr2); 173036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 174036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 1751467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov void BeginIterations() { 1761467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov align1_index_ = 0; 1771467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov align2_index_ = 0; 178036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 1791467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov ResetPointers(); 1801467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov } 1811467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov 1821467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov bool HasNextIteration() { 1831467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov return (align1_index_ != (alignments_size - 1) || align2_index_ != (alignments_size - 1)); 1841467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov } 1851467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov 1861467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov void NextIteration() { 1871467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov if (align1_index_ == (alignments_size - 1) && align2_index_ == (alignments_size - 1)) { 1881467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov return; 1891467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov } 1901467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov 1911467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov if (align1_index_ == (alignments_size - 1)) { 1921467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov align1_index_ = 0; 1931467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov align2_index_++; 1941467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov } else { 1951467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov align1_index_++; 1961467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov } 1971467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov 1981467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov ResetPointers(); 199036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 200036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 201036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova const size_t MAX_LEN; 202baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko Character *ptr, *ptr1, *ptr2; 203036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t n; 2047b956ede3f0f40bd8a085a8ad3729bb3e0e030f2Dmitriy Ivanov size_t len[ITER + 1]; 205036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 206036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova private: 2071467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov static size_t alignments[]; 2081467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov static size_t alignments_size; 209baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko Character *glob_ptr, *glob_ptr1, *glob_ptr2; 2101467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov size_t align1_index_, align2_index_; 211036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 212036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova // Calculate input lengths and fill state.len with them. 213036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova // Test small lengths with more density than big ones. Manually push 214036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova // smallest (0) and biggest (MAX_LEN) lengths. Avoid repeats. 215036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova // Return number of lengths to test. 216036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova void InitLenArray() { 217036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova n = 0; 218036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova len[n++] = 0; 219036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 1; i < ITER; ++i) { 2207b956ede3f0f40bd8a085a8ad3729bb3e0e030f2Dmitriy Ivanov size_t l = static_cast<size_t>(exp(log(static_cast<double>(MAX_LEN)) * i / ITER)); 221036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (l != len[n - 1]) { 222036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova len[n++] = l; 223036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 224036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 225036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova len[n++] = MAX_LEN; 226036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 2271467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov 2281467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov void ResetPointers() { 2291467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov if (align1_index_ == alignments_size || align2_index_ == alignments_size) { 2301467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov ptr = ptr1 = ptr2 = nullptr; 2311467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov } else { 2321467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov ptr = glob_ptr + alignments[align1_index_]; 2331467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov ptr1 = glob_ptr1 + alignments[align1_index_]; 2341467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov ptr2 = glob_ptr2 + alignments[align2_index_]; 2351467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov } 2361467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov } 237036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}; 238036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 2391467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanovtemplate<class Character> 2401467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanovsize_t StringTestState<Character>::alignments[] = { 24, 32, 16, 48, 0, 1, 2, 3, 4, 5, 6, 7, 11 }; 2411467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov 2421467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanovtemplate<class Character> 2431467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanovsize_t StringTestState<Character>::alignments_size = sizeof(alignments)/sizeof(size_t); 2441467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov 245036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strcat) { 246baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 247036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 1; i < state.n; i++) { 2481467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov for (state.BeginIterations(); state.HasNextIteration(); state.NextIteration()) { 249036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, '\2', state.MAX_LEN); 250036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[state.MAX_LEN - 1] = '\0'; 251036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr, state.ptr2, 2 * state.MAX_LEN); 252036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 2531467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov memset(state.ptr1, 'L', state.len[i]); 254036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[random() % state.len[i]] = '\0'; 255036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[state.len[i] - 1] = '\0'; 256036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 257036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova strcpy(state.ptr + state.MAX_LEN - 1, state.ptr1); 258036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 259036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova EXPECT_TRUE(strcat(state.ptr2, state.ptr1) == state.ptr2); 260036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova EXPECT_TRUE(memcmp(state.ptr, state.ptr2, 2 * state.MAX_LEN) == 0); 261036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 262036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 263036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 264036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 26513476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich// one byte target with "\0" source 26613476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick KralevichTEST(string, strcpy2) { 26713476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich char buf[1]; 26813476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich char* orig = strdup(""); 269950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_EQ(buf, strcpy(buf, orig)); 27013476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich ASSERT_EQ('\0', buf[0]); 27113476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich free(orig); 27213476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich} 27313476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich 27413476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich// multibyte target where we under fill target 27513476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick KralevichTEST(string, strcpy3) { 27613476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich char buf[10]; 27713476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich char* orig = strdup("12345"); 27813476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich memset(buf, 'A', sizeof(buf)); 279950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_EQ(buf, strcpy(buf, orig)); 280950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_STREQ("12345", buf); 28113476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich ASSERT_EQ('A', buf[6]); 28213476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich ASSERT_EQ('A', buf[7]); 28313476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich ASSERT_EQ('A', buf[8]); 28413476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich ASSERT_EQ('A', buf[9]); 28513476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich free(orig); 28613476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich} 28713476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich 28813476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich// multibyte target where we fill target exactly 28913476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick KralevichTEST(string, strcpy4) { 29013476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich char buf[10]; 29113476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich char* orig = strdup("123456789"); 29213476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich memset(buf, 'A', sizeof(buf)); 293950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_EQ(buf, strcpy(buf, orig)); 294950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_STREQ("123456789", buf); 295950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris free(orig); 296950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris} 297950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris 298950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris// one byte target with "\0" source 299950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher FerrisTEST(string, stpcpy2) { 300950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris char buf[1]; 301950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris char* orig = strdup(""); 302950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_EQ(buf, stpcpy(buf, orig)); 303950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_EQ('\0', buf[0]); 304950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris free(orig); 305950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris} 306950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris 307950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris// multibyte target where we under fill target 308950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher FerrisTEST(string, stpcpy3) { 309950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris char buf[10]; 310950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris char* orig = strdup("12345"); 311950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris memset(buf, 'A', sizeof(buf)); 312950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_EQ(buf+strlen(orig), stpcpy(buf, orig)); 313950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_STREQ("12345", buf); 314950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_EQ('A', buf[6]); 315950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_EQ('A', buf[7]); 316950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_EQ('A', buf[8]); 317950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_EQ('A', buf[9]); 318950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris free(orig); 319950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris} 320950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris 321950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris// multibyte target where we fill target exactly 322950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher FerrisTEST(string, stpcpy4) { 323950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris char buf[10]; 324950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris char* orig = strdup("123456789"); 325950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris memset(buf, 'A', sizeof(buf)); 326950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_EQ(buf+strlen(orig), stpcpy(buf, orig)); 327950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_STREQ("123456789", buf); 32813476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich free(orig); 32913476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich} 33013476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich 331cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick KralevichTEST(string, strcat2) { 332cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char buf[10]; 333cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich memset(buf, 'A', sizeof(buf)); 334cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[0] = 'a'; 335cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[1] = '\0'; 336cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char* res = strcat(buf, "01234"); 337cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ(buf, res); 338950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_STREQ("a01234", buf); 339cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('A', buf[7]); 340cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('A', buf[8]); 341cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('A', buf[9]); 342cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich} 343cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich 344cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick KralevichTEST(string, strcat3) { 345cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char buf[10]; 346cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich memset(buf, 'A', sizeof(buf)); 347cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[0] = 'a'; 348cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[1] = '\0'; 349cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char* res = strcat(buf, "01234567"); 350cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ(buf, res); 351950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_STREQ("a01234567", buf); 352cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich} 353cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich 354cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick KralevichTEST(string, strncat2) { 355cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char buf[10]; 356cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich memset(buf, 'A', sizeof(buf)); 357cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[0] = 'a'; 358cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[1] = '\0'; 359cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char* res = strncat(buf, "01234", sizeof(buf) - strlen(buf) - 1); 360cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ(buf, res); 361950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_STREQ("a01234", buf); 362cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('A', buf[7]); 363cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('A', buf[8]); 364cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('A', buf[9]); 365cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich} 366cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich 367cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick KralevichTEST(string, strncat3) { 368cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char buf[10]; 369cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich memset(buf, 'A', sizeof(buf)); 370cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[0] = 'a'; 371cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[1] = '\0'; 372cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char* res = strncat(buf, "0123456789", 5); 373cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ(buf, res); 374950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_STREQ("a01234", buf); 375cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('A', buf[7]); 376cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('A', buf[8]); 377cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('A', buf[9]); 378cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich} 379cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich 380cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick KralevichTEST(string, strncat4) { 381cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char buf[10]; 382cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich memset(buf, 'A', sizeof(buf)); 383cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[0] = 'a'; 384cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[1] = '\0'; 385cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char* res = strncat(buf, "01234567", 8); 386cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ(buf, res); 387950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_STREQ("a01234567", buf); 388cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich} 389cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich 390cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick KralevichTEST(string, strncat5) { 391cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char buf[10]; 392cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich memset(buf, 'A', sizeof(buf)); 393cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[0] = 'a'; 394cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[1] = '\0'; 395cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char* res = strncat(buf, "01234567", 9); 396cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ(buf, res); 397950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_STREQ("a01234567", buf); 398cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich} 399cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich 4004f40e511b0612ea099ab5b0843977fe7a49372fdNick KralevichTEST(string, strchr_with_0) { 4014f40e511b0612ea099ab5b0843977fe7a49372fdNick Kralevich char buf[10]; 4024f40e511b0612ea099ab5b0843977fe7a49372fdNick Kralevich const char* s = "01234"; 4034f40e511b0612ea099ab5b0843977fe7a49372fdNick Kralevich memcpy(buf, s, strlen(s) + 1); 4044f40e511b0612ea099ab5b0843977fe7a49372fdNick Kralevich EXPECT_TRUE(strchr(buf, '\0') == (buf + strlen(s))); 4054f40e511b0612ea099ab5b0843977fe7a49372fdNick Kralevich} 4064f40e511b0612ea099ab5b0843977fe7a49372fdNick Kralevich 4073a657d01eca1529ba7002cbee44e149988834c9dChristopher FerrisTEST(string, strchr_multiple) { 4083a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris char str[128]; 4093a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris memset(str, 'a', sizeof(str) - 1); 4103a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris str[sizeof(str)-1] = '\0'; 4113a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris 4123a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris // Verify that strchr finds the first occurrence of 'a' in a string 4133a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris // filled with 'a' characters. Iterate over the string putting 4143a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris // non 'a' characters at the front of the string during each iteration 4153a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris // and continue to verify that strchr can find the first occurrence 4163a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris // properly. The idea is to cover all possible alignments of the location 4173a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris // of the first occurrence of the 'a' character and which includes 4183a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris // other 'a' characters close by. 4193a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris for (size_t i = 0; i < sizeof(str) - 1; i++) { 4203a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris EXPECT_EQ(&str[i], strchr(str, 'a')); 4213a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris str[i] = 'b'; 4223a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris } 4233a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris} 4243a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris 425036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strchr) { 4261467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov int seek_char = 'R'; 427036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 428baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 429036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 1; i < state.n; i++) { 4301467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov for (state.BeginIterations(); state.HasNextIteration(); state.NextIteration()) { 431036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (~seek_char > 0) { 432036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, ~seek_char, state.len[i]); 433036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 434036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, '\1', state.len[i]); 435036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 436036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[state.len[i] - 1] = '\0'; 437036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 4387b956ede3f0f40bd8a085a8ad3729bb3e0e030f2Dmitriy Ivanov size_t pos = random() % state.MAX_LEN; 439036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova char* expected; 440036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos >= state.len[i] - 1) { 441036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (seek_char == 0) { 442036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = state.ptr1 + state.len[i] - 1; 443036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 444036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = NULL; 445036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 446036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 447036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos] = seek_char; 448036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = state.ptr1 + pos; 449036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 450036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 451036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(strchr(state.ptr1, seek_char) == expected); 452036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 453036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 454036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 455036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 456036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strcmp) { 457baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 458036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 1; i < state.n; i++) { 4591467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov for (state.BeginIterations(); state.HasNextIteration(); state.NextIteration()) { 460036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, 'v', state.MAX_LEN); 461036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, 'n', state.MAX_LEN); 462036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[state.len[i] - 1] = '\0'; 463036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[state.len[i] - 1] = '\0'; 464036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 4657b956ede3f0f40bd8a085a8ad3729bb3e0e030f2Dmitriy Ivanov size_t pos = 1 + (random() % (state.MAX_LEN - 1)); 466036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int actual; 467036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int expected; 468036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos >= state.len[i] - 1) { 469036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr1, state.ptr2, state.len[i]); 470036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = 0; 471036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova actual = strcmp(state.ptr1, state.ptr2); 472036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 473036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr1, state.ptr2, pos); 474036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (state.ptr1[pos] > state.ptr2[pos]) { 475036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = 1; 476036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else if (state.ptr1[pos] == state.ptr2[pos]) { 477036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos + 1] = '\0'; 478036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[pos + 1] = '\0'; 479036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = 0; 480036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 481036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = -1; 482036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 483036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova actual = strcmp(state.ptr1, state.ptr2); 484036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 485036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 486036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(expected, signum(actual)); 487036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 488036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 489036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 490036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 491950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher FerrisTEST(string, stpcpy) { 492950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris StringTestState<char> state(SMALL); 4931467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov for (state.BeginIterations(); state.HasNextIteration(); state.NextIteration()) { 494950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris size_t pos = random() % state.MAX_LEN; 495950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris 496950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris memset(state.ptr1, '\2', pos); 497950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris state.ptr1[pos] = '\0'; 498950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris state.ptr1[state.MAX_LEN - 1] = '\0'; 499950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris 500950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris memcpy(state.ptr, state.ptr1, state.MAX_LEN); 501950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris 502950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris memset(state.ptr2, '\1', state.MAX_LEN); 503950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris state.ptr2[state.MAX_LEN - 1] = '\0'; 504950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris 505950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris memset(state.ptr + state.MAX_LEN, '\1', state.MAX_LEN); 506950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris memcpy(state.ptr + state.MAX_LEN, state.ptr1, pos + 1); 507950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris state.ptr[2 * state.MAX_LEN - 1] = '\0'; 508950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris 509950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_TRUE(stpcpy(state.ptr2, state.ptr1) == state.ptr2 + strlen(state.ptr1)); 510950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_FALSE((memcmp(state.ptr1, state.ptr, state.MAX_LEN)) != 0 || 511950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris (memcmp(state.ptr2, state.ptr + state.MAX_LEN, state.MAX_LEN) != 0)); 512950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris } 513950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris} 514950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris 515036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strcpy) { 516baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 5171467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov for (state.BeginIterations(); state.HasNextIteration(); state.NextIteration()) { 518036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t pos = random() % state.MAX_LEN; 519036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 520036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, '\2', pos); 521036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos] = '\0'; 522036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[state.MAX_LEN - 1] = '\0'; 523036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 524036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr, state.ptr1, state.MAX_LEN); 525036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 526036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, '\1', state.MAX_LEN); 527036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[state.MAX_LEN - 1] = '\0'; 528036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 529036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr + state.MAX_LEN, '\1', state.MAX_LEN); 530036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr + state.MAX_LEN, state.ptr1, pos + 1); 531036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr[2 * state.MAX_LEN - 1] = '\0'; 532036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 533036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(strcpy(state.ptr2, state.ptr1) == state.ptr2); 534036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_FALSE((memcmp(state.ptr1, state.ptr, state.MAX_LEN)) != 0 || 535036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova (memcmp(state.ptr2, state.ptr + state.MAX_LEN, state.MAX_LEN) != 0)); 536036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 537036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 538036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 539036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strlcat) { 5401468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris#if defined(STRLCAT_SUPPORTED) 541baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 542036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n; i++) { 5431467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov for (state.BeginIterations(); state.HasNextIteration(); state.NextIteration()) { 544036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, '\2', state.MAX_LEN + state.len[i]); 545036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[state.MAX_LEN - 1] = '\0'; 546036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr, state.ptr2, state.MAX_LEN + state.len[i]); 547036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 5487b956ede3f0f40bd8a085a8ad3729bb3e0e030f2Dmitriy Ivanov size_t pos = random() % state.MAX_LEN; 549036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, '\3', pos); 550036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos] = '\0'; 551036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos < state.len[i]) { 552036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr + state.MAX_LEN - 1, state.ptr1, pos + 1); 553036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 554036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr + state.MAX_LEN - 1, state.ptr1, state.len[i]); 555036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr[state.MAX_LEN + state.len[i] - 1] = '\0'; 556036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 557036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 558036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova strlcat(state.ptr2, state.ptr1, state.MAX_LEN + state.len[i]); 559036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 560036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(memcmp(state.ptr, state.ptr2, state.MAX_LEN + state.len[i]) == 0); 561036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 562036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 5631468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris#else 5641468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris GTEST_LOG_(INFO) << "Skipping test, strlcat not supported on this platform."; 5651468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris#endif 566036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 567036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 568036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strlcpy) { 5691468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris#if defined(STRLCPY_SUPPORTED) 570baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 5711467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov for (state.BeginIterations(); state.HasNextIteration(); state.NextIteration()) { 5721467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov int rand = 'O'; 573036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, rand, state.MAX_LEN); 574036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 575036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t pos = random() % state.MAX_LEN; 576036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos < state.MAX_LEN) { 577036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos] = '\0'; 578036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 579036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr, state.ptr1, state.MAX_LEN); 580036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 5811467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov memset(state.ptr2, 'I', state.MAX_LEN); 582036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr + state.MAX_LEN, state.ptr2, state.MAX_LEN); 583036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 584036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos > state.MAX_LEN - 1) { 585036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr + state.MAX_LEN, state.ptr1, state.MAX_LEN); 586036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr[2 * state.MAX_LEN - 1] = '\0'; 587036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 588036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr + state.MAX_LEN, state.ptr1, pos + 1); 589036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 590036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 591036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(strlcpy(state.ptr2, state.ptr1, state.MAX_LEN), strlen(state.ptr1)); 592036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_FALSE((memcmp(state.ptr1, state.ptr, state.MAX_LEN) != 0) || 593036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova (memcmp(state.ptr2, state.ptr + state.MAX_LEN, state.MAX_LEN) != 0)); 594036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 5951468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris#else 5961468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris GTEST_LOG_(INFO) << "Skipping test, strlcpy not supported on this platform."; 5971468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris#endif 598036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 599036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 600036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strncat) { 601baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 602036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 1; i < state.n; i++) { 6031467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov for (state.BeginIterations(); state.HasNextIteration(); state.NextIteration()) { 604036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, '\2', state.MAX_LEN); 605036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[state.MAX_LEN - 1] = '\0'; 606036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr, state.ptr2, 2 * state.MAX_LEN); 607036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 6081467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov memset(state.ptr1, 'I', state.len[i]); 609036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[random() % state.len[i]] = '\0'; 610036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[state.len[i] - 1] = '\0'; 611036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 612036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t pos = strlen(state.ptr1); 613036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 614036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t actual = random() % state.len[i]; 615036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova strncpy(state.ptr + state.MAX_LEN - 1, state.ptr1, std::min(actual, pos)); 616036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr[state.MAX_LEN + std::min(actual, pos) - 1] = '\0'; 617036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 618036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(strncat(state.ptr2, state.ptr1, actual) == state.ptr2); 619036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(memcmp(state.ptr, state.ptr2, 2 * state.MAX_LEN), 0); 620036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 621036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 622036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 623036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 624036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strncmp) { 625baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 626036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 1; i < state.n; i++) { 6271467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov for (state.BeginIterations(); state.HasNextIteration(); state.NextIteration()) { 628036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, 'v', state.MAX_LEN); 629036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, 'n', state.MAX_LEN); 630036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[state.len[i] - 1] = '\0'; 631036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[state.len[i] - 1] = '\0'; 632036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 6337b956ede3f0f40bd8a085a8ad3729bb3e0e030f2Dmitriy Ivanov size_t pos = 1 + (random() % (state.MAX_LEN - 1)); 634036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int actual; 635036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int expected; 636036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos >= state.len[i] - 1) { 637036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr1, state.ptr2, state.len[i]); 638036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = 0; 639036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova actual = strncmp(state.ptr1, state.ptr2, state.len[i]); 640036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 641036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr1, state.ptr2, pos); 642036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (state.ptr1[pos] > state.ptr2[pos]) { 643036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = 1; 644036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else if (state.ptr1[pos] == state.ptr2[pos]) { 645036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos + 1] = '\0'; 646036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[pos + 1] = '\0'; 647036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = 0; 648036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 649036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = -1; 650036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 651036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova actual = strncmp(state.ptr1, state.ptr2, state.len[i]); 652036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 653036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 654036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(expected, signum(actual)); 655036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 656036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 657036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 658036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 659950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher FerrisTEST(string, stpncpy) { 660baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 6611467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov for (state.BeginIterations(); state.HasNextIteration(); state.NextIteration()) { 6621467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov memset(state.ptr1, 'J', state.MAX_LEN); 663950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris // Choose a random size for our src buffer. 664950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris size_t ptr1_len = random() % state.MAX_LEN; 665950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris state.ptr1[ptr1_len] = '\0'; 666950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris // Copy ptr1 into ptr, used to verify that ptr1 does not get modified. 667036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr, state.ptr1, state.MAX_LEN); 668950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris // Init ptr2 to a set value. 669950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris memset(state.ptr2, '\1', state.MAX_LEN); 670036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 671950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris // Choose a random amount of data to copy. 672950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris size_t copy_len = random() % state.MAX_LEN; 673950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris 674950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris // Set the second half of ptr to the expected pattern in ptr2. 675950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris memset(state.ptr + state.MAX_LEN, '\1', state.MAX_LEN); 676950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris memcpy(state.ptr + state.MAX_LEN, state.ptr1, copy_len); 677950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris size_t expected_end; 678950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris if (copy_len > ptr1_len) { 679950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris memset(state.ptr + state.MAX_LEN + ptr1_len, '\0', copy_len - ptr1_len); 680950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris expected_end = ptr1_len; 681950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris } else { 682950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris expected_end = copy_len; 683950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris } 684950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris 685950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_EQ(state.ptr2 + expected_end, stpncpy(state.ptr2, state.ptr1, copy_len)); 686950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris 687950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris // Verify ptr1 was not modified. 688950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_EQ(0, memcmp(state.ptr1, state.ptr, state.MAX_LEN)); 689950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris // Verify ptr2 contains the expected data. 690950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_EQ(0, memcmp(state.ptr2, state.ptr + state.MAX_LEN, state.MAX_LEN)); 691950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris } 692950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris} 693950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris 694950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher FerrisTEST(string, strncpy) { 695950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris StringTestState<char> state(SMALL); 6961467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov for (state.BeginIterations(); state.HasNextIteration(); state.NextIteration()) { 697950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris // Choose a random value to fill the string, except \0 (string terminator), 698950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris // or \1 (guarantees it's different from anything in ptr2). 6991467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov memset(state.ptr1, 'K', state.MAX_LEN); 700950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris // Choose a random size for our src buffer. 701950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris size_t ptr1_len = random() % state.MAX_LEN; 702950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris state.ptr1[ptr1_len] = '\0'; 703950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris // Copy ptr1 into ptr, used to verify that ptr1 does not get modified. 704950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris memcpy(state.ptr, state.ptr1, state.MAX_LEN); 705950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris // Init ptr2 to a set value. 706036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, '\1', state.MAX_LEN); 707036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 708950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris // Choose a random amount of data to copy. 709950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris size_t copy_len = random() % state.MAX_LEN; 710950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris 711950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris // Set the second half of ptr to the expected pattern in ptr2. 712950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris memset(state.ptr + state.MAX_LEN, '\1', state.MAX_LEN); 713950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris memcpy(state.ptr + state.MAX_LEN, state.ptr1, copy_len); 714950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris size_t expected_end; 715950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris if (copy_len > ptr1_len) { 716950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris memset(state.ptr + state.MAX_LEN + ptr1_len, '\0', copy_len - ptr1_len); 717950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris expected_end = ptr1_len; 718036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 719950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris expected_end = copy_len; 720036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 721036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 722950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_EQ(state.ptr2 + expected_end, stpncpy(state.ptr2, state.ptr1, copy_len)); 723036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 724950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris // Verify ptr1 was not modified. 725950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_EQ(0, memcmp(state.ptr1, state.ptr, state.MAX_LEN)); 726950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris // Verify ptr2 contains the expected data. 727950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_EQ(0, memcmp(state.ptr2, state.ptr + state.MAX_LEN, state.MAX_LEN)); 728036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 729036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 730036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 731036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strrchr) { 7321467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov int seek_char = 'M'; 733baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 734036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 1; i < state.n; i++) { 7351467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov for (state.BeginIterations(); state.HasNextIteration(); state.NextIteration()) { 736036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (~seek_char > 0) { 737036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, ~seek_char, state.len[i]); 738036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 739036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, '\1', state.len[i]); 740036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 741036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[state.len[i] - 1] = '\0'; 742036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 7437b956ede3f0f40bd8a085a8ad3729bb3e0e030f2Dmitriy Ivanov size_t pos = random() % state.MAX_LEN; 744036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova char* expected; 745036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos >= state.len[i] - 1) { 746036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (seek_char == 0) { 747036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = state.ptr1 + state.len[i] - 1; 748036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 749036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = NULL; 750036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 751036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 752036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos] = seek_char; 753036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = state.ptr1 + pos; 754036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 755036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 756036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(strrchr(state.ptr1, seek_char) == expected); 757036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 758036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 759036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 760036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 761036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memchr) { 7621467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov int seek_char = 'N'; 763baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 764036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n; i++) { 7651467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov for (state.BeginIterations(); state.HasNextIteration(); state.NextIteration()) { 766036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, ~seek_char, state.len[i]); 767036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 7687b956ede3f0f40bd8a085a8ad3729bb3e0e030f2Dmitriy Ivanov size_t pos = random() % state.MAX_LEN; 769036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova char* expected; 770036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos >= state.len[i]) { 771036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = NULL; 772036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 773036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos] = seek_char; 774036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = state.ptr1 + pos; 775036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 776036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 777036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(memchr(state.ptr1, seek_char, state.len[i]) == expected); 778036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 779036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 780036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 781036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 782e03e1eac0b7682884b6628df1305d34299680cb4Christopher FerrisTEST(string, memchr_zero) { 783e03e1eac0b7682884b6628df1305d34299680cb4Christopher Ferris uint8_t* buffer; 784e03e1eac0b7682884b6628df1305d34299680cb4Christopher Ferris ASSERT_EQ(0, posix_memalign(reinterpret_cast<void**>(&buffer), 64, 64)); 785e03e1eac0b7682884b6628df1305d34299680cb4Christopher Ferris memset(buffer, 10, 64); 786e03e1eac0b7682884b6628df1305d34299680cb4Christopher Ferris ASSERT_TRUE(NULL == memchr(buffer, 5, 0)); 787e03e1eac0b7682884b6628df1305d34299680cb4Christopher Ferris ASSERT_TRUE(NULL == memchr(buffer, 10, 0)); 788e03e1eac0b7682884b6628df1305d34299680cb4Christopher Ferris} 789e03e1eac0b7682884b6628df1305d34299680cb4Christopher Ferris 790036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memrchr) { 7911467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov int seek_char = 'P'; 792baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 793036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n; i++) { 7941467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov for (state.BeginIterations(); state.HasNextIteration(); state.NextIteration()) { 795036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, ~seek_char, state.len[i]); 796036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 7977b956ede3f0f40bd8a085a8ad3729bb3e0e030f2Dmitriy Ivanov size_t pos = random() % state.MAX_LEN; 798036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova char* expected; 799036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos >= state.len[i]) { 800036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = NULL; 801036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 802036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos] = seek_char; 803036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = state.ptr1 + pos; 804036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 805036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 806036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(memrchr(state.ptr1, seek_char, state.len[i]) == expected); 807036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 808036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 809036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 810036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 811036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memcmp) { 812baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 813036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n; i++) { 8141467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov for (state.BeginIterations(); state.HasNextIteration(); state.NextIteration()) { 8151467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov int c1 = 'A'; 8161467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov int c2 = 'N'; 817036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, c1, state.MAX_LEN); 818036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, c1, state.MAX_LEN); 819036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 820036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int pos = (state.len[i] == 0) ? 0 : (random() % state.len[i]); 821036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[pos] = c2; 822036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 823036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int expected = (static_cast<int>(c1) - static_cast<int>(c2)); 824036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int actual = memcmp(state.ptr1, state.ptr2, state.MAX_LEN); 825036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 826036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(signum(expected), signum(actual)); 827036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 828036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 829036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 830036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 831baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander IvchenkoTEST(string, wmemcmp) { 832baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<wchar_t> state(SMALL); 833baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko 834baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko for (size_t i = 0; i < state.n; i++) { 8351467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov for (state.BeginIterations(); state.HasNextIteration(); state.NextIteration()) { 836baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko long long mask = ((long long) 1 << 8 * sizeof(wchar_t)) - 1; 837baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko int c1 = rand() & mask; 838baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko int c2 = rand() & mask; 839baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko wmemset(state.ptr1, c1, state.MAX_LEN); 840baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko wmemset(state.ptr2, c1, state.MAX_LEN); 841baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko 842baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko int pos = (state.len[i] == 0) ? 0 : (random() % state.len[i]); 843baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko state.ptr2[pos] = c2; 844baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko 845baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko int expected = (static_cast<int>(c1) - static_cast<int>(c2)); 846baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko int actual = wmemcmp(state.ptr1, state.ptr2, (size_t) state.MAX_LEN); 847baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko 848baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko ASSERT_EQ(signum(expected), signum(actual)); 849baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko } 850baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko } 851baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko} 852baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko 853036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memcpy) { 854baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(LARGE); 8551467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov int rand = 4; 856036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n - 1; i++) { 8571467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov for (state.BeginIterations(); state.HasNextIteration(); state.NextIteration()) { 858036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t pos = random() % (state.MAX_LEN - state.len[i]); 859036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 860036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, rand, state.len[i]); 861036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1 + state.len[i], ~rand, state.MAX_LEN - state.len[i]); 862036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 863036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, rand, state.len[i]); 864036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2 + state.len[i], ~rand, state.MAX_LEN - state.len[i]); 865036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2 + pos, '\0', state.len[i]); 866036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 867036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_FALSE(memcpy(state.ptr2 + pos, state.ptr1 + pos, state.len[i]) != state.ptr2 + pos); 868036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(0, memcmp(state.ptr1, state.ptr2, state.MAX_LEN)); 869036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 870036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 871036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 872036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 873036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memset) { 874baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(LARGE); 8751467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov char ch = 'P'; 876036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n - 1; i++) { 8771467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov for (state.BeginIterations(); state.HasNextIteration(); state.NextIteration()) { 878036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, ~ch, state.MAX_LEN); 879036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr2, state.ptr1, state.MAX_LEN); 880036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 881036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t pos = random () % (state.MAX_LEN - state.len[i]); 882036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t k = pos; k < pos + state.len[i]; k++) { 883036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[k] = ch; 884036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 885036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 886036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(memset(state.ptr2 + pos, ch, state.len[i]) == state.ptr2 + pos); 887036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 888036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(0, memcmp(state.ptr1, state.ptr2, state.MAX_LEN)); 889036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 890036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 891036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 892036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 893036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memmove) { 894baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(LARGE); 895036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n - 1; i++) { 8961467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov for (state.BeginIterations(); state.HasNextIteration(); state.NextIteration()) { 8971467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov memset(state.ptr1, 'Q', 2 * state.MAX_LEN); 898036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 899036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t pos = random() % (state.MAX_LEN - state.len[i]); 900036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 9011467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov memset(state.ptr1, 'R', state.len[i]); 902036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr2, state.ptr1, 2 * state.MAX_LEN); 903036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr, state.ptr1, state.len[i]); 904036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr1 + pos, state.ptr, state.len[i]); 905036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 906036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(memmove(state.ptr2 + pos, state.ptr2, state.len[i]) == state.ptr2 + pos); 907036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(0, memcmp(state.ptr2, state.ptr1, 2 * state.MAX_LEN)); 908036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 909036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 910036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 911036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 912fce861498c8c4720c6ad2475a73bb4c3e55d6948Varvara RainchikTEST(string, memmove_cache_size) { 913fce861498c8c4720c6ad2475a73bb4c3e55d6948Varvara Rainchik size_t len = 600000; 914fce861498c8c4720c6ad2475a73bb4c3e55d6948Varvara Rainchik int max_alignment = 31; 915fce861498c8c4720c6ad2475a73bb4c3e55d6948Varvara Rainchik int alignments[] = {0, 5, 11, 29, 30}; 916fce861498c8c4720c6ad2475a73bb4c3e55d6948Varvara Rainchik char* ptr = reinterpret_cast<char*>(malloc(sizeof(char) * len)); 917fce861498c8c4720c6ad2475a73bb4c3e55d6948Varvara Rainchik char* ptr1 = reinterpret_cast<char*>(malloc(2 * sizeof(char) * len)); 918fce861498c8c4720c6ad2475a73bb4c3e55d6948Varvara Rainchik char* glob_ptr2 = reinterpret_cast<char*>(malloc(2 * sizeof(char) * len + max_alignment)); 919fce861498c8c4720c6ad2475a73bb4c3e55d6948Varvara Rainchik size_t pos = 64; 920fce861498c8c4720c6ad2475a73bb4c3e55d6948Varvara Rainchik 921fce861498c8c4720c6ad2475a73bb4c3e55d6948Varvara Rainchik ASSERT_TRUE(ptr != NULL); 922fce861498c8c4720c6ad2475a73bb4c3e55d6948Varvara Rainchik ASSERT_TRUE(ptr1 != NULL); 923fce861498c8c4720c6ad2475a73bb4c3e55d6948Varvara Rainchik ASSERT_TRUE(glob_ptr2 != NULL); 924fce861498c8c4720c6ad2475a73bb4c3e55d6948Varvara Rainchik 925fce861498c8c4720c6ad2475a73bb4c3e55d6948Varvara Rainchik for (int i = 0; i < 5; i++) { 926fce861498c8c4720c6ad2475a73bb4c3e55d6948Varvara Rainchik char* ptr2 = glob_ptr2 + alignments[i]; 9271467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov memset(ptr1, 'S', 2 * len); 9281467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov memset(ptr1, 'T', len); 929fce861498c8c4720c6ad2475a73bb4c3e55d6948Varvara Rainchik memcpy(ptr2, ptr1, 2 * len); 930fce861498c8c4720c6ad2475a73bb4c3e55d6948Varvara Rainchik memcpy(ptr, ptr1, len); 931fce861498c8c4720c6ad2475a73bb4c3e55d6948Varvara Rainchik memcpy(ptr1 + pos, ptr, len); 932fce861498c8c4720c6ad2475a73bb4c3e55d6948Varvara Rainchik 933fce861498c8c4720c6ad2475a73bb4c3e55d6948Varvara Rainchik ASSERT_TRUE(memmove(ptr2 + pos, ptr, len) == ptr2 + pos); 934fce861498c8c4720c6ad2475a73bb4c3e55d6948Varvara Rainchik ASSERT_EQ(0, memcmp(ptr2, ptr1, 2 * len)); 935fce861498c8c4720c6ad2475a73bb4c3e55d6948Varvara Rainchik } 936fce861498c8c4720c6ad2475a73bb4c3e55d6948Varvara Rainchik free(ptr); 937fce861498c8c4720c6ad2475a73bb4c3e55d6948Varvara Rainchik free(ptr1); 938fce861498c8c4720c6ad2475a73bb4c3e55d6948Varvara Rainchik free(glob_ptr2); 939fce861498c8c4720c6ad2475a73bb4c3e55d6948Varvara Rainchik} 940fce861498c8c4720c6ad2475a73bb4c3e55d6948Varvara Rainchik 9416c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhangstatic void verify_memmove(char* src_copy, char* dst, char* src, size_t size) { 9426c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang memset(dst, 0, size); 9436c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang memcpy(src, src_copy, size); 9446c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang ASSERT_EQ(dst, memmove(dst, src, size)); 9456c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang ASSERT_EQ(0, memcmp(dst, src_copy, size)); 9466c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang} 9476c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang 9486c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang#define MEMMOVE_DATA_SIZE (1024*1024*3) 9496c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang 9506c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu ZhangTEST(string, memmove_check) { 9516c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang char* buffer = reinterpret_cast<char*>(malloc(MEMMOVE_DATA_SIZE)); 9526c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang ASSERT_TRUE(buffer != NULL); 9536c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang 9546c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang char* src_data = reinterpret_cast<char*>(malloc(MEMMOVE_DATA_SIZE)); 9556c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang ASSERT_TRUE(src_data != NULL); 9566c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang // Initialize to a known pattern to copy into src for each test and 9576c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang // to compare dst against. 9586c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang for (size_t i = 0; i < MEMMOVE_DATA_SIZE; i++) { 9596c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang src_data[i] = (i + 1) % 255; 9606c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang } 9616c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang 9626c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang // Check all different dst offsets between 0 and 127 inclusive. 9636c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang char* src = buffer; 9646c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang for (size_t i = 0; i < 127; i++) { 9656c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang char* dst = buffer + 256 + i; 9666c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang // Small copy. 9676c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang verify_memmove(src_data, dst, src, 1024); 9686c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang 9696c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang // Medium copy. 9706c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang verify_memmove(src_data, dst, src, 64 * 1024); 9716c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang 9726c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang // Medium copy. 9736c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang verify_memmove(src_data, dst, src, 1024 * 1024 + 128 * 1024); 9746c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang } 9756c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang 9766c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang // Check all leftover size offsets between 1 and 127 inclusive. 9776c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang char* dst = buffer + 256; 9786c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang src = buffer; 9796c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang for (size_t size = 1; size < 127; size++) { 9806c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang // Small copy. 9816c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang verify_memmove(src_data, dst, src, 1024); 9826c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang 9836c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang // Medium copy. 9846c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang verify_memmove(src_data, dst, src, 64 * 1024); 9856c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang 9866c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang // Large copy. 9876c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang verify_memmove(src_data, dst, src, 1024 * 1024 + 128 * 1024); 9886c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang } 9896c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang} 9906c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang 991036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, bcopy) { 992baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(LARGE); 993036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n; i++) { 9941467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov for (state.BeginIterations(); state.HasNextIteration(); state.NextIteration()) { 9951467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov memset(state.ptr1, '4', state.MAX_LEN); 9961467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov memset(state.ptr1 + state.MAX_LEN, 'a', state.MAX_LEN); 997036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr2, state.ptr1, 2 * state.MAX_LEN); 998036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 999036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t start = random() % (2 * state.MAX_LEN - state.len[i]); 1000036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr2 + start, state.ptr1, state.len[i]); 1001036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 1002036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova bcopy(state.ptr1, state.ptr1 + start, state.len[i]); 1003036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(0, memcmp(state.ptr1, state.ptr2, 2 * state.MAX_LEN)); 1004036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 1005036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 1006036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 1007036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 1008036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, bzero) { 1009baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(LARGE); 10101467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov for (state.BeginIterations(); state.HasNextIteration(); state.NextIteration()) { 10111467dfe3e89975f0d4905e31a27ac06257c097cfDmitriy Ivanov memset(state.ptr1, 'R', state.MAX_LEN); 1012036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 1013036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t start = random() % state.MAX_LEN; 1014036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t end = start + random() % (state.MAX_LEN - start); 1015036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 1016036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr2, state.ptr1, start); 1017036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2 + start, '\0', end - start); 1018036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr2 + end, state.ptr1 + end, state.MAX_LEN - end); 1019036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 1020036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova bzero(state.ptr1 + start, end - start); 1021036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 1022036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(0, memcmp(state.ptr1, state.ptr2, state.MAX_LEN)); 1023036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 1024036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 1025b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 1026b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferrisstatic void DoMemcpyTest(uint8_t* src, uint8_t* dst, size_t len) { 1027b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris memset(src, (len % 255) + 1, len); 1028b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris memset(dst, 0, len); 1029b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 1030b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris ASSERT_EQ(dst, memcpy(dst, src, len)); 1031b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris ASSERT_TRUE(memcmp(src, dst, len) == 0); 1032b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris} 1033b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 1034b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher FerrisTEST(string, memcpy_align) { 1035b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris RunSrcDstBufferAlignTest(LARGE, DoMemcpyTest); 1036b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris} 1037b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 1038b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher FerrisTEST(string, memcpy_overread) { 1039b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris RunSrcDstBufferOverreadTest(DoMemcpyTest); 1040b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris} 1041b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 10426c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhangstatic void DoMemmoveTest(uint8_t* src, uint8_t* dst, size_t len) { 10436c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang memset(src, (len % 255) + 1, len); 10446c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang memset(dst, 0, len); 10456c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang 10466c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang ASSERT_EQ(dst, memmove(dst, src, len)); 10476c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang ASSERT_TRUE(memcmp(src, dst, len) == 0); 10486c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang} 10496c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang 10506c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu ZhangTEST(string, memmove_align) { 10516c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang RunSrcDstBufferAlignTest(LARGE, DoMemmoveTest); 10526c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang} 10536c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang 10546c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu ZhangTEST(string, memmove_overread) { 10556c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang RunSrcDstBufferOverreadTest(DoMemmoveTest); 10566c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang} 10576c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang 1058b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferrisstatic void DoMemsetTest(uint8_t* buf, size_t len) { 1059b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris for (size_t i = 0; i < len; i++) { 1060b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris buf[i] = 0; 1061b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris } 1062b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris int value = (len % 255) + 1; 1063b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris ASSERT_EQ(buf, memset(buf, value, len)); 1064b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris for (size_t i = 0; i < len; i++) { 1065b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris ASSERT_EQ(value, buf[i]); 1066b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris } 1067b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris} 1068b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 1069b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher FerrisTEST(string, memset_align) { 1070b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris RunSingleBufferAlignTest(LARGE, DoMemsetTest); 1071b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris} 1072b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 1073b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferrisstatic void DoStrlenTest(uint8_t* buf, size_t len) { 1074b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris if (len >= 1) { 1075b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris memset(buf, (32 + (len % 96)), len - 1); 1076b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris buf[len-1] = '\0'; 1077b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris ASSERT_EQ(len-1, strlen(reinterpret_cast<char*>(buf))); 1078b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris } 1079b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris} 1080b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 1081b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher FerrisTEST(string, strlen_align) { 1082b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris RunSingleBufferAlignTest(LARGE, DoStrlenTest); 1083b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris} 1084b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 1085b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher FerrisTEST(string, strlen_overread) { 1086b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris RunSingleBufferOverreadTest(DoStrlenTest); 1087b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris} 1088b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 1089b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferrisstatic void DoStrcpyTest(uint8_t* src, uint8_t* dst, size_t len) { 1090b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris if (len >= 1) { 1091b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris memset(src, (32 + (len % 96)), len - 1); 1092b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris src[len-1] = '\0'; 1093b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris memset(dst, 0, len); 1094b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris ASSERT_EQ(dst, reinterpret_cast<uint8_t*>(strcpy(reinterpret_cast<char*>(dst), 1095b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris reinterpret_cast<char*>(src)))); 1096b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris ASSERT_TRUE(memcmp(src, dst, len) == 0); 1097b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris } 1098b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris} 1099b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 1100b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher FerrisTEST(string, strcpy_align) { 1101b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris RunSrcDstBufferAlignTest(LARGE, DoStrcpyTest); 1102b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris} 1103b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 1104b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher FerrisTEST(string, strcpy_overread) { 1105b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris RunSrcDstBufferOverreadTest(DoStrcpyTest); 1106b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris} 1107b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 11081468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris#if defined(STRLCPY_SUPPORTED) 11091468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferrisstatic void DoStrlcpyTest(uint8_t* src, uint8_t* dst, size_t len) { 11101468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris if (len >= 1) { 11111468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris memset(src, (32 + (len % 96)), len - 1); 11121468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris src[len-1] = '\0'; 11131468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris memset(dst, 0, len); 11141468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris ASSERT_EQ(len-1, strlcpy(reinterpret_cast<char*>(dst), 11151468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris reinterpret_cast<char*>(src), len)); 11161468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris ASSERT_TRUE(memcmp(src, dst, len) == 0); 11171468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris } 11181468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris} 11191468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris#endif 11201468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris 11211468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher FerrisTEST(string, strlcpy_align) { 11221468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris#if defined(STRLCPY_SUPPORTED) 11231468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris RunSrcDstBufferAlignTest(LARGE, DoStrlcpyTest); 11241468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris#else 11251468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris GTEST_LOG_(INFO) << "Skipping test, strlcpy not supported on this platform."; 11261468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris#endif 11271468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris} 11281468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris 11291468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher FerrisTEST(string, strlcpy_overread) { 11301468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris#if defined(STRLCPY_SUPPORTED) 11311468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris RunSrcDstBufferOverreadTest(DoStrlcpyTest); 11321468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris#else 11331468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris GTEST_LOG_(INFO) << "Skipping test, strlcpy not supported on this platform."; 11341468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris#endif 11351468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris} 11361468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris 11371468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris 1138950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferrisstatic void DoStpcpyTest(uint8_t* src, uint8_t* dst, size_t len) { 1139950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris if (len >= 1) { 1140950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris memset(src, (32 + (len % 96)), len - 1); 1141950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris src[len-1] = '\0'; 1142950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris memset(dst, 0, len); 1143950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_EQ(dst+len-1, reinterpret_cast<uint8_t*>(stpcpy(reinterpret_cast<char*>(dst), 1144950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris reinterpret_cast<char*>(src)))); 1145950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_TRUE(memcmp(src, dst, len) == 0); 1146950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris } 1147950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris} 1148950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris 1149950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher FerrisTEST(string, stpcpy_align) { 1150950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris RunSrcDstBufferAlignTest(LARGE, DoStpcpyTest); 1151950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris} 1152950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris 1153950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher FerrisTEST(string, stpcpy_overread) { 1154950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris RunSrcDstBufferOverreadTest(DoStpcpyTest); 1155950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris} 1156950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris 1157b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris// Use our own incrementer to cut down on the total number of calls. 1158e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferrisstatic size_t LargeSetIncrement(size_t len) { 1159b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris if (len >= 4096) { 1160b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris return 4096; 1161b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris } else if (len >= 1024) { 1162b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris return 1024; 1163b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris } else if (len >= 256) { 1164b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris return 256; 1165b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris } 1166b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris return 1; 1167b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris} 1168b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 1169b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris#define STRCAT_DST_LEN 128 1170b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 1171b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferrisstatic void DoStrcatTest(uint8_t* src, uint8_t* dst, size_t len) { 1172b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris if (len >= 1) { 1173b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris int value = 32 + (len % 96); 1174b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris memset(src, value, len - 1); 1175b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris src[len-1] = '\0'; 1176b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 1177b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris if (len >= STRCAT_DST_LEN) { 1178b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris // Create a small buffer for doing quick compares in each loop. 1179b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris uint8_t cmp_buf[STRCAT_DST_LEN]; 1180b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris // Make sure dst string contains a different value then the src string. 1181b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris int value2 = 32 + (value + 2) % 96; 1182b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris memset(cmp_buf, value2, sizeof(cmp_buf)); 1183b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 1184b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris for (size_t i = 1; i <= STRCAT_DST_LEN; i++) { 1185b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris memset(dst, value2, i-1); 1186b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris memset(dst+i-1, 0, len-i); 1187b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris src[len-i] = '\0'; 1188b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris ASSERT_EQ(dst, reinterpret_cast<uint8_t*>(strcat(reinterpret_cast<char*>(dst), 1189b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris reinterpret_cast<char*>(src)))); 1190b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris ASSERT_TRUE(memcmp(dst, cmp_buf, i-1) == 0); 1191b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris ASSERT_TRUE(memcmp(src, dst+i-1, len-i+1) == 0); 1192b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris } 1193b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris } else { 1194b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris dst[0] = '\0'; 1195b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris ASSERT_EQ(dst, reinterpret_cast<uint8_t*>(strcat(reinterpret_cast<char*>(dst), 1196b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris reinterpret_cast<char*>(src)))); 1197b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris ASSERT_TRUE(memcmp(src, dst, len) == 0); 1198b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris } 1199b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris } 1200b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris} 1201b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 1202b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher FerrisTEST(string, strcat_align) { 1203e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris RunSrcDstBufferAlignTest(MEDIUM, DoStrcatTest, LargeSetIncrement); 1204b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris} 1205b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 1206b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher FerrisTEST(string, strcat_overread) { 1207b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris RunSrcDstBufferOverreadTest(DoStrcatTest); 1208b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris} 1209e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris 12101468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris#if defined(STRLCAT_SUPPORTED) 12111468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferrisstatic void DoStrlcatTest(uint8_t* src, uint8_t* dst, size_t len) { 12121468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris if (len >= 1) { 12131468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris int value = 32 + (len % 96); 12141468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris memset(src, value, len - 1); 12151468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris src[len-1] = '\0'; 12161468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris 12171468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris if (len >= STRCAT_DST_LEN) { 12181468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris // Create a small buffer for doing quick compares in each loop. 12191468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris uint8_t cmp_buf[STRCAT_DST_LEN]; 12201468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris // Make sure dst string contains a different value then the src string. 12211468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris int value2 = 32 + (value + 2) % 96; 12221468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris memset(cmp_buf, value2, sizeof(cmp_buf)); 12231468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris 12241468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris for (size_t i = 1; i <= STRCAT_DST_LEN; i++) { 12251468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris memset(dst, value2, i-1); 12261468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris memset(dst+i-1, 0, len-i); 12271468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris src[len-i] = '\0'; 12281468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris ASSERT_EQ(len-1, strlcat(reinterpret_cast<char*>(dst), 12291468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris reinterpret_cast<char*>(src), len)); 12301468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris ASSERT_TRUE(memcmp(dst, cmp_buf, i-1) == 0); 12311468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris ASSERT_TRUE(memcmp(src, dst+i-1, len-i+1) == 0); 12321468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris } 12331468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris } else { 12341468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris dst[0] = '\0'; 12351468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris ASSERT_EQ(len-1, strlcat(reinterpret_cast<char*>(dst), 12361468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris reinterpret_cast<char*>(src), len)); 12371468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris ASSERT_TRUE(memcmp(src, dst, len) == 0); 12381468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris } 12391468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris } 12401468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris} 12411468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris#endif 12421468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris 12431468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher FerrisTEST(string, strlcat_align) { 12441468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris#if defined(STRLCAT_SUPPORTED) 12451468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris RunSrcDstBufferAlignTest(MEDIUM, DoStrlcatTest, LargeSetIncrement); 12461468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris#else 12471468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris GTEST_LOG_(INFO) << "Skipping test, strlcat not supported on this platform."; 12481468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris#endif 12491468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris} 12501468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris 12511468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher FerrisTEST(string, strlcat_overread) { 12521468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris#if defined(STRLCAT_SUPPORTED) 12531468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris RunSrcDstBufferOverreadTest(DoStrlcatTest); 12541468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris#else 12551468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris GTEST_LOG_(INFO) << "Skipping test, strlcat not supported on this platform."; 12561468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris#endif 12571468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris} 12581468765f8ab81ae9e32638d25c14e1f5dd35da2bChristopher Ferris 1259e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferrisstatic void DoStrcmpTest(uint8_t* buf1, uint8_t* buf2, size_t len) { 1260e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris if (len >= 1) { 1261e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris memset(buf1, (32 + (len % 96)), len - 1); 1262e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris buf1[len-1] = '\0'; 1263e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris memset(buf2, (32 + (len % 96)), len - 1); 1264e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris buf2[len-1] = '\0'; 1265e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris ASSERT_EQ(0, strcmp(reinterpret_cast<char*>(buf1), 1266e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris reinterpret_cast<char*>(buf2))); 1267e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris } 1268e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris} 1269e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris 1270e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferrisstatic void DoStrcmpFailTest(uint8_t* buf1, uint8_t* buf2, size_t len1, size_t len2) { 1271e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris // Do string length differences. 1272e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris int c = (32 + (len1 % 96)); 1273e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris memset(buf1, c, len1 - 1); 1274e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris buf1[len1-1] = '\0'; 1275e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris memset(buf2, c, len2 - 1); 1276e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris buf2[len2-1] = '\0'; 1277e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris ASSERT_NE(0, strcmp(reinterpret_cast<char*>(buf1), 1278e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris reinterpret_cast<char*>(buf2))); 1279e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris 1280e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris // Do single character differences. 1281e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris size_t len; 1282e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris if (len1 > len2) { 1283e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris len = len2; 1284e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris } else { 1285e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris len = len1; 1286e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris } 1287e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris // Need at least a two character buffer to do this test. 1288e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris if (len > 1) { 1289e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris buf1[len-1] = '\0'; 1290e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris buf2[len-1] = '\0'; 1291e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris int diff_c = (c + 1) % 96; 1292e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris 1293e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris buf1[len-2] = diff_c; 1294e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris ASSERT_NE(0, strcmp(reinterpret_cast<char*>(buf1), 1295e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris reinterpret_cast<char*>(buf2))); 1296e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris 1297e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris buf1[len-2] = c; 1298e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris buf2[len-2] = diff_c; 1299e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris ASSERT_NE(0, strcmp(reinterpret_cast<char*>(buf1), 1300e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris reinterpret_cast<char*>(buf2))); 1301e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris } 1302e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris} 1303e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris 1304e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher FerrisTEST(string, strcmp_align) { 1305e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris RunCmpBufferAlignTest(MEDIUM, DoStrcmpTest, DoStrcmpFailTest, LargeSetIncrement); 1306e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris} 1307e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris 1308e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher FerrisTEST(string, strcmp_overread) { 1309e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris RunCmpBufferOverreadTest(DoStrcmpTest, DoStrcmpFailTest); 1310e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris} 1311e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris 1312e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferrisstatic void DoMemcmpTest(uint8_t* buf1, uint8_t* buf2, size_t len) { 1313e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris memset(buf1, len+1, len); 1314e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris memset(buf2, len+1, len); 1315e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris ASSERT_EQ(0, memcmp(buf1, buf2, len)); 1316e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris} 1317e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris 1318e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferrisstatic void DoMemcmpFailTest(uint8_t* buf1, uint8_t* buf2, size_t len1, size_t len2) { 1319e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris size_t len; 1320e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris if (len1 > len2) { 1321e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris len = len2; 1322e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris } else { 1323e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris len = len1; 1324e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris } 1325e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris 1326e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris memset(buf1, len2+1, len); 1327e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris buf1[len-1] = len2; 1328e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris memset(buf2, len2+1, len); 1329e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris ASSERT_NE(0, memcmp(buf1, buf2, len)); 1330e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris 1331e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris buf1[len-1] = len2+1; 1332e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris buf2[len-1] = len2; 1333e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris ASSERT_NE(0, memcmp(buf1, buf2, len)); 1334e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris} 1335e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris 1336e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher FerrisTEST(string, memcmp_align) { 1337e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris RunCmpBufferAlignTest(MEDIUM, DoMemcmpTest, DoMemcmpFailTest, LargeSetIncrement); 1338e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris} 1339e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris 1340e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher FerrisTEST(string, memcmp_overread) { 1341e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris RunCmpBufferOverreadTest(DoMemcmpTest, DoMemcmpFailTest); 1342e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris} 13433a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris 13443a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferrisstatic void DoStrchrTest(uint8_t* buf, size_t len) { 13453a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris if (len >= 1) { 13463a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris char value = 32 + (len % 96); 13473a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris char search_value = 33 + (len % 96); 13483a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris memset(buf, value, len - 1); 13493a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris buf[len-1] = '\0'; 13503a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris ASSERT_EQ(NULL, strchr(reinterpret_cast<char*>(buf), search_value)); 13513a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris ASSERT_EQ(reinterpret_cast<char*>(&buf[len-1]), strchr(reinterpret_cast<char*>(buf), '\0')); 13523a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris if (len >= 2) { 13533a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris buf[0] = search_value; 13543a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris ASSERT_EQ(reinterpret_cast<char*>(&buf[0]), strchr(reinterpret_cast<char*>(buf), search_value)); 13553a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris buf[0] = value; 13563a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris buf[len-2] = search_value; 13573a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris ASSERT_EQ(reinterpret_cast<char*>(&buf[len-2]), strchr(reinterpret_cast<char*>(buf), search_value)); 13583a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris } 13593a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris } 13603a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris} 13613a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris 13623a657d01eca1529ba7002cbee44e149988834c9dChristopher FerrisTEST(string, strchr_align) { 13633a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris RunSingleBufferAlignTest(MEDIUM, DoStrchrTest); 13643a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris} 13653a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris 13663a657d01eca1529ba7002cbee44e149988834c9dChristopher FerrisTEST(string, strchr_overread) { 13673a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris RunSingleBufferOverreadTest(DoStrchrTest); 13683a657d01eca1529ba7002cbee44e149988834c9dChristopher Ferris} 136909c39d6df0e952620f8c1751377b559a04e023aaElliott Hughes 137009c39d6df0e952620f8c1751377b559a04e023aaElliott Hughesstatic void TestBasename(const char* in, const char* expected_out) { 137109c39d6df0e952620f8c1751377b559a04e023aaElliott Hughes errno = 0; 137209c39d6df0e952620f8c1751377b559a04e023aaElliott Hughes const char* out = basename(in); 137309c39d6df0e952620f8c1751377b559a04e023aaElliott Hughes ASSERT_STREQ(expected_out, out) << in; 137409c39d6df0e952620f8c1751377b559a04e023aaElliott Hughes ASSERT_EQ(0, errno) << in; 137509c39d6df0e952620f8c1751377b559a04e023aaElliott Hughes} 137609c39d6df0e952620f8c1751377b559a04e023aaElliott Hughes 137709c39d6df0e952620f8c1751377b559a04e023aaElliott HughesTEST(string, __gnu_basename) { 137809c39d6df0e952620f8c1751377b559a04e023aaElliott Hughes TestBasename("", ""); 137909c39d6df0e952620f8c1751377b559a04e023aaElliott Hughes TestBasename("/usr/lib", "lib"); 138009c39d6df0e952620f8c1751377b559a04e023aaElliott Hughes TestBasename("/usr/", ""); 138109c39d6df0e952620f8c1751377b559a04e023aaElliott Hughes TestBasename("usr", "usr"); 138209c39d6df0e952620f8c1751377b559a04e023aaElliott Hughes TestBasename("/", ""); 138309c39d6df0e952620f8c1751377b559a04e023aaElliott Hughes TestBasename(".", "."); 138409c39d6df0e952620f8c1751377b559a04e023aaElliott Hughes TestBasename("..", ".."); 138509c39d6df0e952620f8c1751377b559a04e023aaElliott Hughes TestBasename("///", ""); 138609c39d6df0e952620f8c1751377b559a04e023aaElliott Hughes TestBasename("//usr//lib//", ""); 138709c39d6df0e952620f8c1751377b559a04e023aaElliott Hughes} 138841ef902379ba24bd8a3ca6d7733b8376efb55ebdElliott Hughes 138941ef902379ba24bd8a3ca6d7733b8376efb55ebdElliott HughesTEST(string, strnlen_147048) { 139041ef902379ba24bd8a3ca6d7733b8376efb55ebdElliott Hughes // https://code.google.com/p/android/issues/detail?id=147048 139141ef902379ba24bd8a3ca6d7733b8376efb55ebdElliott Hughes char stack_src[64] = {0}; 139241ef902379ba24bd8a3ca6d7733b8376efb55ebdElliott Hughes EXPECT_EQ(0U, strnlen(stack_src, 1024*1024*1024)); 139341ef902379ba24bd8a3ca6d7733b8376efb55ebdElliott Hughes char* heap_src = new char[1]; 139441ef902379ba24bd8a3ca6d7733b8376efb55ebdElliott Hughes *heap_src = '\0'; 139541ef902379ba24bd8a3ca6d7733b8376efb55ebdElliott Hughes EXPECT_EQ(0U, strnlen(heap_src, 1024*1024*1024)); 139641ef902379ba24bd8a3ca6d7733b8376efb55ebdElliott Hughes delete[] heap_src; 139741ef902379ba24bd8a3ca6d7733b8376efb55ebdElliott Hughes} 13983cfb52aab2548df635e9672218cc433e14922fd3Elliott Hughes 13993cfb52aab2548df635e9672218cc433e14922fd3Elliott HughesTEST(string, mempcpy) { 14003cfb52aab2548df635e9672218cc433e14922fd3Elliott Hughes char dst[6]; 14013cfb52aab2548df635e9672218cc433e14922fd3Elliott Hughes ASSERT_EQ(&dst[4], reinterpret_cast<char*>(mempcpy(dst, "hello", 4))); 14023cfb52aab2548df635e9672218cc433e14922fd3Elliott Hughes} 1403