@@ -64,6 +64,14 @@ static const char *argv0;
6464/* will be used by constructor tests */
6565static int constructor_test_value ;
6666
67+ static const int is_nolibc =
68+ #ifdef NOLIBC
69+ 1
70+ #else
71+ 0
72+ #endif
73+ ;
74+
6775/* definition of a series of tests */
6876struct test {
6977 const char * name ; /* test name */
@@ -607,7 +615,7 @@ int expect_strne(const char *expr, int llen, const char *cmp)
607615static __attribute__((unused ))
608616int expect_str_buf_eq (size_t expr , const char * buf , size_t val , int llen , const char * cmp )
609617{
610- llen += printf (" = %lu <%s> " , expr , buf );
618+ llen += printf (" = %lu <%s> " , ( unsigned long ) expr , buf );
611619 if (strcmp (buf , cmp ) != 0 ) {
612620 result (llen , FAIL );
613621 return 1 ;
@@ -621,6 +629,51 @@ int expect_str_buf_eq(size_t expr, const char *buf, size_t val, int llen, const
621629 return 0 ;
622630}
623631
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+
624677/* declare tests based on line numbers. There must be exactly one test per line. */
625678#define CASE_TEST (name ) \
626679 case __LINE__: llen += printf("%d %s", test, #name);
@@ -942,6 +995,7 @@ int run_syscall(int min, int max)
942995 int ret = 0 ;
943996 void * p1 , * p2 ;
944997 int has_gettid = 1 ;
998+ int has_brk ;
945999
9461000 /* <proc> indicates whether or not /proc is mounted */
9471001 proc = stat ("/proc" , & stat_buf ) == 0 ;
@@ -954,6 +1008,9 @@ int run_syscall(int min, int max)
9541008 has_gettid = __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 30 );
9551009#endif
9561010
1011+ /* on musl setting brk()/sbrk() always fails */
1012+ has_brk = brk (0 ) == 0 ;
1013+
9571014 for (test = min ; test >= 0 && test <= max ; test ++ ) {
9581015 int llen = 0 ; /* line length */
9591016
@@ -969,9 +1026,9 @@ int run_syscall(int min, int max)
9691026 CASE_TEST (kill_0 ); EXPECT_SYSZR (1 , kill (getpid (), 0 )); break ;
9701027 CASE_TEST (kill_CONT ); EXPECT_SYSZR (1 , kill (getpid (), 0 )); break ;
9711028 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 ;
9751032 CASE_TEST (chdir_root ); EXPECT_SYSZR (1 , chdir ("/" )); chdir (getenv ("PWD" )); break ;
9761033 CASE_TEST (chdir_dot ); EXPECT_SYSZR (1 , chdir ("." )); break ;
9771034 CASE_TEST (chdir_blah ); EXPECT_SYSER (1 , chdir ("/blah" ), -1 , ENOENT ); break ;
@@ -1076,19 +1133,17 @@ int run_stdlib(int min, int max)
10761133 CASE_TEST (strchr_foobar_z ); EXPECT_STRZR (1 , strchr ("foobar" , 'z' )); break ;
10771134 CASE_TEST (strrchr_foobar_o ); EXPECT_STREQ (1 , strrchr ("foobar" , 'o' ), "obar" ); break ;
10781135 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 ;
10921147 CASE_TEST (memcmp_20_20 ); EXPECT_EQ (1 , memcmp ("aaa\x20" , "aaa\x20" , 4 ), 0 ); break ;
10931148 CASE_TEST (memcmp_20_60 ); EXPECT_LT (1 , memcmp ("aaa\x20" , "aaa\x60" , 4 ), 0 ); break ;
10941149 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)
11391194 CASE_TEST (limit_ptrdiff_min ); EXPECT_EQ (1 , PTRDIFF_MIN , sizeof (long ) == 8 ? (ptrdiff_t ) 0x8000000000000000LL : (ptrdiff_t ) 0x80000000 ); break ;
11401195 CASE_TEST (limit_ptrdiff_max ); EXPECT_EQ (1 , PTRDIFF_MAX , sizeof (long ) == 8 ? (ptrdiff_t ) 0x7fffffffffffffffLL : (ptrdiff_t ) 0x7fffffff ); break ;
11411196 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 ;
11421217
11431218 case __LINE__ :
11441219 return ret ; /* must be last */
0 commit comments