@@ -64,6 +64,14 @@ static const char *argv0;
64
64
/* will be used by constructor tests */
65
65
static int constructor_test_value ;
66
66
67
+ static const int is_nolibc =
68
+ #ifdef NOLIBC
69
+ 1
70
+ #else
71
+ 0
72
+ #endif
73
+ ;
74
+
67
75
/* definition of a series of tests */
68
76
struct test {
69
77
const char * name ; /* test name */
@@ -607,7 +615,7 @@ int expect_strne(const char *expr, int llen, const char *cmp)
607
615
static __attribute__((unused ))
608
616
int expect_str_buf_eq (size_t expr , const char * buf , size_t val , int llen , const char * cmp )
609
617
{
610
- llen += printf (" = %lu <%s> " , expr , buf );
618
+ llen += printf (" = %lu <%s> " , ( unsigned long ) expr , buf );
611
619
if (strcmp (buf , cmp ) != 0 ) {
612
620
result (llen , FAIL );
613
621
return 1 ;
@@ -621,6 +629,51 @@ int expect_str_buf_eq(size_t expr, const char *buf, size_t val, int llen, const
621
629
return 0 ;
622
630
}
623
631
632
+ #define EXPECT_STRTOX (cond , func , input , base , expected , chars , expected_errno ) \
633
+ do { if (!(cond)) result(llen, SKIPPED); else ret += expect_strtox(llen, func, input, base, expected, chars, expected_errno); } while (0)
634
+
635
+ static __attribute__((unused ))
636
+ int expect_strtox (int llen , void * func , const char * input , int base , intmax_t expected , int expected_chars , int expected_errno )
637
+ {
638
+ char * endptr ;
639
+ int actual_errno , actual_chars ;
640
+ intmax_t r ;
641
+
642
+ errno = 0 ;
643
+ if (func == strtol ) {
644
+ r = strtol (input , & endptr , base );
645
+ } else if (func == strtoul ) {
646
+ r = strtoul (input , & endptr , base );
647
+ } else {
648
+ result (llen , FAIL );
649
+ return 1 ;
650
+ }
651
+ actual_errno = errno ;
652
+ actual_chars = endptr - input ;
653
+
654
+ llen += printf (" %lld = %lld" , (long long )expected , (long long )r );
655
+ if (r != expected ) {
656
+ result (llen , FAIL );
657
+ return 1 ;
658
+ }
659
+ if (expected_chars == -1 ) {
660
+ if (* endptr != '\0' ) {
661
+ result (llen , FAIL );
662
+ return 1 ;
663
+ }
664
+ } else if (expected_chars != actual_chars ) {
665
+ result (llen , FAIL );
666
+ return 1 ;
667
+ }
668
+ if (actual_errno != expected_errno ) {
669
+ result (llen , FAIL );
670
+ return 1 ;
671
+ }
672
+
673
+ result (llen , OK );
674
+ return 0 ;
675
+ }
676
+
624
677
/* declare tests based on line numbers. There must be exactly one test per line. */
625
678
#define CASE_TEST (name ) \
626
679
case __LINE__: llen += printf("%d %s", test, #name);
@@ -942,6 +995,7 @@ int run_syscall(int min, int max)
942
995
int ret = 0 ;
943
996
void * p1 , * p2 ;
944
997
int has_gettid = 1 ;
998
+ int has_brk ;
945
999
946
1000
/* <proc> indicates whether or not /proc is mounted */
947
1001
proc = stat ("/proc" , & stat_buf ) == 0 ;
@@ -954,6 +1008,9 @@ int run_syscall(int min, int max)
954
1008
has_gettid = __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 30 );
955
1009
#endif
956
1010
1011
+ /* on musl setting brk()/sbrk() always fails */
1012
+ has_brk = brk (0 ) == 0 ;
1013
+
957
1014
for (test = min ; test >= 0 && test <= max ; test ++ ) {
958
1015
int llen = 0 ; /* line length */
959
1016
@@ -969,9 +1026,9 @@ int run_syscall(int min, int max)
969
1026
CASE_TEST (kill_0 ); EXPECT_SYSZR (1 , kill (getpid (), 0 )); break ;
970
1027
CASE_TEST (kill_CONT ); EXPECT_SYSZR (1 , kill (getpid (), 0 )); break ;
971
1028
CASE_TEST (kill_BADPID ); EXPECT_SYSER (1 , kill (INT_MAX , 0 ), -1 , ESRCH ); break ;
972
- CASE_TEST (sbrk_0 ); EXPECT_PTRNE (1 , sbrk (0 ), (void * )-1 ); break ;
973
- CASE_TEST (sbrk ); if ((p1 = p2 = sbrk (4096 )) != (void * )-1 ) p2 = sbrk (-4096 ); EXPECT_SYSZR (1 , (p2 == (void * )-1 ) || p2 == p1 ); break ;
974
- CASE_TEST (brk ); EXPECT_SYSZR (1 , brk (sbrk (0 ))); break ;
1029
+ CASE_TEST (sbrk_0 ); EXPECT_PTRNE (has_brk , sbrk (0 ), (void * )-1 ); break ;
1030
+ CASE_TEST (sbrk ); if ((p1 = p2 = sbrk (4096 )) != (void * )-1 ) p2 = sbrk (-4096 ); EXPECT_SYSZR (has_brk , (p2 == (void * )-1 ) || p2 == p1 ); break ;
1031
+ CASE_TEST (brk ); EXPECT_SYSZR (has_brk , brk (sbrk (0 ))); break ;
975
1032
CASE_TEST (chdir_root ); EXPECT_SYSZR (1 , chdir ("/" )); chdir (getenv ("PWD" )); break ;
976
1033
CASE_TEST (chdir_dot ); EXPECT_SYSZR (1 , chdir ("." )); break ;
977
1034
CASE_TEST (chdir_blah ); EXPECT_SYSER (1 , chdir ("/blah" ), -1 , ENOENT ); break ;
@@ -1076,19 +1133,17 @@ int run_stdlib(int min, int max)
1076
1133
CASE_TEST (strchr_foobar_z ); EXPECT_STRZR (1 , strchr ("foobar" , 'z' )); break ;
1077
1134
CASE_TEST (strrchr_foobar_o ); EXPECT_STREQ (1 , strrchr ("foobar" , 'o' ), "obar" ); break ;
1078
1135
CASE_TEST (strrchr_foobar_z ); EXPECT_STRZR (1 , strrchr ("foobar" , 'z' )); break ;
1079
- #ifdef NOLIBC
1080
- CASE_TEST (strlcat_0 ); EXPECT_STRBUFEQ (1 , strlcat (buf , "bar" , 0 ), buf , 3 , "test" ); break ;
1081
- CASE_TEST (strlcat_1 ); EXPECT_STRBUFEQ (1 , strlcat (buf , "bar" , 1 ), buf , 4 , "test" ); break ;
1082
- CASE_TEST (strlcat_5 ); EXPECT_STRBUFEQ (1 , strlcat (buf , "bar" , 5 ), buf , 7 , "test" ); break ;
1083
- CASE_TEST (strlcat_6 ); EXPECT_STRBUFEQ (1 , strlcat (buf , "bar" , 6 ), buf , 7 , "testb" ); break ;
1084
- CASE_TEST (strlcat_7 ); EXPECT_STRBUFEQ (1 , strlcat (buf , "bar" , 7 ), buf , 7 , "testba" ); break ;
1085
- CASE_TEST (strlcat_8 ); EXPECT_STRBUFEQ (1 , strlcat (buf , "bar" , 8 ), buf , 7 , "testbar" ); break ;
1086
- CASE_TEST (strlcpy_0 ); EXPECT_STRBUFEQ (1 , strlcpy (buf , "bar" , 0 ), buf , 3 , "test" ); break ;
1087
- CASE_TEST (strlcpy_1 ); EXPECT_STRBUFEQ (1 , strlcpy (buf , "bar" , 1 ), buf , 3 , "" ); break ;
1088
- CASE_TEST (strlcpy_2 ); EXPECT_STRBUFEQ (1 , strlcpy (buf , "bar" , 2 ), buf , 3 , "b" ); break ;
1089
- CASE_TEST (strlcpy_3 ); EXPECT_STRBUFEQ (1 , strlcpy (buf , "bar" , 3 ), buf , 3 , "ba" ); break ;
1090
- CASE_TEST (strlcpy_4 ); EXPECT_STRBUFEQ (1 , strlcpy (buf , "bar" , 4 ), buf , 3 , "bar" ); break ;
1091
- #endif
1136
+ CASE_TEST (strlcat_0 ); EXPECT_STRBUFEQ (is_nolibc , strlcat (buf , "bar" , 0 ), buf , 3 , "test" ); break ;
1137
+ CASE_TEST (strlcat_1 ); EXPECT_STRBUFEQ (is_nolibc , strlcat (buf , "bar" , 1 ), buf , 4 , "test" ); break ;
1138
+ CASE_TEST (strlcat_5 ); EXPECT_STRBUFEQ (is_nolibc , strlcat (buf , "bar" , 5 ), buf , 7 , "test" ); break ;
1139
+ CASE_TEST (strlcat_6 ); EXPECT_STRBUFEQ (is_nolibc , strlcat (buf , "bar" , 6 ), buf , 7 , "testb" ); break ;
1140
+ CASE_TEST (strlcat_7 ); EXPECT_STRBUFEQ (is_nolibc , strlcat (buf , "bar" , 7 ), buf , 7 , "testba" ); break ;
1141
+ CASE_TEST (strlcat_8 ); EXPECT_STRBUFEQ (is_nolibc , strlcat (buf , "bar" , 8 ), buf , 7 , "testbar" ); break ;
1142
+ CASE_TEST (strlcpy_0 ); EXPECT_STRBUFEQ (is_nolibc , strlcpy (buf , "bar" , 0 ), buf , 3 , "test" ); break ;
1143
+ CASE_TEST (strlcpy_1 ); EXPECT_STRBUFEQ (is_nolibc , strlcpy (buf , "bar" , 1 ), buf , 3 , "" ); break ;
1144
+ CASE_TEST (strlcpy_2 ); EXPECT_STRBUFEQ (is_nolibc , strlcpy (buf , "bar" , 2 ), buf , 3 , "b" ); break ;
1145
+ CASE_TEST (strlcpy_3 ); EXPECT_STRBUFEQ (is_nolibc , strlcpy (buf , "bar" , 3 ), buf , 3 , "ba" ); break ;
1146
+ CASE_TEST (strlcpy_4 ); EXPECT_STRBUFEQ (is_nolibc , strlcpy (buf , "bar" , 4 ), buf , 3 , "bar" ); break ;
1092
1147
CASE_TEST (memcmp_20_20 ); EXPECT_EQ (1 , memcmp ("aaa\x20" , "aaa\x20" , 4 ), 0 ); break ;
1093
1148
CASE_TEST (memcmp_20_60 ); EXPECT_LT (1 , memcmp ("aaa\x20" , "aaa\x60" , 4 ), 0 ); break ;
1094
1149
CASE_TEST (memcmp_60_20 ); EXPECT_GT (1 , memcmp ("aaa\x60" , "aaa\x20" , 4 ), 0 ); break ;
@@ -1139,6 +1194,26 @@ int run_stdlib(int min, int max)
1139
1194
CASE_TEST (limit_ptrdiff_min ); EXPECT_EQ (1 , PTRDIFF_MIN , sizeof (long ) == 8 ? (ptrdiff_t ) 0x8000000000000000LL : (ptrdiff_t ) 0x80000000 ); break ;
1140
1195
CASE_TEST (limit_ptrdiff_max ); EXPECT_EQ (1 , PTRDIFF_MAX , sizeof (long ) == 8 ? (ptrdiff_t ) 0x7fffffffffffffffLL : (ptrdiff_t ) 0x7fffffff ); break ;
1141
1196
CASE_TEST (limit_size_max ); EXPECT_EQ (1 , SIZE_MAX , sizeof (long ) == 8 ? (size_t ) 0xffffffffffffffffULL : (size_t ) 0xffffffffU ); break ;
1197
+ CASE_TEST (strtol_simple ); EXPECT_STRTOX (1 , strtol , "35" , 10 , 35 , -1 , 0 ); break ;
1198
+ CASE_TEST (strtol_positive ); EXPECT_STRTOX (1 , strtol , "+35" , 10 , 35 , -1 , 0 ); break ;
1199
+ CASE_TEST (strtol_negative ); EXPECT_STRTOX (1 , strtol , "-35" , 10 , -35 , -1 , 0 ); break ;
1200
+ CASE_TEST (strtol_hex_auto ); EXPECT_STRTOX (1 , strtol , "0xFF" , 0 , 255 , -1 , 0 ); break ;
1201
+ CASE_TEST (strtol_base36 ); EXPECT_STRTOX (1 , strtol , "12yZ" , 36 , 50507 , -1 , 0 ); break ;
1202
+ CASE_TEST (strtol_cutoff ); EXPECT_STRTOX (1 , strtol , "1234567890" , 8 , 342391 , 7 , 0 ); break ;
1203
+ CASE_TEST (strtol_octal_auto ); EXPECT_STRTOX (1 , strtol , "011" , 0 , 9 , -1 , 0 ); break ;
1204
+ CASE_TEST (strtol_hex_00 ); EXPECT_STRTOX (1 , strtol , "0x00" , 16 , 0 , -1 , 0 ); break ;
1205
+ CASE_TEST (strtol_hex_FF ); EXPECT_STRTOX (1 , strtol , "FF" , 16 , 255 , -1 , 0 ); break ;
1206
+ CASE_TEST (strtol_hex_ff ); EXPECT_STRTOX (1 , strtol , "ff" , 16 , 255 , -1 , 0 ); break ;
1207
+ CASE_TEST (strtol_hex_prefix ); EXPECT_STRTOX (1 , strtol , "0xFF" , 16 , 255 , -1 , 0 ); break ;
1208
+ CASE_TEST (strtol_trailer ); EXPECT_STRTOX (1 , strtol , "35foo" , 10 , 35 , 2 , 0 ); break ;
1209
+ CASE_TEST (strtol_overflow ); EXPECT_STRTOX (1 , strtol , "0x8000000000000000" , 16 , LONG_MAX , -1 , ERANGE ); break ;
1210
+ CASE_TEST (strtol_underflow ); EXPECT_STRTOX (1 , strtol , "-0x8000000000000001" , 16 , LONG_MIN , -1 , ERANGE ); break ;
1211
+ CASE_TEST (strtoul_negative ); EXPECT_STRTOX (1 , strtoul , "-0x1" , 16 , ULONG_MAX , 4 , 0 ); break ;
1212
+ CASE_TEST (strtoul_overflow ); EXPECT_STRTOX (1 , strtoul , "0x10000000000000000" , 16 , ULONG_MAX , -1 , ERANGE ); break ;
1213
+ CASE_TEST (strerror_success ); EXPECT_STREQ (is_nolibc , strerror (0 ), "errno=0" ); break ;
1214
+ CASE_TEST (strerror_EINVAL ); EXPECT_STREQ (is_nolibc , strerror (EINVAL ), "errno=22" ); break ;
1215
+ CASE_TEST (strerror_int_max ); EXPECT_STREQ (is_nolibc , strerror (INT_MAX ), "errno=2147483647" ); break ;
1216
+ CASE_TEST (strerror_int_min ); EXPECT_STREQ (is_nolibc , strerror (INT_MIN ), "errno=-2147483648" ); break ;
1142
1217
1143
1218
case __LINE__ :
1144
1219
return ret ; /* must be last */
0 commit comments