(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
warn-strnlen-no-nul.c
       1  /* PR tree-optimization/86552 - missing warning for reading past the end
       2     of non-string arrays
       3     { dg-do compile }
       4     { dg-options "-O2 -Wall -ftrack-macro-expansion=0" } */
       5  
       6  typedef __SIZE_TYPE__ size_t;
       7  extern size_t strnlen (const char*, size_t);
       8  
       9  const char a[5] = "12345";   /* { dg-message "declared here" } */
      10  enum { asz = sizeof a };
      11  
      12  int v0 = 0;
      13  int v1 = 1;
      14  
      15  void sink (int, ...);
      16  
      17  #define CONCAT(a, b)   a ## b
      18  #define CAT(a, b)      CONCAT(a, b)
      19  
      20  #define T(str, n)					\
      21    __attribute__ ((noipa))				\
      22    void CAT (test_, __LINE__) (void) {			\
      23      int i0 = 0, i1 = i0 + 1, i2 = i1 + 1, i3 = i2 + 1;	\
      24      sink (strnlen (str, n), i0, i1, i2, i3);		\
      25    } typedef void dummy_type
      26  
      27  T (a, asz);
      28  T (a, asz - 1);
      29  T (a, asz - 2);
      30  T (a, asz - 5);
      31  T (&a[0], asz);
      32  T (&a[0] + 1, asz);            /* { dg-warning "specified bound 5 exceeds the size 4 of unterminated array" } */
      33  T (&a[1], asz);                /* { dg-warning "specified bound 5 exceeds the size 4 of unterminated array" } */
      34  T (&a[1], asz - 1);
      35  T (&a[v0], asz);               /* { dg-warning "specified bound 5 may exceed the size of at most 5 of unterminated array" } */
      36  T (&a[v0] + 1, asz);           /* { dg-warning "specified bound 5 may exceed the size of at most 5 of unterminated array" } */
      37  
      38  T (a, asz + 1);                /* { dg-warning "specified bound 6 exceeds the size 5 of unterminated array" } */
      39  T (&a[0], asz + 1);            /* { dg-warning "unterminated" } */
      40  T (&a[0] + 1, asz - 1);
      41  T (&a[0] + 1, asz + 1);        /* { dg-warning "unterminated" } */
      42  T (&a[1], asz + 1);            /* { dg-warning "unterminated" } */
      43  T (&a[v0], asz + 1);           /* { dg-warning "unterminated" } */
      44  T (&a[v0] + 1, asz + 1);       /* { dg-warning "unterminated" } */
      45  
      46  
      47  const char b[][5] = { /* { dg-message "declared here" } */
      48    "12", "123", "1234", "54321"
      49  };
      50  enum { bsz = sizeof b[0] };
      51  
      52  T (b[0], bsz);
      53  T (b[1], bsz);
      54  T (b[2], bsz);
      55  T (b[3], bsz);
      56  
      57  T (b[0], bsz - 1);
      58  T (b[1], bsz - 1);
      59  T (b[2], bsz - 1);
      60  T (b[3], bsz - 1);
      61  
      62  T (b[0], bsz + 1);
      63  T (b[1], bsz + 1);
      64  T (b[2], bsz + 1);
      65  T (b[3], bsz + 1);            /* { dg-warning "unterminated" } */
      66  
      67  T (b[i0], bsz);
      68  T (b[i1], bsz);
      69  T (b[i2], bsz);
      70  T (b[i3], bsz);
      71  
      72  T (b[i0], bsz + 1);
      73  T (b[i1], bsz + 1);
      74  T (b[i2], bsz + 1);
      75  T (b[i3], bsz + 1);           /* { dg-warning "unterminated" } */
      76  
      77  T (b[v0], bsz);
      78  T (b[v0], bsz + 1);
      79  
      80  T (&b[i2][i1], bsz);
      81  T (&b[i2][i1] + i1, bsz);
      82  T (&b[i2][v0], bsz);
      83  T (&b[i2][i1] + v0, bsz);
      84  
      85  T (&b[i2][i1], bsz + 1);
      86  T (&b[i2][i1] + i1, bsz + 1);
      87  T (&b[i2][v0], bsz + 1);
      88  T (&b[i2][i1] + v0, bsz + 1);
      89  
      90  T (&b[2][1], bsz);
      91  T (&b[2][1] + i1, bsz);
      92  T (&b[2][i0], bsz);
      93  T (&b[2][1] + i0, bsz);
      94  T (&b[2][1] + v0, bsz);
      95  T (&b[2][v0], bsz);
      96  
      97  T (&b[2][1], bsz + 1);
      98  T (&b[2][1] + i1, bsz + 1);
      99  T (&b[2][i0], bsz + 1);
     100  T (&b[2][1] + i0, bsz + 1);
     101  T (&b[2][1] + v0, bsz + 1);
     102  T (&b[2][v0], bsz + 1);
     103  
     104  T (&b[3][1], bsz);                /* { dg-warning "unterminated" } */
     105  T (&b[3][1], bsz - 1);
     106  T (&b[3][1] + 1, bsz);            /* { dg-warning "unterminated" } */
     107  T (&b[3][1] + 1, bsz - 1);        /* { dg-warning "unterminated" } */
     108  T (&b[3][1] + 1, bsz - 2);
     109  T (&b[3][1] + i1, bsz);           /* { dg-warning "unterminated" } */
     110  T (&b[3][1] + i1, bsz - i1);      /* { dg-warning "unterminated" } */
     111  T (&b[3][1] + i1, bsz - i2);
     112  T (&b[3][v0], bsz);
     113  T (&b[3][1] + v0, bsz);           /* { dg-warning "specified bound 5 exceeds the size of at most 4 of unterminated array" } */
     114  T (&b[3][v0] + v1, bsz);          /* { dg-warning "specified bound 5 may exceed the size of at most 4 of unterminated array" "pr?????" { xfail *-*-* } } */
     115  
     116  T (&b[3][1], bsz + 1);            /* { dg-warning "unterminated" } */
     117  T (&b[3][1] + 1, bsz + 1);        /* { dg-warning "unterminated" } */
     118  T (&b[3][1] + i1, bsz + 1);       /* { dg-warning "unterminated" } */
     119  T (&b[3][v0], bsz + 1);           /* { dg-warning "unterminated" "pr86936" { xfail *-*-* } } */
     120  T (&b[3][1] + v0, bsz + 1);       /* { dg-warning "unterminated" } */
     121  T (&b[3][v0] + v1, bsz + 1);      /* { dg-warning "unterminated" "pr86936" { xfail *-*-* } } */
     122  
     123  T (&b[i3][i1], bsz);              /* { dg-warning "unterminated" } */
     124  T (&b[i3][i1] + 1, bsz);          /* { dg-warning "unterminated" } */
     125  T (&b[i3][i1] + i1, bsz);         /* { dg-warning "specified bound 5 exceeds the size 3 of unterminated array" } */
     126  T (&b[i3][v0], bsz);
     127  T (&b[i3][i1] + v0, bsz);         /* { dg-warning "specified bound 5 exceeds the size of at most 4 of unterminated array" } */
     128  T (&b[i3][v0] + v1, bsz);
     129  
     130  T (&b[i3][i1], bsz + 1);          /* { dg-warning "unterminated" } */
     131  T (&b[i3][i1] + 1, bsz + 1);      /* { dg-warning "unterminated" } */
     132  T (&b[i3][i1] + i1, bsz + 1);     /* { dg-warning "unterminated" } */
     133  T (&b[i3][v0], bsz + 1);          /* { dg-warning "unterminated" "pr86919" { xfail *-*-* } } */
     134  T (&b[i3][i1] + v0, bsz + 1);     /* { dg-warning "unterminated" } */
     135  T (&b[i3][v0] + v1, bsz + 1);     /* { dg-warning "unterminated" "pr86919" { xfail *-*-* } } */
     136  
     137  T (v0 ? "" : b[0], bsz);
     138  T (v0 ? "" : b[1], bsz);
     139  T (v0 ? "" : b[2], bsz);
     140  T (v0 ? "" : b[3], bsz);
     141  T (v0 ? b[0] : "", bsz);
     142  T (v0 ? b[1] : "", bsz);
     143  T (v0 ? b[2] : "", bsz);
     144  T (v0 ? b[3] : "", bsz);
     145  
     146  /* Warning for the calls below would be strictly correct even though
     147     the strnlen calls are safe because the reads are bounded by
     148     the length of the constant arguments.  Most of the calls are
     149     not diagnosed anymore as a result of the fix for PR 103215.  */
     150  T (v0 ? "" : b[0], bsz + 1);      /* { dg-warning "bound 6 exceeds source size 5" } */
     151  T (v0 ? "" : b[1], bsz + 1);
     152  T (v0 ? "" : b[2], bsz + 1);
     153  T (v0 ? "" : b[3], bsz + 1);
     154  T (v0 ? b[0] : "", bsz + 1);      /* { dg-warning "bound 6 exceeds source size 5" } */
     155  T (v0 ? b[1] : "", bsz + 1);
     156  T (v0 ? b[2] : "", bsz + 1);
     157  T (v0 ? b[3] : "", bsz + 1);
     158  
     159  T (v0 ? "" : b[i0], bsz);
     160  T (v0 ? "" : b[i1], bsz);
     161  T (v0 ? "" : b[i2], bsz);
     162  T (v0 ? "" : b[i3], bsz);
     163  T (v0 ? b[i0] : "", bsz);
     164  T (v0 ? b[i1] : "", bsz);
     165  T (v0 ? b[i2] : "", bsz);
     166  T (v0 ? b[i3] : "", bsz);
     167  
     168  T (v0 ? "" : b[i0], bsz + 1);
     169  T (v0 ? "" : b[i1], bsz + 1);
     170  T (v0 ? "" : b[i2], bsz + 1);
     171  T (v0 ? "" : b[i3], bsz + 1);
     172  T (v0 ? b[i0] : "", bsz + 1);
     173  T (v0 ? b[i1] : "", bsz + 1);
     174  T (v0 ? b[i2] : "", bsz + 1);
     175  T (v0 ? b[i3] : "", bsz + 1);
     176  
     177  T (v0 ? "1234" : b[3], bsz);
     178  T (v0 ? "1234" : b[i3], bsz);
     179  T (v0 ? b[3] : "1234", bsz);
     180  T (v0 ? b[i3] : "1234", bsz);
     181  
     182  T (v0 ? a : b[3], bsz);
     183  T (v0 ? b[0] : b[2], bsz);
     184  T (v0 ? b[2] : b[3], bsz);
     185  T (v0 ? b[3] : b[2], bsz);
     186  
     187  T (v0 ? "1234" : b[3], bsz + 1);
     188  T (v0 ? "1234" : b[i3], bsz + 1);
     189  T (v0 ? b[3] : "1234", bsz + 1);
     190  T (v0 ? b[i3] : "1234", bsz + 1);
     191  
     192  /* That the following are not diagnosed is a bug/limitation resulting from
     193     the fix for PR 103215.  */
     194  T (v0 ? a : b[3], bsz + 1);       /* { dg-warning "bound 6 exceeds source size 5" "pr103215" { xfail *-*-* } } */
     195  T (v0 ? b[0] : b[2], bsz + 1);    /* { dg-warning "bound 6 exceeds source size 5" "pr103215" { xfail *-*-* } } */
     196  T (v0 ? b[2] : b[3], bsz + 1);    /* { dg-warning "bound 6 exceeds source size 5" "pr103215" { xfail *-*-* } } */
     197  T (v0 ? b[3] : b[2], bsz + 1);    /* { dg-warning "bound 6 exceeds source size 5" "pr103215" { xfail *-*-* } } */
     198  
     199  struct A { char a[5], b[5]; };
     200  
     201  const struct A s = { "1234", "12345" };
     202  
     203  T (s.a, asz);
     204  T (&s.a[0], asz);
     205  T (&s.a[0] + 1, asz);
     206  T (&s.a[0] + v0, asz);
     207  T (&s.a[1], asz);
     208  T (&s.a[1] + 1, asz);
     209  T (&s.a[1] + v0, asz);
     210  
     211  T (&s.a[i0], asz);
     212  T (&s.a[i0] + i1, asz);
     213  T (&s.a[i0] + v0, asz);
     214  T (&s.a[i1], asz);
     215  T (&s.a[i1] + i1, asz);
     216  T (&s.a[i1] + v0, asz);
     217  
     218  T (s.a, asz + 1);
     219  T (&s.a[0], asz + 1);
     220  T (&s.a[0] + 1, asz + 1);
     221  T (&s.a[0] + v0, asz + 1);        /* { dg-warning "specified bound 6 exceeds source size 5 " } */
     222  T (&s.a[1], asz + 1);
     223  T (&s.a[1] + 1, asz + 1);
     224  T (&s.a[1] + v0, asz + 1);        /* { dg-bogus "specified bound 6 exceeds source size 5" "pr95794" { xfail *-*-* } } */
     225  
     226  T (&s.a[i0], asz + 1);
     227  T (&s.a[i0] + i1, asz + 1);
     228  T (&s.a[i0] + v0, asz + 1);
     229  T (&s.a[i1], asz + 1);
     230  T (&s.a[i1] + i1, asz + 1);
     231  T (&s.a[i1] + v0, asz + 1);
     232  
     233  T (s.b, bsz);
     234  T (&s.b[0], bsz);
     235  T (&s.b[0] + 1, bsz);             /* { dg-warning "unterminated" } */
     236  T (&s.b[0] + v0, bsz);            /* { dg-warning "unterminated" } */
     237  T (&s.b[1], bsz);                 /* { dg-warning "unterminated" } */
     238  T (&s.b[1] + 1, bsz);             /* { dg-warning "unterminated" } */
     239  T (&s.b[1] + v0, bsz);            /* { dg-warning "unterminated" } */
     240  
     241  T (&s.b[i0], bsz);
     242  T (&s.b[i0] + i1, bsz);           /* { dg-warning "unterminated" } */
     243  T (&s.b[i0] + v0, bsz);           /* { dg-warning "unterminated" } */
     244  T (&s.b[i1], bsz);                /* { dg-warning "unterminated" } */
     245  T (&s.b[i1] + i1, bsz);           /* { dg-warning "unterminated" } */
     246  T (&s.b[i1] + v0, bsz);           /* { dg-warning "unterminated" } */
     247  
     248  T (s.b, bsz + 1);                 /* { dg-warning "unterminated" } */
     249  T (&s.b[0], bsz + 1);             /* { dg-warning "unterminated" } */
     250  T (&s.b[0] + 1, bsz + 1);         /* { dg-warning "unterminated" } */
     251  T (&s.b[0] + v0, bsz + 1);        /* { dg-warning "unterminated" } */
     252  T (&s.b[1], bsz + 1);             /* { dg-warning "unterminated" } */
     253  T (&s.b[1] + 1, bsz + 1);         /* { dg-warning "unterminated" } */
     254  T (&s.b[1] + v0, bsz + 1);        /* { dg-warning "unterminated" } */
     255  
     256  T (&s.b[i0], bsz + 1);            /* { dg-warning "unterminated" } */
     257  T (&s.b[i0] + i1, bsz + 1);       /* { dg-warning "unterminated" } */
     258  T (&s.b[i0] + v0, bsz + 1);       /* { dg-warning "unterminated" } */
     259  T (&s.b[i1], bsz + 1);            /* { dg-warning "unterminated" } */
     260  T (&s.b[i1] + i1, bsz + 1);       /* { dg-warning "unterminated" } */
     261  T (&s.b[i1] + v0, bsz + 1);       /* { dg-warning "unterminated" } */
     262  
     263  struct B { struct A a[2]; };
     264  
     265  const struct B ba[] = {
     266    { { { "123", "12345" }, { "12345", "123" } } },
     267    { { { "12345", "123" }, { "123", "12345" } } },
     268    { { { "1", "12" },      { "123", "1234" } } },
     269    { { { "123", "1234" },  { "12345", "12" } } }
     270  };
     271  
     272  T (ba[0].a[0].a, asz + 1);
     273  T (&ba[0].a[0].a[0], asz + 1);
     274  T (&ba[0].a[0].a[0] + 1, asz + 1);
     275  T (&ba[0].a[0].a[0] + v0, asz + 1);   /* { dg-bogus "specified bound 6 exceeds source size 5" pr95794" { xfail *-*-* } } */
     276  T (&ba[0].a[0].a[1], asz + 1);
     277  T (&ba[0].a[0].a[1] + 1, asz + 1);
     278  T (&ba[0].a[0].a[1] + v0, asz + 1);   /* { dg-bogus "specified bound 6 exceeds source size 5" pr95794" { xfail *-*-* } } */
     279  
     280  T (ba[0].a[0].b, bsz);
     281  T (&ba[0].a[0].b[0], bsz);
     282  T (&ba[0].a[0].b[0] + 1, bsz);        /* { dg-warning "unterminated" } */
     283  T (&ba[0].a[0].b[0] + 1, bsz - 1);
     284  T (&ba[0].a[0].b[0] + v0, bsz);       /* { dg-warning "unterminated" } */
     285  T (&ba[0].a[0].b[1], bsz);            /* { dg-warning "unterminated" } */
     286  T (&ba[0].a[0].b[1], bsz - 1);
     287  T (&ba[0].a[0].b[1] + 1, bsz - 1);    /* { dg-warning "unterminated" } */
     288  T (&ba[0].a[0].b[1] + 1, bsz - 2);
     289  T (&ba[0].a[0].b[1] + 1, bsz);        /* { dg-warning "unterminated" } */
     290  T (&ba[0].a[0].b[1] + v0, bsz);       /* { dg-warning "unterminated" } */
     291  
     292  T (ba[0].a[0].b, bsz + 1);            /* { dg-warning "unterminated" } */
     293  T (&ba[0].a[0].b[0], bsz + 1);        /* { dg-warning "unterminated" } */
     294  T (&ba[0].a[0].b[0] + 1, bsz + 1);    /* { dg-warning "unterminated" } */
     295  T (&ba[0].a[0].b[0] + v0, bsz + 1);   /* { dg-warning "unterminated" } */
     296  T (&ba[0].a[0].b[1], bsz + 1);        /* { dg-warning "unterminated" } */
     297  T (&ba[0].a[0].b[1] + 1, bsz + 1);    /* { dg-warning "unterminated" } */
     298  T (&ba[0].a[0].b[1] + v0, bsz + 1);   /* { dg-warning "unterminated" } */
     299  
     300  T (ba[0].a[1].a, asz + 1);            /* { dg-warning "unterminated" } */
     301  T (&ba[0].a[1].a[0], asz + 1);        /* { dg-warning "unterminated" } */
     302  T (&ba[0].a[1].a[0] + 1, asz + 1);    /* { dg-warning "unterminated" } */
     303  T (&ba[0].a[1].a[0] + v0, asz + 1);   /* { dg-warning "unterminated" } */
     304  T (&ba[0].a[1].a[1], asz + 1);        /* { dg-warning "unterminated" } */
     305  T (&ba[0].a[1].a[1] + 1, asz + 1);    /* { dg-warning "unterminated" } */
     306  T (&ba[0].a[1].a[1] + v0, asz + 1);   /* { dg-warning "unterminated" } */
     307  
     308  T (ba[0].a[1].b, bsz + 1);
     309  T (&ba[0].a[1].b[0], bsz + 1);
     310  T (&ba[0].a[1].b[0] + 1, bsz + 1);
     311  T (&ba[0].a[1].b[0] + v0, bsz + 1);   /* { dg-bogus "specified bound 6 exceeds source size 5" pr95794" { xfail *-*-* } } */
     312  T (&ba[0].a[1].b[1], bsz + 1);
     313  T (&ba[0].a[1].b[1] + 1, bsz + 1);
     314  T (&ba[0].a[1].b[1] + v0, bsz + 1);   /* { dg-bogus "specified bound 6 exceeds source size 5" pr95794" { xfail *-*-* } } */
     315  
     316  T (ba[1].a[0].a, asz);
     317  T (&ba[1].a[0].a[0], asz);
     318  T (&ba[1].a[0].a[0] + 1, asz);        /* { dg-warning "unterminated" } */
     319  T (&ba[1].a[0].a[0] + v0, asz);       /* { dg-warning "unterminated" } */
     320  T (&ba[1].a[0].a[1], asz);            /* { dg-warning "unterminated" } */
     321  T (&ba[1].a[0].a[1] + 1, asz);        /* { dg-warning "unterminated" } */
     322  T (&ba[1].a[0].a[1] + v0, asz);       /* { dg-warning "unterminated" } */
     323  
     324  T (ba[1].a[0].a, asz + 1);            /* { dg-warning "unterminated" } */
     325  T (&ba[1].a[0].a[0], asz + 1);        /* { dg-warning "unterminated" } */
     326  T (&ba[1].a[0].a[0] + 1, asz + 1);    /* { dg-warning "unterminated" } */
     327  T (&ba[1].a[0].a[0] + v0, asz + 1);   /* { dg-warning "unterminated" } */
     328  T (&ba[1].a[0].a[1], asz + 1);        /* { dg-warning "unterminated" } */
     329  T (&ba[1].a[0].a[1] + 1, asz + 1);    /* { dg-warning "unterminated" } */
     330  T (&ba[1].a[0].a[1] + v0, asz + 1);   /* { dg-warning "unterminated" } */
     331  
     332  T (ba[1].a[0].b, bsz);
     333  T (&ba[1].a[0].b[0], bsz);
     334  T (&ba[1].a[0].b[0] + 1, bsz);
     335  T (&ba[1].a[0].b[0] + v0, bsz);
     336  T (&ba[1].a[0].b[1], bsz);
     337  T (&ba[1].a[0].b[1] + 1, bsz);
     338  T (&ba[1].a[0].b[1] + v0, bsz);
     339  
     340  T (ba[1].a[1].a, asz);
     341  T (&ba[1].a[1].a[0], asz);
     342  T (&ba[1].a[1].a[0] + 1, asz);
     343  T (&ba[1].a[1].a[0] + v0, asz);
     344  T (&ba[1].a[1].a[1], asz);
     345  T (&ba[1].a[1].a[1] + 1, asz);
     346  T (&ba[1].a[1].a[1] + v0, asz);
     347  
     348  T (ba[1].a[1].b, bsz);
     349  T (&ba[1].a[1].b[0], bsz);
     350  T (&ba[1].a[1].b[0] + 1, bsz);        /* { dg-warning "unterminated" } */
     351  T (&ba[1].a[1].b[0] + 1, bsz - 1);
     352  T (&ba[1].a[1].b[0] + v0, bsz);       /* { dg-warning "unterminated" } */
     353  T (&ba[1].a[1].b[1], bsz);            /* { dg-warning "unterminated" } */
     354  T (&ba[1].a[1].b[1], bsz - 1);
     355  T (&ba[1].a[1].b[1] + 1, bsz);        /* { dg-warning "unterminated" } */
     356  T (&ba[1].a[1].b[1] + 1, bsz - 1);    /* { dg-warning "unterminated" } */
     357  T (&ba[1].a[1].b[1] + 1, bsz - 2);
     358  T (&ba[1].a[1].b[1] + 1, bsz - i2);
     359  T (&ba[1].a[1].b[1] + v0, bsz);       /* { dg-warning "unterminated" } */
     360  
     361  /* Prune out warnings with no location (pr?????).
     362     { dg-prune-output "cc1:" } */