(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.c-torture/
execute/
strlen-5.c
       1  /* Test to verify that even strictly undefined strlen() calls with
       2     unterminated character arrays yield the "expected" results when
       3     the terminating nul is present in a subsequent suobobject.  */
       4  
       5  extern __SIZE_TYPE__ strlen (const char *);
       6  
       7  unsigned nfails;
       8  
       9  #define A(expr, N)						\
      10    do {								\
      11      const char *s = (expr);					\
      12      unsigned n = strlen (s);					\
      13      ((n == N)							\
      14       ? 0							\
      15       : (__builtin_printf ("line %i: strlen (%s = \"%s\")"	\
      16  			  " == %u failed\n",			\
      17  			  __LINE__, #expr, s, N),		\
      18  	++nfails));						\
      19    } while (0)
      20  
      21  
      22  int idx;
      23  
      24  
      25  const char ca[][4] = {
      26    { '1', '2', '3', '4' }, { '5' },
      27    { '1', '2', '3', '4' }, { '5', '6' },
      28    { '1', '2', '3', '4' }, { '5', '6', '7' },
      29    { '1', '2', '3', '4' }, { '5', '6', '7', '8' },
      30    { '9' }
      31  };
      32  
      33  static void test_const_global_arrays (void)
      34  {
      35    A (ca[0], 5);
      36    A (&ca[0][0], 5);
      37    A (&ca[0][1], 4);
      38    A (&ca[0][3], 2);
      39  
      40    int i = 0;
      41    A (ca[i], 5);
      42    A (&ca[i][0], 5);
      43    A (&ca[i][1], 4);
      44    A (&ca[i][3], 2);
      45  
      46    int j = i;
      47    A (&ca[i][i], 5);
      48    A (&ca[i][j + 1], 4);
      49    A (&ca[i][j + 2], 3);
      50  
      51    A (&ca[idx][i], 5);
      52    A (&ca[idx][j + 1], 4);
      53    A (&ca[idx][j + 2], 3);
      54  
      55    A (&ca[idx][idx], 5);
      56    A (&ca[idx][idx + 1], 4);
      57    A (&ca[idx][idx + 2], 3);
      58  
      59    A (&ca[0][++j], 4);
      60    A (&ca[0][++j], 3);
      61    A (&ca[0][++j], 2);
      62  
      63    if (j != 3)
      64      ++nfails;
      65  }
      66  
      67  
      68  static void test_const_local_arrays (void)
      69  {
      70    const char a[][4] = {
      71      { '1', '2', '3', '4' }, { '5' },
      72      { '1', '2', '3', '4' }, { '5', '6' },
      73      { '1', '2', '3', '4' }, { '5', '6', '7' },
      74      { '1', '2', '3', '4' }, { '5', '6', '7', '8' },
      75      { '9' }
      76    };
      77  
      78    A (a[0], 5);
      79    A (&a[0][0], 5);
      80    A (&a[0][1], 4);
      81    A (&a[0][3], 2);
      82  
      83    int i = 0;
      84    A (a[i], 5);
      85    A (&a[i][0], 5);
      86    A (&a[i][1], 4);
      87    A (&a[i][3], 2);
      88  
      89    int j = i;
      90    A (&a[i][i], 5);
      91    A (&a[i][j + 1], 4);
      92    A (&a[i][j + 2], 3);
      93  
      94    A (&a[idx][i], 5);
      95    A (&a[idx][j + 1], 4);
      96    A (&a[idx][j + 2], 3);
      97  
      98    A (&a[idx][idx], 5);
      99    A (&a[idx][idx + 1], 4);
     100    A (&a[idx][idx + 2], 3);
     101  
     102    A (&a[0][++j], 4);
     103    A (&a[0][++j], 3);
     104    A (&a[0][++j], 2);
     105  
     106    if (j != 3)
     107      ++nfails;
     108  }
     109  
     110  
     111  char va[][4] = {
     112    { '1', '2', '3', '4' }, { '5' },
     113    { '1', '2', '3', '4' }, { '5', '6' },
     114    { '1', '2', '3', '4' }, { '5', '6', '7' },
     115    { '1', '2', '3', '4' }, { '5', '6', '7', '8' },
     116    { '9' }
     117  };
     118  
     119  static void test_nonconst_global_arrays (void)
     120  {
     121    {
     122      A (va[0], 5);
     123      A (&va[0][0], 5);
     124      A (&va[0][1], 4);
     125      A (&va[0][3], 2);
     126  
     127      int i = 0;
     128      A (va[i], 5);
     129      A (&va[i][0], 5);
     130      A (&va[i][1], 4);
     131      A (&va[i][3], 2);
     132  
     133      int j = i;
     134      A (&va[i][i], 5);
     135      A (&va[i][j + 1], 4);
     136      A (&va[i][j + 2], 3);
     137  
     138      A (&va[idx][i], 5);
     139      A (&va[idx][j + 1], 4);
     140      A (&va[idx][j + 2], 3);
     141  
     142      A (&va[idx][idx], 5);
     143      A (&va[idx][idx + 1], 4);
     144      A (&va[idx][idx + 2], 3);
     145    }
     146  
     147    {
     148      A (va[2], 6);
     149      A (&va[2][0], 6);
     150      A (&va[2][1], 5);
     151      A (&va[2][3], 3);
     152  
     153      int i = 2;
     154      A (va[i], 6);
     155      A (&va[i][0], 6);
     156      A (&va[i][1], 5);
     157      A (&va[i][3], 3);
     158  
     159      int j = i - 1;
     160      A (&va[i][j - 1], 6);
     161      A (&va[i][j], 5);
     162      A (&va[i][j + 1], 4);
     163  
     164      A (&va[idx + 2][i - 1], 5);
     165      A (&va[idx + 2][j], 5);
     166      A (&va[idx + 2][j + 1], 4);
     167    }
     168  
     169    int j = 0;
     170  
     171    A (&va[0][++j], 4);
     172    A (&va[0][++j], 3);
     173    A (&va[0][++j], 2);
     174  
     175    if (j != 3)
     176      ++nfails;
     177  }
     178  
     179  
     180  static void test_nonconst_local_arrays (void)
     181  {
     182    char a[][4] = {
     183      { '1', '2', '3', '4' }, { '5' },
     184      { '1', '2', '3', '4' }, { '5', '6' },
     185      { '1', '2', '3', '4' }, { '5', '6', '7' },
     186      { '1', '2', '3', '4' }, { '5', '6', '7', '8' },
     187      { '9' }
     188    };
     189  
     190    A (a[0], 5);
     191    A (&a[0][0], 5);
     192    A (&a[0][1], 4);
     193    A (&a[0][3], 2);
     194  
     195    int i = 0;
     196    A (a[i], 5);
     197    A (&a[i][0], 5);
     198    A (&a[i][1], 4);
     199    A (&a[i][3], 2);
     200  
     201    int j = i;
     202    A (&a[i][i], 5);
     203    A (&a[i][j + 1], 4);
     204    A (&a[i][j + 2], 3);
     205  
     206    A (&a[idx][i], 5);
     207    A (&a[idx][j + 1], 4);
     208    A (&a[idx][j + 2], 3);
     209  
     210    A (&a[idx][idx], 5);
     211    A (&a[idx][idx + 1], 4);
     212    A (&a[idx][idx + 2], 3);
     213  
     214    A (&a[0][++j], 4);
     215    A (&a[0][++j], 3);
     216    A (&a[0][++j], 2);
     217  
     218    if (j != 3)
     219      ++nfails;
     220  }
     221  
     222  
     223  struct MemArrays { char a[4], b[4]; };
     224  
     225  const struct MemArrays cma[] = {
     226    { { '1', '2', '3', '4' }, { '5' } },
     227    { { '1', '2', '3', '4' }, { '5', '6' } },
     228    { { '1', '2', '3', '4' }, { '5', '6' } },
     229    { { '1', '2', '3', '4' }, { '5', '6', '7' } },
     230    { { '1', '2', '3', '4' }, { '5', '6', '7', '8' } },
     231    { { '9' }, { '\0' } }
     232  };
     233  
     234  static void test_const_global_member_arrays (void)
     235  {
     236    {
     237      A (cma[0].a, 5);
     238      A (&cma[0].a[0], 5);
     239      A (&cma[0].a[1], 4);
     240      A (&cma[0].a[2], 3);
     241  
     242      int i = 0;
     243      A (cma[i].a, 5);
     244      A (&cma[i].a[0], 5);
     245      A (&cma[i].a[1], 4);
     246      A (&cma[i].a[2], 3);
     247  
     248      int j = i;
     249      A (&cma[i].a[j], 5);
     250      A (&cma[i].a[j + 1], 4);
     251      A (&cma[i].a[j + 2], 3);
     252  
     253      A (&cma[idx].a[i], 5);
     254      A (&cma[idx].a[j + 1], 4);
     255      A (&cma[idx].a[j + 2], 3);
     256  
     257      A (&cma[idx].a[idx], 5);
     258      A (&cma[idx].a[idx + 1], 4);
     259      A (&cma[idx].a[idx + 2], 3);
     260    }
     261  
     262    {
     263      A (cma[1].a, 6);
     264      A (&cma[1].a[0], 6);
     265      A (&cma[1].a[1], 5);
     266      A (&cma[1].a[2], 4);
     267  
     268      int i = 1;
     269      A (cma[i].a, 6);
     270      A (&cma[i].a[0], 6);
     271      A (&cma[i].a[1], 5);
     272      A (&cma[i].a[2], 4);
     273  
     274      int j = i - 1;
     275      A (&cma[i].a[j], 6);
     276      A (&cma[i].a[j + 1], 5);
     277      A (&cma[i].a[j + 2], 4);
     278  
     279      A (&cma[idx + 1].a[j], 6);
     280      A (&cma[idx + 1].a[j + 1], 5);
     281      A (&cma[idx + 1].a[j + 2], 4);
     282  
     283      A (&cma[idx + 1].a[idx], 6);
     284      A (&cma[idx + 1].a[idx + 1], 5);
     285      A (&cma[idx + 1].a[idx + 2], 4);
     286    }
     287  
     288    {
     289      A (cma[4].a, 9);
     290      A (&cma[4].a[0], 9);
     291      A (&cma[4].a[1], 8);
     292      A (&cma[4].b[0], 5);
     293  
     294      int i = 4;
     295      A (cma[i].a, 9);
     296      A (&cma[i].a[0], 9);
     297      A (&cma[i].a[1], 8);
     298      A (&cma[i].b[0], 5);
     299  
     300      int j = i - 1;
     301      A (&cma[i].a[j], 6);
     302      A (&cma[i].a[j + 1], 5);
     303      A (&cma[i].b[j - 2], 4);
     304  
     305      A (&cma[idx + 4].a[j], 6);
     306      A (&cma[idx + 4].a[j + 1], 5);
     307      A (&cma[idx + 4].b[j - 2], 4);
     308  
     309      A (&cma[idx + 4].a[idx], 9);
     310      A (&cma[idx + 4].a[idx + 1], 8);
     311      A (&cma[idx + 4].b[idx + 1], 4);
     312    }
     313  }
     314  
     315  
     316  static void test_const_local_member_arrays (void)
     317  {
     318    const struct MemArrays ma[] = {
     319      { { '1', '2', '3', '4' }, { '5' } },
     320      { { '1', '2', '3', '4' }, { '5', '6' } },
     321      { { '1', '2', '3', '4' }, { '5', '6' } },
     322      { { '1', '2', '3', '4' }, { '5', '6', '7' } },
     323      { { '1', '2', '3', '4' }, { '5', '6', '7', '8' } },
     324      { { '9' }, { '\0' } }
     325    };
     326  
     327    {
     328      A (ma[0].a, 5);
     329      A (&ma[0].a[0], 5);
     330      A (&ma[0].a[1], 4);
     331      A (&ma[0].a[2], 3);
     332  
     333      int i = 0;
     334      A (ma[i].a, 5);
     335      A (&ma[i].a[0], 5);
     336      A (&ma[i].a[1], 4);
     337      A (&ma[i].a[2], 3);
     338  
     339      int j = i;
     340      A (&ma[i].a[j], 5);
     341      A (&ma[i].a[j + 1], 4);
     342      A (&ma[i].a[j + 2], 3);
     343  
     344      A (&ma[idx].a[i], 5);
     345      A (&ma[idx].a[j + 1], 4);
     346      A (&ma[idx].a[j + 2], 3);
     347  
     348      A (&ma[idx].a[idx], 5);
     349      A (&ma[idx].a[idx + 1], 4);
     350      A (&ma[idx].a[idx + 2], 3);
     351    }
     352  
     353    {
     354      A (ma[1].a, 6);
     355      A (&ma[1].a[0], 6);
     356      A (&ma[1].a[1], 5);
     357      A (&ma[1].a[2], 4);
     358  
     359      int i = 1;
     360      A (ma[i].a, 6);
     361      A (&ma[i].a[0], 6);
     362      A (&ma[i].a[1], 5);
     363      A (&ma[i].a[2], 4);
     364  
     365      int j = i - 1;
     366      A (&ma[i].a[j], 6);
     367      A (&ma[i].a[j + 1], 5);
     368      A (&ma[i].a[j + 2], 4);
     369  
     370      A (&ma[idx + 1].a[j], 6);
     371      A (&ma[idx + 1].a[j + 1], 5);
     372      A (&ma[idx + 1].a[j + 2], 4);
     373  
     374      A (&ma[idx + 1].a[idx], 6);
     375      A (&ma[idx + 1].a[idx + 1], 5);
     376      A (&ma[idx + 1].a[idx + 2], 4);
     377    }
     378  
     379    {
     380      A (ma[4].a, 9);
     381      A (&ma[4].a[0], 9);
     382      A (&ma[4].a[1], 8);
     383      A (&ma[4].b[0], 5);
     384  
     385      int i = 4;
     386      A (ma[i].a, 9);
     387      A (&ma[i].a[0], 9);
     388      A (&ma[i].a[1], 8);
     389      A (&ma[i].b[0], 5);
     390  
     391      int j = i - 1;
     392      A (&ma[i].a[j], 6);
     393      A (&ma[i].a[j + 1], 5);
     394      A (&ma[i].b[j - 2], 4);
     395  
     396      A (&ma[idx + 4].a[j], 6);
     397      A (&ma[idx + 4].a[j + 1], 5);
     398      A (&ma[idx + 4].b[j - 2], 4);
     399  
     400      A (&ma[idx + 4].a[idx], 9);
     401      A (&ma[idx + 4].a[idx + 1], 8);
     402      A (&ma[idx + 4].b[idx + 1], 4);
     403    }
     404  }
     405  
     406  struct MemArrays vma[] = {
     407    { { '1', '2', '3', '4' }, { '5' } },
     408    { { '1', '2', '3', '4' }, { '5', '6' } },
     409    { { '1', '2', '3', '4' }, { '5', '6' } },
     410    { { '1', '2', '3', '4' }, { '5', '6', '7' } },
     411    { { '1', '2', '3', '4' }, { '5', '6', '7', '8' } },
     412    { { '9' }, { '\0' } }
     413  };
     414  
     415  static void test_nonconst_global_member_arrays (void)
     416  {
     417    {
     418      A (vma[0].a, 5);
     419      A (&vma[0].a[0], 5);
     420      A (&vma[0].a[1], 4);
     421      A (&vma[0].a[2], 3);
     422  
     423      int i = 0;
     424      A (vma[i].a, 5);
     425      A (&vma[i].a[0], 5);
     426      A (&vma[i].a[1], 4);
     427      A (&vma[i].a[2], 3);
     428  
     429      int j = i;
     430      A (&vma[i].a[j], 5);
     431      A (&vma[i].a[j + 1], 4);
     432      A (&vma[i].a[j + 2], 3);
     433  
     434      A (&vma[idx].a[i], 5);
     435      A (&vma[idx].a[j + 1], 4);
     436      A (&vma[idx].a[j + 2], 3);
     437  
     438      A (&vma[idx].a[idx], 5);
     439      A (&vma[idx].a[idx + 1], 4);
     440      A (&vma[idx].a[idx + 2], 3);
     441    }
     442  
     443    {
     444      A (vma[1].a, 6);
     445      A (&vma[1].a[0], 6);
     446      A (&vma[1].a[1], 5);
     447      A (&vma[1].a[2], 4);
     448  
     449      int i = 1;
     450      A (vma[i].a, 6);
     451      A (&vma[i].a[0], 6);
     452      A (&vma[i].a[1], 5);
     453      A (&vma[i].a[2], 4);
     454  
     455      int j = i - 1;
     456      A (&vma[i].a[j], 6);
     457      A (&vma[i].a[j + 1], 5);
     458      A (&vma[i].a[j + 2], 4);
     459  
     460      A (&vma[idx + 1].a[j], 6);
     461      A (&vma[idx + 1].a[j + 1], 5);
     462      A (&vma[idx + 1].a[j + 2], 4);
     463  
     464      A (&vma[idx + 1].a[idx], 6);
     465      A (&vma[idx + 1].a[idx + 1], 5);
     466      A (&vma[idx + 1].a[idx + 2], 4);
     467    }
     468  
     469    {
     470      A (vma[4].a, 9);
     471      A (&vma[4].a[0], 9);
     472      A (&vma[4].a[1], 8);
     473      A (&vma[4].b[0], 5);
     474  
     475      int i = 4;
     476      A (vma[i].a, 9);
     477      A (&vma[i].a[0], 9);
     478      A (&vma[i].a[1], 8);
     479      A (&vma[i].b[0], 5);
     480  
     481      int j = i - 1;
     482      A (&vma[i].a[j], 6);
     483      A (&vma[i].a[j + 1], 5);
     484      A (&vma[i].b[j - 2], 4);
     485  
     486      A (&vma[idx + 4].a[j], 6);
     487      A (&vma[idx + 4].a[j + 1], 5);
     488      A (&vma[idx + 4].b[j - 2], 4);
     489  
     490      A (&vma[idx + 4].a[idx], 9);
     491      A (&vma[idx + 4].a[idx + 1], 8);
     492      A (&vma[idx + 4].b[idx + 1], 4);
     493    }
     494  }
     495  
     496  
     497  static void test_nonconst_local_member_arrays (void)
     498  {
     499    struct MemArrays ma[] = {
     500      { { '1', '2', '3', '4' }, { '5' } },
     501      { { '1', '2', '3', '4' }, { '5', '6' } },
     502      { { '1', '2', '3', '4' }, { '5', '6' } },
     503      { { '1', '2', '3', '4' }, { '5', '6', '7' } },
     504      { { '1', '2', '3', '4' }, { '5', '6', '7', '8' } },
     505      { { '9' }, { '\0' } }
     506    };
     507  
     508    {
     509      A (ma[0].a, 5);
     510      A (&ma[0].a[0], 5);
     511      A (&ma[0].a[1], 4);
     512      A (&ma[0].a[2], 3);
     513  
     514      int i = 0;
     515      A (ma[i].a, 5);
     516      A (&ma[i].a[0], 5);
     517      A (&ma[i].a[1], 4);
     518      A (&ma[i].a[2], 3);
     519  
     520      int j = i;
     521      A (&ma[i].a[j], 5);
     522      A (&ma[i].a[j + 1], 4);
     523      A (&ma[i].a[j + 2], 3);
     524  
     525      A (&ma[idx].a[i], 5);
     526      A (&ma[idx].a[j + 1], 4);
     527      A (&ma[idx].a[j + 2], 3);
     528  
     529      A (&ma[idx].a[idx], 5);
     530      A (&ma[idx].a[idx + 1], 4);
     531      A (&ma[idx].a[idx + 2], 3);
     532    }
     533  
     534    {
     535      A (ma[1].a, 6);
     536      A (&ma[1].a[0], 6);
     537      A (&ma[1].a[1], 5);
     538      A (&ma[1].a[2], 4);
     539  
     540      int i = 1;
     541      A (ma[i].a, 6);
     542      A (&ma[i].a[0], 6);
     543      A (&ma[i].a[1], 5);
     544      A (&ma[i].a[2], 4);
     545  
     546      int j = i - 1;
     547      A (&ma[i].a[j], 6);
     548      A (&ma[i].a[j + 1], 5);
     549      A (&ma[i].a[j + 2], 4);
     550  
     551      A (&ma[idx + 1].a[j], 6);
     552      A (&ma[idx + 1].a[j + 1], 5);
     553      A (&ma[idx + 1].a[j + 2], 4);
     554  
     555      A (&ma[idx + 1].a[idx], 6);
     556      A (&ma[idx + 1].a[idx + 1], 5);
     557      A (&ma[idx + 1].a[idx + 2], 4);
     558    }
     559  
     560    {
     561      A (ma[4].a, 9);
     562      A (&ma[4].a[0], 9);
     563      A (&ma[4].a[1], 8);
     564      A (&ma[4].b[0], 5);
     565  
     566      int i = 4;
     567      A (ma[i].a, 9);
     568      A (&ma[i].a[0], 9);
     569      A (&ma[i].a[1], 8);
     570      A (&ma[i].b[0], 5);
     571  
     572      int j = i - 1;
     573      A (&ma[i].a[j], 6);
     574      A (&ma[i].a[j + 1], 5);
     575      A (&ma[i].b[j - 2], 4);
     576  
     577      A (&ma[idx + 4].a[j], 6);
     578      A (&ma[idx + 4].a[j + 1], 5);
     579      A (&ma[idx + 4].b[j - 2], 4);
     580  
     581      A (&ma[idx + 4].a[idx], 9);
     582      A (&ma[idx + 4].a[idx + 1], 8);
     583      A (&ma[idx + 4].b[idx + 1], 4);
     584    }
     585  }
     586  
     587  
     588  union UnionMemberArrays
     589  {
     590    struct { char a[4], b[4]; } a;
     591    struct { char a[8]; } c;
     592  };
     593  
     594  const union UnionMemberArrays cu = {
     595    { { '1', '2', '3', '4' }, { '5', } }
     596  };
     597  
     598  static void test_const_union_member_arrays (void)
     599  {
     600    A (cu.a.a, 5);
     601    A (cu.a.b, 1);
     602    A (cu.c.a, 5);
     603  
     604    const union UnionMemberArrays clu = {
     605      { { '1', '2', '3', '4' }, { '5', '6' } }
     606    };
     607  
     608    A (clu.a.a, 6);
     609    A (clu.a.b, 2);
     610    A (clu.c.a, 6);
     611  }
     612  
     613  
     614  union UnionMemberArrays vu = {
     615    { { '1', '2', '3', '4' }, { '5', '6' } }
     616  };
     617  
     618  static void test_nonconst_union_member_arrays (void)
     619  {
     620    A (vu.a.a, 6);
     621    A (vu.a.b, 2);
     622    A (vu.c.a, 6);
     623  
     624    union UnionMemberArrays lvu = {
     625      { { '1', '2', '3', '4' }, { '5', '6', '7' } }
     626    };
     627  
     628    A (lvu.a.a, 7);
     629    A (lvu.a.b, 3);
     630    A (lvu.c.a, 7);
     631  }
     632  
     633  
     634  int main (void)
     635  {
     636    test_const_global_arrays ();
     637    test_const_local_arrays ();
     638  
     639    test_nonconst_global_arrays ();
     640    test_nonconst_local_arrays ();
     641  
     642    test_const_global_member_arrays ();
     643    test_const_local_member_arrays ();
     644  
     645    test_nonconst_global_member_arrays ();
     646    test_nonconst_local_member_arrays ();
     647  
     648    test_const_union_member_arrays ();
     649    test_nonconst_union_member_arrays ();
     650  
     651    if (nfails)
     652      __builtin_abort ();
     653  }