t_memset.c revision 313498
1129590Smarius/* $NetBSD: t_memset.c,v 1.4 2015/09/11 09:25:52 martin Exp $ */ 2129590Smarius 3129590Smarius/*- 4129590Smarius * Copyright (c) 2011 The NetBSD Foundation, Inc. 5129590Smarius * All rights reserved. 6129590Smarius * 7129590Smarius * This code is derived from software contributed to The NetBSD Foundation 8129590Smarius * by Jukka Ruohonen. 9129590Smarius * 10129590Smarius * Redistribution and use in source and binary forms, with or without 11129590Smarius * modification, are permitted provided that the following conditions 12129590Smarius * are met: 13129590Smarius * 1. Redistributions of source code must retain the above copyright 14129590Smarius * notice, this list of conditions and the following disclaimer. 15129590Smarius * 2. Redistributions in binary form must reproduce the above copyright 16129590Smarius * notice, this list of conditions and the following disclaimer in the 17129590Smarius * documentation and/or other materials provided with the distribution. 18129590Smarius * 19129590Smarius * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20129590Smarius * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21129590Smarius * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22129590Smarius * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23129590Smarius * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24129590Smarius * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25129590Smarius * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26129590Smarius * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27129590Smarius * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28129590Smarius * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29129590Smarius * POSSIBILITY OF SUCH DAMAGE. 30129590Smarius */ 31129590Smarius#include <sys/cdefs.h> 32129590Smarius__RCSID("$NetBSD: t_memset.c,v 1.4 2015/09/11 09:25:52 martin Exp $"); 33129590Smarius 34129590Smarius#include <sys/stat.h> 35129590Smarius 36129590Smarius#include <atf-c.h> 37129590Smarius#include <stdlib.h> 38129590Smarius#include <string.h> 39129590Smarius#include <unistd.h> 40129590Smarius 41129590Smariusstatic long page = 0; 42129590Smariusstatic void fill(char *, size_t, char); 43129590Smariusstatic bool check(char *, size_t, char); 44129590Smarius 45129590Smariusint zero; /* always zero, but the compiler does not know */ 46129590Smarius 47129590SmariusATF_TC(memset_array); 48129590SmariusATF_TC_HEAD(memset_array, tc) 49129590Smarius{ 50129590Smarius atf_tc_set_md_var(tc, "descr", "Test memset(3) with arrays"); 51129590Smarius} 52129590Smarius 53129590SmariusATF_TC_BODY(memset_array, tc) 54129590Smarius{ 55129590Smarius char buf[1024]; 56129590Smarius 57129590Smarius (void)memset(buf, 0, sizeof(buf)); 58129590Smarius 59129590Smarius if (check(buf, sizeof(buf), 0) != true) 60129590Smarius atf_tc_fail("memset(3) did not fill a static buffer"); 61129590Smarius 62129590Smarius (void)memset(buf, 'x', sizeof(buf)); 63129590Smarius 64129590Smarius if (check(buf, sizeof(buf), 'x') != true) 65129590Smarius atf_tc_fail("memset(3) did not fill a static buffer"); 66129590Smarius} 67129590Smarius 68129590SmariusATF_TC(memset_return); 69129590SmariusATF_TC_HEAD(memset_return, tc) 70129590Smarius{ 71129590Smarius atf_tc_set_md_var(tc, "descr", "Test memset(3) return value"); 72129590Smarius} 73129590Smarius 74129590SmariusATF_TC_BODY(memset_return, tc) 75129590Smarius{ 76129590Smarius char *b = (char *)0x1; 77129590Smarius char c[2]; 78129590Smarius ATF_REQUIRE_EQ(memset(b, 0, 0), b); 79129590Smarius ATF_REQUIRE_EQ(memset(c, 2, sizeof(c)), c); 80129590Smarius} 81129590Smarius 82129590SmariusATF_TC(memset_basic); 83129590SmariusATF_TC_HEAD(memset_basic, tc) 84129590Smarius{ 85129590Smarius atf_tc_set_md_var(tc, "descr", "A basic test of memset(3)"); 86129590Smarius} 87129590Smarius 88129590SmariusATF_TC_BODY(memset_basic, tc) 89129590Smarius{ 90129590Smarius char *buf, *ret; 91129590Smarius 92129590Smarius buf = malloc(page); 93129590Smarius ret = malloc(page); 94129590Smarius 95129590Smarius ATF_REQUIRE(buf != NULL); 96129590Smarius ATF_REQUIRE(ret != NULL); 97129590Smarius 98129590Smarius fill(ret, page, 0); 99129590Smarius memset(buf, 0, page); 100129590Smarius 101129590Smarius ATF_REQUIRE(memcmp(ret, buf, page) == 0); 102129590Smarius 103129590Smarius fill(ret, page, 'x'); 104129590Smarius memset(buf, 'x', page); 105129590Smarius 106129590Smarius ATF_REQUIRE(memcmp(ret, buf, page) == 0); 107129590Smarius 108129590Smarius free(buf); 109129590Smarius free(ret); 110129590Smarius} 111129590Smarius 112129590SmariusATF_TC(memset_nonzero); 113129590SmariusATF_TC_HEAD(memset_nonzero, tc) 114129590Smarius{ 115129590Smarius atf_tc_set_md_var(tc, "descr", "Test memset(3) with non-zero params"); 116129590Smarius} 117129590Smarius 118129590SmariusATF_TC_BODY(memset_nonzero, tc) 119129590Smarius{ 120129590Smarius const size_t n = 0x7f; 121129590Smarius char *buf; 122129590Smarius size_t i; 123129590Smarius 124129590Smarius buf = malloc(page); 125129590Smarius ATF_REQUIRE(buf != NULL); 126129590Smarius 127129590Smarius for (i = 0x21; i < n; i++) { 128129590Smarius 129129590Smarius (void)memset(buf, i, page); 130129590Smarius 131129590Smarius if (check(buf, page, i) != true) 132129590Smarius atf_tc_fail("memset(3) did not fill properly"); 133129590Smarius } 134129590Smarius 135129590Smarius free(buf); 136129590Smarius} 137129590Smarius 138129590SmariusATF_TC(memset_zero_size); 139129590Smarius 140129590SmariusATF_TC_HEAD(memset_zero_size, tc) 141129590Smarius{ 142201227Sed atf_tc_set_md_var(tc, "descr", "Test memset(3) with zero size"); 143129590Smarius} 144129590Smarius 145129590SmariusATF_TC_BODY(memset_zero_size, tc) 146129590Smarius{ 147 char buf[1024]; 148 149 (void)memset(buf, 'x', sizeof(buf)); 150 151 if (check(buf, sizeof(buf), 'x') != true) 152 atf_tc_fail("memset(3) did not fill a static buffer"); 153 154 (void)memset(buf+sizeof(buf)/2, 0, zero); 155 156 if (check(buf, sizeof(buf), 'x') != true) 157 atf_tc_fail("memset(3) with 0 size did change the buffer"); 158} 159 160ATF_TC(bzero_zero_size); 161 162ATF_TC_HEAD(bzero_zero_size, tc) 163{ 164 atf_tc_set_md_var(tc, "descr", "Test bzero(3) with zero size"); 165} 166 167ATF_TC_BODY(bzero_zero_size, tc) 168{ 169 char buf[1024]; 170 171 (void)memset(buf, 'x', sizeof(buf)); 172 173 if (check(buf, sizeof(buf), 'x') != true) 174 atf_tc_fail("memset(3) did not fill a static buffer"); 175 176 (void)bzero(buf+sizeof(buf)/2, zero); 177 178 if (check(buf, sizeof(buf), 'x') != true) 179 atf_tc_fail("bzero(3) with 0 size did change the buffer"); 180} 181 182ATF_TC(memset_struct); 183ATF_TC_HEAD(memset_struct, tc) 184{ 185 atf_tc_set_md_var(tc, "descr", "Test memset(3) with a structure"); 186} 187 188ATF_TC_BODY(memset_struct, tc) 189{ 190 struct stat st; 191 192 st.st_dev = 0; 193 st.st_ino = 1; 194 st.st_mode = 2; 195 st.st_nlink = 3; 196 st.st_uid = 4; 197 st.st_gid = 5; 198 st.st_rdev = 6; 199 st.st_size = 7; 200 st.st_atime = 8; 201 st.st_mtime = 9; 202 203 (void)memset(&st, 0, sizeof(struct stat)); 204 205 ATF_CHECK(st.st_dev == 0); 206 ATF_CHECK(st.st_ino == 0); 207 ATF_CHECK(st.st_mode == 0); 208 ATF_CHECK(st.st_nlink == 0); 209 ATF_CHECK(st.st_uid == 0); 210 ATF_CHECK(st.st_gid == 0); 211 ATF_CHECK(st.st_rdev == 0); 212 ATF_CHECK(st.st_size == 0); 213 ATF_CHECK(st.st_atime == 0); 214 ATF_CHECK(st.st_mtime == 0); 215} 216 217static void 218fill(char *buf, size_t len, char x) 219{ 220 size_t i; 221 222 for (i = 0; i < len; i++) 223 buf[i] = x; 224} 225 226static bool 227check(char *buf, size_t len, char x) 228{ 229 size_t i; 230 231 for (i = 0; i < len; i++) { 232 233 if (buf[i] != x) 234 return false; 235 } 236 237 return true; 238} 239 240ATF_TP_ADD_TCS(tp) 241{ 242 243 page = sysconf(_SC_PAGESIZE); 244 ATF_REQUIRE(page >= 0); 245 246 ATF_TP_ADD_TC(tp, memset_array); 247 ATF_TP_ADD_TC(tp, memset_basic); 248 ATF_TP_ADD_TC(tp, memset_nonzero); 249 ATF_TP_ADD_TC(tp, memset_struct); 250 ATF_TP_ADD_TC(tp, memset_return); 251 ATF_TP_ADD_TC(tp, memset_zero_size); 252 ATF_TP_ADD_TC(tp, bzero_zero_size); 253 254 return atf_no_error(); 255} 256