(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
warn-strlen-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  extern __SIZE_TYPE__ strlen (const char*);
       7  
       8  const char a[5] = "12345";   /* { dg-message "declared here" } */
       9  
      10  int v0 = 0;
      11  int v1 = 1;
      12  volatile int v2;
      13  
      14  void sink (int, ...);
      15  
      16  #define CONCAT(a, b)   a ## b
      17  #define CAT(a, b)      CONCAT(a, b)
      18  
      19  #define T(str)						\
      20    __attribute__ ((noipa))				\
      21    void CAT (test_, __LINE__) (void) {			\
      22      int i0 = 0, i1 = i0 + 1, i2 = i1 + 1, i3 = i2 + 1;	\
      23      sink (strlen (str), i0, i1, i2, i3);		\
      24    } typedef void dummy_type
      25  
      26  T (a);                /* { dg-warning "argument missing terminating nul" }  */
      27  T (&a[0]);            /* { dg-warning "nul" }  */
      28  T (&a[0] + 1);        /* { dg-warning "nul" }  */
      29  T (&a[1]);            /* { dg-warning "nul" }  */
      30  T (&a[v0]);           /* { dg-warning "nul" }  */
      31  T (&a[v0] + 1);       /* { dg-warning "nul" }  */
      32  
      33  
      34  const char b[][5] = { /* { dg-message "declared here" } */
      35    "12", "123", "1234", "54321"
      36  };
      37  
      38  T (b[0]);
      39  T (b[1]);
      40  T (b[2]);
      41  T (b[3]);             /* { dg-warning "nul" }  */
      42  
      43  T (b[i0]);
      44  T (b[i1]);
      45  T (b[i2]);
      46  T (b[i3]);            /* { dg-warning "nul" }  */
      47  
      48  T (b[v0]);
      49  
      50  T (&b[i2][i1]);
      51  T (&b[i2][i1] + i1);
      52  T (&b[i2][v0]);
      53  T (&b[i2][i1] + v0);
      54  
      55  T (&b[2][1]);
      56  T (&b[2][1] + i1);
      57  T (&b[2][i0]);
      58  T (&b[2][1] + i0);
      59  
      60  T (&b[2][1]);
      61  T (&b[2][1] + v0);
      62  T (&b[2][v0]);
      63  
      64  T (&b[3][1]);           /* { dg-warning "nul" }  */
      65  T (&b[3][1] + 1);       /* { dg-warning "nul" }  */
      66  T (&b[3][1] + i1);      /* { dg-warning "nul" }  */
      67  T (&b[3][v0]);          /* { dg-warning "nul" }  */
      68  T (&b[3][1] + v0);      /* { dg-warning "nul" }  */
      69  T (&b[3][v0] + v1);     /* { dg-warning "nul" }  */
      70  
      71  T (&b[i3][i1]);         /* { dg-warning "nul" }  */
      72  T (&b[i3][i1] + 1);     /* { dg-warning "nul" }  */
      73  T (&b[i3][i1] + i1);    /* { dg-warning "nul" }  */
      74  T (&b[i3][v0]);         /* { dg-warning "nul" }  */
      75  T (&b[i3][i1] + v0);    /* { dg-warning "nul" }  */
      76  T (&b[i3][v0] + v1);    /* { dg-warning "nul" }  */
      77  
      78  T (v0 ? "" : b[0]);
      79  T (v0 ? "" : b[1]);
      80  T (v0 ? "" : b[2]);
      81  T (v0 ? "" : b[3]);               /* { dg-warning "nul" }  */
      82  T (v0 ? b[0] : "");
      83  T (v0 ? b[1] : "");
      84  T (v0 ? b[2] : "");
      85  T (v0 ? b[3] : "");               /* { dg-warning "nul" }  */
      86  
      87  T (v0 ? "" : b[i0]);
      88  T (v0 ? "" : b[i1]);
      89  T (v0 ? "" : b[i2]);
      90  /* The following is diagnosed but the warning location is wrong
      91     (the PRE pass loses it).  */
      92  T (v0 ? "" : b[i3]);              /* { dg-warning "nul" }  */
      93  T (v0 ? b[i0] : "");
      94  T (v0 ? b[i1] : "");
      95  T (v0 ? b[i2] : "");
      96  T (v0 ? b[i3] : "");              /* { dg-warning "nul" }  */
      97  
      98  T (v0 ? "1234" : b[3]);           /* { dg-warning "nul" }  */
      99  T (v0 ? "1234" : b[i3]);          /* { dg-warning "nul" }  */
     100  T (v0 ? b[3] : "1234");           /* { dg-warning "nul" }  */
     101  T (v0 ? b[i3] : "1234");          /* { dg-warning "nul" }  */
     102  
     103  T (v0 ? a : b[3]);                /* { dg-warning "nul" }  */
     104  T (v0 ? b[0] : b[2]);
     105  T (v0 ? b[2] : b[3]);             /* { dg-warning "nul" }  */
     106  T (v0 ? b[3] : b[2]);             /* { dg-warning "nul" }  */
     107  
     108  T (v0 ? a : b[i3]);               /* { dg-warning "nul" }  */
     109  T (v0 ? b[i0] : b[i2]);
     110  T (v0 ? b[i2] : b[i3]);           /* { dg-warning "nul" }  */
     111  T (v0 ? b[i3] : b[i2]);           /* { dg-warning "nul" }  */
     112  
     113  T (v0 ? b[0] : &b[3][0] + 1);     /* { dg-warning "nul" }  */
     114  T (v0 ? b[0] : &b[3][0] + i1);    /* { dg-warning "nul" }  */
     115  T (v0 ? b[1] : &b[3][1] + v0);    /* { dg-warning "nul" }  */
     116  
     117  T (v0 ? b[i0] : &b[i3][i0] + i1);    /* { dg-warning "nul" }  */
     118  T (v0 ? b[i0] : &b[i3][i0] + i1);    /* { dg-warning "nul" }  */
     119  T (v0 ? b[i1] : &b[i3][i1] + v0);    /* { dg-warning "nul" }  */
     120  
     121  T (v0 ? &b[3][1] + v0 : b[2]);    /* { dg-warning "nul" }  */
     122  T (v0 ? &b[3][v0] : &b[3][v1]);   /* { dg-warning "nul" }  */
     123  
     124  
     125  struct A { char a[5], b[5]; };
     126  
     127  const struct A s = { "1234", "12345" };
     128  
     129  T (s.a);
     130  T (&s.a[0]);
     131  T (&s.a[0] + 1);
     132  T (&s.a[0] + v0);
     133  T (&s.a[1]);
     134  T (&s.a[1] + 1);
     135  T (&s.a[1] + v0);
     136  
     137  T (&s.a[i0]);
     138  T (&s.a[i0] + i1);
     139  T (&s.a[i0] + v0);
     140  T (&s.a[i1]);
     141  T (&s.a[i1] + i1);
     142  T (&s.a[i1] + v0);
     143  
     144  T (s.b);              /* { dg-warning "nul" }  */
     145  T (&s.b[0]);          /* { dg-warning "nul" }  */
     146  T (&s.b[0] + 1);      /* { dg-warning "nul" }  */
     147  T (&s.b[0] + v0);     /* { dg-warning "nul" }  */
     148  T (&s.b[1]);          /* { dg-warning "nul" }  */
     149  T (&s.b[1] + 1);      /* { dg-warning "nul" }  */
     150  T (&s.b[1] + i0);     /* { dg-warning "nul" }  */
     151  T (&s.b[1] + v0);     /* { dg-warning "nul" }  */
     152  
     153  T (&s.b[i0]);         /* { dg-warning "nul" }  */
     154  T (&s.b[i0] + i1);    /* { dg-warning "nul" }  */
     155  T (&s.b[i0] + v0);    /* { dg-warning "nul" }  */
     156  T (&s.b[i1]);         /* { dg-warning "nul" }  */
     157  T (&s.b[i1] + i1);    /* { dg-warning "nul" }  */
     158  T (&s.b[i1] + v0);    /* { dg-warning "nul" }  */
     159  
     160  struct B { struct A a[2]; };
     161  
     162  const struct B ba[] = {
     163    { { { "123", "12345" }, { "12345", "123" } } },
     164    { { { "12345", "123" }, { "123", "12345" } } },
     165    { { { "1", "12" },      { "123", "1234" } } },
     166    { { { "123", "1234" },  { "12345", "12" } } }
     167  };
     168  
     169  T (ba[0].a[0].a);
     170  T (&ba[0].a[0].a[0]);
     171  T (&ba[0].a[0].a[0] + 1);
     172  T (&ba[0].a[0].a[0] + v0);
     173  T (&ba[0].a[0].a[1]);
     174  T (&ba[0].a[0].a[1] + 1);
     175  T (&ba[0].a[0].a[1] + v0);
     176  
     177  T (ba[0].a[0].b);           /* { dg-warning "nul" }  */
     178  T (&ba[0].a[0].b[0]);       /* { dg-warning "nul" }  */
     179  T (&ba[0].a[0].b[0] + 1);   /* { dg-warning "nul" }  */
     180  T (&ba[0].a[0].b[0] + v0);  /* { dg-warning "nul" }  */
     181  T (&ba[0].a[0].b[1]);       /* { dg-warning "nul" }  */
     182  T (&ba[0].a[0].b[1] + 1);   /* { dg-warning "nul" }  */
     183  T (&ba[0].a[0].b[1] + v0);  /* { dg-warning "nul" }  */
     184  
     185  T (ba[0].a[1].a);           /* { dg-warning "nul" }  */
     186  T (&ba[0].a[1].a[0]);       /* { dg-warning "nul" }  */
     187  T (&ba[0].a[1].a[0] + 1);   /* { dg-warning "nul" }  */
     188  T (&ba[0].a[1].a[0] + v0);  /* { dg-warning "nul" }  */
     189  T (&ba[0].a[1].a[1]);       /* { dg-warning "nul" }  */
     190  T (&ba[0].a[1].a[1] + 1);   /* { dg-warning "nul" }  */
     191  T (&ba[0].a[1].a[1] + v0);  /* { dg-warning "nul" }  */
     192  
     193  T (ba[0].a[1].b);
     194  T (&ba[0].a[1].b[0]);
     195  T (&ba[0].a[1].b[0] + 1);
     196  T (&ba[0].a[1].b[0] + v0);
     197  T (&ba[0].a[1].b[1]);
     198  T (&ba[0].a[1].b[1] + 1);
     199  T (&ba[0].a[1].b[1] + v0);
     200  
     201  
     202  T (ba[1].a[0].a);           /* { dg-warning "nul" }  */
     203  T (&ba[1].a[0].a[0]);       /* { dg-warning "nul" }  */
     204  T (&ba[1].a[0].a[0] + 1);   /* { dg-warning "nul" }  */
     205  T (&ba[1].a[0].a[0] + v0);  /* { dg-warning "nul" }  */
     206  T (&ba[1].a[0].a[1]);       /* { dg-warning "nul" }  */
     207  T (&ba[1].a[0].a[1] + 1);   /* { dg-warning "nul" }  */
     208  T (&ba[1].a[0].a[1] + v0);  /* { dg-warning "nul" }  */
     209  
     210  T (ba[1].a[0].b);
     211  T (&ba[1].a[0].b[0]);
     212  T (&ba[1].a[0].b[0] + 1);
     213  T (&ba[1].a[0].b[0] + v0);
     214  T (&ba[1].a[0].b[1]);
     215  T (&ba[1].a[0].b[1] + 1);
     216  T (&ba[1].a[0].b[1] + v0);
     217  
     218  T (ba[1].a[1].a);
     219  T (&ba[1].a[1].a[0]);
     220  T (&ba[1].a[1].a[0] + 1);
     221  T (&ba[1].a[1].a[0] + v0);
     222  T (&ba[1].a[1].a[1]);
     223  T (&ba[1].a[1].a[1] + 1);
     224  T (&ba[1].a[1].a[1] + v0);
     225  
     226  T (ba[1].a[1].b);           /* { dg-warning "nul" }  */
     227  T (&ba[1].a[1].b[0]);       /* { dg-warning "nul" }  */
     228  T (&ba[1].a[1].b[0] + 1);   /* { dg-warning "nul" }  */
     229  T (&ba[1].a[1].b[0] + v0);  /* { dg-warning "nul" }  */
     230  T (&ba[1].a[1].b[1]);       /* { dg-warning "nul" }  */
     231  T (&ba[1].a[1].b[1] + 1);   /* { dg-warning "nul" }  */
     232  T (&ba[1].a[1].b[1] + v0);  /* { dg-warning "nul" }  */
     233  
     234  
     235  T (ba[2].a[0].a);
     236  T (&ba[2].a[0].a[0]);
     237  T (&ba[2].a[0].a[0] + 1);
     238  T (&ba[2].a[0].a[0] + v0);
     239  T (&ba[2].a[0].a[1]);
     240  T (&ba[2].a[0].a[1] + 1);
     241  T (&ba[2].a[0].a[1] + v0);
     242  
     243  T (ba[2].a[0].b);
     244  T (&ba[2].a[0].b[0]);
     245  T (&ba[2].a[0].b[0] + 1);
     246  T (&ba[2].a[0].b[0] + v0);
     247  T (&ba[2].a[0].b[1]);
     248  T (&ba[2].a[0].b[1] + 1);
     249  T (&ba[2].a[0].b[1] + v0);
     250  
     251  T (ba[2].a[1].a);
     252  T (&ba[2].a[1].a[0]);
     253  T (&ba[2].a[1].a[0] + 1);
     254  T (&ba[2].a[1].a[0] + v0);
     255  T (&ba[2].a[1].a[1]);
     256  T (&ba[2].a[1].a[1] + 1);
     257  T (&ba[2].a[1].a[1] + v0);
     258  
     259  
     260  T (ba[3].a[0].a);
     261  T (&ba[3].a[0].a[0]);
     262  T (&ba[3].a[0].a[0] + 1);
     263  T (&ba[3].a[0].a[0] + v0);
     264  T (&ba[3].a[0].a[1]);
     265  T (&ba[3].a[0].a[1] + 1);
     266  T (&ba[3].a[0].a[1] + v0);
     267  
     268  T (ba[3].a[0].b);
     269  T (&ba[3].a[0].b[0]);
     270  T (&ba[3].a[0].b[0] + 1);
     271  T (&ba[3].a[0].b[0] + v0);
     272  T (&ba[3].a[0].b[1]);
     273  T (&ba[3].a[0].b[1] + 1);
     274  T (&ba[3].a[0].b[1] + v0);
     275  
     276  T (ba[3].a[1].a);           /* { dg-warning "nul" }  */
     277  T (&ba[3].a[1].a[0]);	    /* { dg-warning "nul" }  */
     278  T (&ba[3].a[1].a[0] + 1);   /* { dg-warning "nul" }  */
     279  T (&ba[3].a[1].a[0] + v0);  /* { dg-warning "nul" }  */
     280  T (&ba[3].a[1].a[1]);	    /* { dg-warning "nul" }  */
     281  T (&ba[3].a[1].a[1] + 1);   /* { dg-warning "nul" }  */
     282  T (&ba[3].a[1].a[1] + v0);  /* { dg-warning "nul" }  */
     283  
     284  T (ba[3].a[1].b);
     285  T (&ba[3].a[1].b[0]);
     286  T (&ba[3].a[1].b[0] + 1);
     287  T (&ba[3].a[1].b[0] + v0);
     288  T (&ba[3].a[1].b[1]);
     289  T (&ba[3].a[1].b[1] + 1);
     290  T (&ba[3].a[1].b[1] + v0);
     291  
     292  
     293  T (v0 ? ba[0].a[0].a : ba[0].a[0].b);           /* { dg-warning "nul" }  */
     294  T (v0 ? ba[0].a[0].a : ba[0].a[0].b);           /* { dg-warning "nul" }  */
     295  
     296  T (v0 ? &ba[0].a[0].a[0] : &ba[3].a[1].a[0]);   /* { dg-warning "nul" }  */
     297  T (v0 ? &ba[3].a[1].a[1] :  ba[0].a[0].a);      /* { dg-warning "nul" }  */
     298  
     299  T (v0 ? ba[0].a[0].a : ba[0].a[1].b);
     300  T (v0 ? ba[0].a[1].b : ba[0].a[0].a);
     301  
     302  T (v2 ? b[1] : &b[3][1] + v2);    /* { dg-warning "nul" }  */
     303  T (v2 ? &b[3][1] + v2 : b[2]);    /* { dg-warning "nul" }  */
     304  T (v2 ? &b[3][v2] : &b[2][v2]);   /* { dg-warning "nul" }  */