modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/execute/strlen-4.c (about)

     1  /* PR tree-optimization/86622 - incorrect strlen of array of array plus
     2     variable offset
     3     Exercise strlen() with a multi-dimensional array of strings with
     4     offsets.  */
     5  
     6  extern int printf (const char*, ...);
     7  extern __SIZE_TYPE__ strlen (const char*);
     8  
     9  typedef char A28[28];
    10  typedef A28 A3_28[3];
    11  typedef A3_28 A2_3_28[2];
    12  
    13  static const A2_3_28 a = {
    14    /* [0][0]    [0][1]         [0][2] */
    15    { "1\00012", "123\0001234", "12345\000123456" },
    16    /* [1][0]    [1][1]         [1][2] */
    17    { "1234567\00012345678", "123456789\0001234567890", "12345678901\000123456789012" }
    18  };
    19  
    20  volatile int v0 = 0;
    21  volatile int v1 = 1;
    22  volatile int v2 = 2;
    23  volatile int v3 = 3;
    24  volatile int v4 = 4;
    25  volatile int v5 = 5;
    26  volatile int v6 = 6;
    27  volatile int v7 = 7;
    28  
    29  #define A(expr, N)							\
    30    ((strlen (expr) == N)							\
    31     ? (void)0 : (printf ("line %i: strlen (%s = \"%s\") != %i\n",	\
    32  			__LINE__, #expr, expr, N),			\
    33  		__builtin_abort ()))
    34  
    35  /* Verify that strlen() involving pointer to array arguments computes
    36     the correct result.  */
    37  
    38  void test_array_ptr (void)
    39  {
    40    /* Compute the length of the string at the refeenced array.  */
    41    A (*(&a[0][0] + 0), 1);
    42    A (*(&a[0][0] + 1), 3);
    43    A (*(&a[0][0] + 2), 5);
    44  
    45    A (*(&a[0][1] - 1), 1);
    46    A (*(&a[0][1] + 0), 3);
    47    A (*(&a[0][1] + 1), 5);
    48  
    49    A (*(&a[0][2] - 2), 1);
    50    A (*(&a[0][2] - 1), 3);
    51    A (*(&a[0][2] + 0), 5);
    52  
    53    A (*(&a[1][0] + 0), 7);
    54    A (*(&a[1][0] + 1), 9);
    55    A (*(&a[1][0] + 2), 11);
    56  
    57    A (*(&a[1][1] - 1), 7);
    58    A (*(&a[1][1] + 0), 9);
    59    A (*(&a[1][1] + 1), 11);
    60  
    61    A (*(&a[1][2] - 2), 7);
    62    A (*(&a[1][2] - 1), 9);
    63    A (*(&a[1][2] - 0), 11);
    64  
    65    /* Compute the length of the string past the first nul.  */
    66    A (*(&a[0][0] + 0) + 2, 2);
    67    A (*(&a[0][0] + 1) + 4, 4);
    68    A (*(&a[0][0] + 2) + 6, 6);
    69  
    70    /* Compute the length of the string past the second nul.  */
    71    A (*(&a[0][0] + 0) + 5, 0);
    72    A (*(&a[0][0] + 1) + 10, 0);
    73    A (*(&a[0][0] + 2) + 14, 0);
    74  
    75    int i0 = 0;
    76    int i1 = i0 + 1;
    77    int i2 = i1 + 1;
    78    int i3 = i2 + 1;
    79    int i4 = i3 + 1;
    80    int i5 = i4 + 1;
    81  
    82    A (*(&a[0][0] + i0), 1);
    83    A (*(&a[0][0] + i1), 3);
    84    A (*(&a[0][0] + i2), 5);
    85  
    86    A (*(&a[0][1] - i1), 1);
    87    A (*(&a[0][1] + i0), 3);
    88    A (*(&a[0][1] + i1), 5);
    89  
    90    A (*(&a[0][2] - i2), 1);
    91    A (*(&a[0][2] - i1), 3);
    92    A (*(&a[0][2] + i0), 5);
    93  
    94    A (*(&a[1][0] + i0), 7);
    95    A (*(&a[1][0] + i1), 9);
    96    A (*(&a[1][0] + i2), 11);
    97  
    98    A (*(&a[1][1] - i1), 7);
    99    A (*(&a[1][1] + i0), 9);
   100    A (*(&a[1][1] + i1), 11);
   101  
   102    A (*(&a[1][2] - i2), 7);
   103    A (*(&a[1][2] - i1), 9);
   104    A (*(&a[1][2] - i0), 11);
   105  
   106  
   107    A (*(&a[i0][i0] + i0), 1);
   108    A (*(&a[i0][i0] + i1), 3);
   109    A (*(&a[i0][i0] + i2), 5);
   110  
   111    A (*(&a[i0][i1] - i1), 1);
   112    A (*(&a[i0][i1] + i0), 3);
   113    A (*(&a[i0][i1] + i1), 5);
   114  
   115    A (*(&a[i0][i2] - i2), 1);
   116    A (*(&a[i0][i2] - i1), 3);
   117    A (*(&a[i0][i2] + i0), 5);
   118  
   119    A (*(&a[i1][i0] + i0), 7);
   120    A (*(&a[i1][i0] + i1), 9);
   121    A (*(&a[i1][i0] + i2), 11);
   122  
   123    A (*(&a[i1][i1] - i1), 7);
   124    A (*(&a[i1][i1] + i0), 9);
   125    A (*(&a[i1][i1] + i1), 11);
   126  
   127    A (*(&a[i1][i2] - i2), 7);
   128    A (*(&a[i1][i2] - i1), 9);
   129    A (*(&a[i1][i2] - i0), 11);
   130  
   131  
   132    A (*(&a[i0][i0] + v0), 1);
   133    A (*(&a[i0][i0] + v1), 3);
   134    A (*(&a[i0][i0] + v2), 5);
   135  
   136    A (*(&a[i0][i1] - v1), 1);
   137    A (*(&a[i0][i1] + v0), 3);
   138    A (*(&a[i0][i1] + v1), 5);
   139  
   140    A (*(&a[i0][i2] - v2), 1);
   141    A (*(&a[i0][i2] - v1), 3);
   142    A (*(&a[i0][i2] + v0), 5);
   143  
   144    A (*(&a[i1][i0] + v0), 7);
   145    A (*(&a[i1][i0] + v1), 9);
   146    A (*(&a[i1][i0] + v2), 11);
   147  
   148    A (*(&a[i1][i1] - v1), 7);
   149    A (*(&a[i1][i1] + v0), 9);
   150    A (*(&a[i1][i1] + v1), 11);
   151  
   152    A (*(&a[i1][i2] - v2), 7);
   153    A (*(&a[i1][i2] - v1), 9);
   154    A (*(&a[i1][i2] - v0), 11);
   155  
   156  
   157    A (*(&a[i0][i0] + v0) + i1, 0);
   158    A (*(&a[i0][i0] + v1) + i2, 1);
   159    A (*(&a[i0][i0] + v2) + i3, 2);
   160  
   161    A (*(&a[i0][i1] - v1) + v1, 0);
   162    A (*(&a[i0][i1] + v0) + v3, 0);
   163    A (*(&a[i0][i1] + v1) + v5, 0);
   164  
   165    A (*(&a[i0][v1] - i1) + i1, 0);
   166    A (*(&a[i0][v1] + i0) + i3, 0);
   167    A (*(&a[i0][v1] + i1) + i5, 0);
   168  }
   169  
   170  static const A3_28* const pa0 = &a[0];
   171  static const A3_28* const pa1 = &a[1];
   172  
   173  static const A3_28* const paa[] = { &a[0], &a[1] };
   174  
   175  /* Verify that strlen() involving pointers and arrays of pointers
   176     to array arguments computes the correct result.  */
   177  
   178  void test_ptr_array (void)
   179  {
   180    int i0 = 0;
   181    int i1 = i0 + 1;
   182    int i2 = i1 + 1;
   183    int i3 = i2 + 1;
   184  
   185    A (*((*pa0) + i0), 1);
   186    A (*((*pa0) + i1), 3);
   187    A (*((*pa0) + i2), 5);
   188  
   189    A (*(pa0[0] + i0), 1);
   190    A (*(pa0[0] + i1), 3);
   191    A (*(pa0[0] + i2), 5);
   192  
   193    A ((*pa0)[i0] + i1, 0);
   194    A ((*pa0)[i1] + i2, 1);
   195    A ((*pa0)[i2] + i3, 2);
   196  
   197  
   198    A (*((*pa1) + i0), 7);
   199    A (*((*pa1) + i1), 9);
   200    A (*((*pa1) + i2), 11);
   201  
   202    A (*(pa1[0] + i0), 7);
   203    A (*(pa1[0] + i1), 9);
   204    A (*(pa1[0] + i2), 11);
   205  
   206    A ((*pa1)[i0] + i1, 6);
   207    A ((*pa1)[i1] + i2, 7);
   208    A ((*pa1)[i2] + i3, 8);
   209  
   210    A (*(*(paa[0]) + i0), 1);
   211    A (*(*(paa[0]) + i1), 3);
   212    A (*(*(paa[0]) + i2), 5);
   213  
   214    A (*(*(paa[1]) + i0), 7);
   215    A (*(*(paa[1]) + i1), 9);
   216    A (*(*(paa[1]) + i2), 11);
   217  
   218    A (*(*(paa[1]) - i1), 5);
   219    A (*(*(paa[1]) - i2), 3);
   220    A (*(*(paa[1]) - i3), 1);
   221  
   222    A (*(*(paa[0]) + i0) + i1, 0);
   223    A (*(*(paa[0]) + i1) + i2, 1);
   224    A (*(*(paa[0]) + i2) + i3, 2);
   225  }
   226  
   227  int main (void)
   228  {
   229    test_array_ptr ();
   230  
   231    test_ptr_array ();
   232  }