1*7bedae81SStrahinja Stanišić /*- 2*7bedae81SStrahinja Stanišić * SPDX-License-Identifier: BSD-2-Clause 3*7bedae81SStrahinja Stanišić * 4*7bedae81SStrahinja Stanišić * Copyright (c) 2024 Strahinja Stanisic <strajabot@FreeBSD.org> 5*7bedae81SStrahinja Stanišić */ 6*7bedae81SStrahinja Stanišić 7*7bedae81SStrahinja Stanišić #include <string.h> 8*7bedae81SStrahinja Stanišić #include <unistd.h> 9*7bedae81SStrahinja Stanišić #include <stdio.h> 10*7bedae81SStrahinja Stanišić #include <stdlib.h> 11*7bedae81SStrahinja Stanišić #include <stdalign.h> 12*7bedae81SStrahinja Stanišić #include <stdint.h> 13*7bedae81SStrahinja Stanišić 14*7bedae81SStrahinja Stanišić #include <atf-c.h> 15*7bedae81SStrahinja Stanišić 16*7bedae81SStrahinja Stanišić ATF_TC(strnlen_alignments); 17*7bedae81SStrahinja Stanišić ATF_TC_HEAD(strnlen_alignments, tc) 18*7bedae81SStrahinja Stanišić { 19*7bedae81SStrahinja Stanišić atf_tc_set_md_var(tc, "descr", "Test strnlen(3) with different alignments"); 20*7bedae81SStrahinja Stanišić } 21*7bedae81SStrahinja Stanišić 22*7bedae81SStrahinja Stanišić ATF_TC_BODY(strnlen_alignments, tc) 23*7bedae81SStrahinja Stanišić { 24*7bedae81SStrahinja Stanišić size_t (*strnlen_fn)(const char*, size_t) = strnlen; 25*7bedae81SStrahinja Stanišić char alignas(16) buffer[1 + 16 + 64 + 1 + 1]; 26*7bedae81SStrahinja Stanišić 27*7bedae81SStrahinja Stanišić memset(buffer, '/', sizeof(buffer)); 28*7bedae81SStrahinja Stanišić 29*7bedae81SStrahinja Stanišić for (int align = 1; align < 1 + 16; align++) { 30*7bedae81SStrahinja Stanišić char *s = buffer + align; 31*7bedae81SStrahinja Stanišić 32*7bedae81SStrahinja Stanišić for (size_t maxlen = 0; maxlen <= 64; maxlen++) { 33*7bedae81SStrahinja Stanišić for (size_t len = 0; len <= maxlen; len++) { 34*7bedae81SStrahinja Stanišić /* returns length */ 35*7bedae81SStrahinja Stanišić 36*7bedae81SStrahinja Stanišić /* without sentinels */ 37*7bedae81SStrahinja Stanišić s[len] = '\0'; 38*7bedae81SStrahinja Stanišić size_t val = strnlen_fn(s, maxlen); 39*7bedae81SStrahinja Stanišić if (val != len) { 40*7bedae81SStrahinja Stanišić fprintf(stderr, "align = %d, maxlen = %zu, len = %zu", 41*7bedae81SStrahinja Stanišić align, maxlen, len); 42*7bedae81SStrahinja Stanišić atf_tc_fail("returned incorrect len"); 43*7bedae81SStrahinja Stanišić } 44*7bedae81SStrahinja Stanišić 45*7bedae81SStrahinja Stanišić /* with sentinels */ 46*7bedae81SStrahinja Stanišić s[-1] = '\0'; 47*7bedae81SStrahinja Stanišić s[maxlen + 1] = '\0'; 48*7bedae81SStrahinja Stanišić val = strnlen_fn(s, maxlen); 49*7bedae81SStrahinja Stanišić if (val != len) { 50*7bedae81SStrahinja Stanišić fprintf(stderr, "align = %d, maxlen = %zu, len = %zu", 51*7bedae81SStrahinja Stanišić align, maxlen, len); 52*7bedae81SStrahinja Stanišić atf_tc_fail("returned incorrect len (sentinels)"); 53*7bedae81SStrahinja Stanišić } 54*7bedae81SStrahinja Stanišić 55*7bedae81SStrahinja Stanišić /* cleanup */ 56*7bedae81SStrahinja Stanišić s[-1] = '/'; 57*7bedae81SStrahinja Stanišić s[len] = '/'; 58*7bedae81SStrahinja Stanišić s[maxlen + 1] = '/'; 59*7bedae81SStrahinja Stanišić 60*7bedae81SStrahinja Stanišić } 61*7bedae81SStrahinja Stanišić 62*7bedae81SStrahinja Stanišić /* returns maxlen */ 63*7bedae81SStrahinja Stanišić 64*7bedae81SStrahinja Stanišić /* without sentinels */ 65*7bedae81SStrahinja Stanišić size_t val = strnlen_fn(s, maxlen); 66*7bedae81SStrahinja Stanišić if (val != maxlen) { 67*7bedae81SStrahinja Stanišić fprintf(stderr, "align = %d, maxlen = %zu", 68*7bedae81SStrahinja Stanišić align, maxlen); 69*7bedae81SStrahinja Stanišić atf_tc_fail("should return maxlen"); 70*7bedae81SStrahinja Stanišić } 71*7bedae81SStrahinja Stanišić 72*7bedae81SStrahinja Stanišić /* with sentinels */ 73*7bedae81SStrahinja Stanišić s[-1] = '\0'; 74*7bedae81SStrahinja Stanišić s[maxlen + 1] = '\0'; 75*7bedae81SStrahinja Stanišić val = strnlen_fn(s, maxlen); 76*7bedae81SStrahinja Stanišić if (val != maxlen) { 77*7bedae81SStrahinja Stanišić fprintf(stderr, "align = %d, maxlen = %zu", 78*7bedae81SStrahinja Stanišić align, maxlen); 79*7bedae81SStrahinja Stanišić atf_tc_fail("should return maxlen (sentinels)"); 80*7bedae81SStrahinja Stanišić } 81*7bedae81SStrahinja Stanišić 82*7bedae81SStrahinja Stanišić /* cleanup */ 83*7bedae81SStrahinja Stanišić s[-1] = '/'; 84*7bedae81SStrahinja Stanišić s[maxlen + 1] = '/'; 85*7bedae81SStrahinja Stanišić } 86*7bedae81SStrahinja Stanišić } 87*7bedae81SStrahinja Stanišić } 88*7bedae81SStrahinja Stanišić 89*7bedae81SStrahinja Stanišić ATF_TC(strnlen_size_max); 90*7bedae81SStrahinja Stanišić ATF_TC_HEAD(strnlen_size_max, tc) 91*7bedae81SStrahinja Stanišić { 92*7bedae81SStrahinja Stanišić atf_tc_set_md_var(tc, "descr", "Test strnlen(3) with maxlen=SIZE_MAX"); 93*7bedae81SStrahinja Stanišić } 94*7bedae81SStrahinja Stanišić 95*7bedae81SStrahinja Stanišić ATF_TC_BODY(strnlen_size_max, tc) 96*7bedae81SStrahinja Stanišić { 97*7bedae81SStrahinja Stanišić size_t (*strnlen_fn)(const char*, size_t) = strnlen; 98*7bedae81SStrahinja Stanišić char alignas(16) buffer[1 + 16 + 64 + 1 + 1]; 99*7bedae81SStrahinja Stanišić 100*7bedae81SStrahinja Stanišić memset(buffer, '/', sizeof(buffer)); 101*7bedae81SStrahinja Stanišić 102*7bedae81SStrahinja Stanišić for (int align = 1; align < 1 + 16; align++) { 103*7bedae81SStrahinja Stanišić char* s = buffer + align; 104*7bedae81SStrahinja Stanišić 105*7bedae81SStrahinja Stanišić for (size_t len = 0; len <= 64; len++) { 106*7bedae81SStrahinja Stanišić /* returns length */ 107*7bedae81SStrahinja Stanišić 108*7bedae81SStrahinja Stanišić /* without sentinels */ 109*7bedae81SStrahinja Stanišić s[len] = '\0'; 110*7bedae81SStrahinja Stanišić size_t val = strnlen_fn(s, SIZE_MAX); 111*7bedae81SStrahinja Stanišić if (val != len) { 112*7bedae81SStrahinja Stanišić fprintf(stderr, "align = %d, maxlen = %zu, len = %zu", 113*7bedae81SStrahinja Stanišić align, SIZE_MAX, len); 114*7bedae81SStrahinja Stanišić atf_tc_fail("returned incorrect len (SIZE_MAX)"); 115*7bedae81SStrahinja Stanišić } 116*7bedae81SStrahinja Stanišić 117*7bedae81SStrahinja Stanišić /* with sentinels */ 118*7bedae81SStrahinja Stanišić s[-1] = '\0'; 119*7bedae81SStrahinja Stanišić val = strnlen_fn(s, SIZE_MAX); 120*7bedae81SStrahinja Stanišić if (val != len) { 121*7bedae81SStrahinja Stanišić fprintf(stderr, "align = %d, maxlen = %zu, len = %zu", 122*7bedae81SStrahinja Stanišić align, SIZE_MAX, len); 123*7bedae81SStrahinja Stanišić atf_tc_fail("returned incorrect len (sentinels) (SIZE_MAX)"); 124*7bedae81SStrahinja Stanišić } 125*7bedae81SStrahinja Stanišić 126*7bedae81SStrahinja Stanišić /* cleanup */ 127*7bedae81SStrahinja Stanišić s[-1] = '/'; 128*7bedae81SStrahinja Stanišić s[len] = '/'; 129*7bedae81SStrahinja Stanišić } 130*7bedae81SStrahinja Stanišić } 131*7bedae81SStrahinja Stanišić } 132*7bedae81SStrahinja Stanišić 133*7bedae81SStrahinja Stanišić 134*7bedae81SStrahinja Stanišić 135*7bedae81SStrahinja Stanišić ATF_TP_ADD_TCS(tp) 136*7bedae81SStrahinja Stanišić { 137*7bedae81SStrahinja Stanišić ATF_TP_ADD_TC(tp, strnlen_alignments); 138*7bedae81SStrahinja Stanišić ATF_TP_ADD_TC(tp, strnlen_size_max); 139*7bedae81SStrahinja Stanišić 140*7bedae81SStrahinja Stanišić return atf_no_error(); 141*7bedae81SStrahinja Stanišić } 142