(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
warn-sprintf-no-nul-2.c
       1  /* PR tree-optimization/87756 - missing unterminated argument warning
       2     using address of a constant character
       3     { dg-do compile }
       4     { dg-options "-O2 -Wall -ftrack-macro-expansion=0" } */
       5  
       6  int sprintf (char*, const char*, ...);
       7  
       8  extern char* dest (void);
       9  extern void sink (int, ...);
      10  
      11  #define D dest ()
      12  #define T(expr)   sink (0, (expr))
      13  
      14  
      15  const char cnul = '\0';
      16  const char cnonul = 'a';
      17  const char str3[] = "123";
      18  
      19  const struct
      20  {
      21    char a, b, s[3];
      22  } s1 = { '\0', 'b', "123" },
      23    s2[2] = {
      24    { '\0', 'c', "12" },
      25    { 'd', '\0', "123" }
      26    };
      27  
      28  void test_sprintf_s (void)
      29  {
      30    T (sprintf (D, "%s", &cnul));
      31    T (sprintf (D, "%s", &cnonul));       /* { dg-warning "nul-terminated" } */
      32    T (sprintf (D, "%.1s", &cnonul));
      33    T (sprintf (D, "%.2s", &cnonul));     /* { dg-warning "nul-terminated" } */
      34  
      35    T (sprintf (D, "%s", &s1.a));
      36    T (sprintf (D, "%s", &s1.b));         /* { dg-warning "nul-terminated" } */
      37    T (sprintf (D, "%.1s", &s1.b));
      38    T (sprintf (D, "%.2s", &s1.b));       /* { dg-warning "nul-terminated" } */
      39    T (sprintf (D, "%s", s1.s));          /* { dg-warning "nul-terminated" } */
      40    T (sprintf (D, "%.3s", s1.s));
      41    T (sprintf (D, "%.4s", s1.s));        /* { dg-warning "nul-terminated" } */
      42  
      43    T (sprintf (D, "%.2s", s1.s + 1));
      44    T (sprintf (D, "%.3s", s1.s + 1));    /* { dg-warning "nul-terminated" } */
      45  
      46    T (sprintf (D, "%s", &s2[0].a));
      47    T (sprintf (D, "%s", &s2[0].b));      /* { dg-warning "nul-terminated" } */
      48    T (sprintf (D, "%.1s", &s2[0].b));
      49    T (sprintf (D, "%.2s", &s2[0].b));    /* { dg-warning "nul-terminated" } */
      50    T (sprintf (D, "%s", s2[0].s));
      51    T (sprintf (D, "%.3s", s2[0].s));
      52    T (sprintf (D, "%.4s", s2[0].s));
      53  
      54    T (sprintf (D, "%.2s", s2[0].s + 1));
      55    T (sprintf (D, "%.3s", s2[0].s + 1));
      56  
      57    T (sprintf (D, "%s", &s2[1].a));      /* { dg-warning "nul-terminated" } */
      58    T (sprintf (D, "%.1s", &s2[1].a));
      59    T (sprintf (D, "%.2s", &s2[1].a));    /* { dg-warning "nul-terminated" } */
      60    T (sprintf (D, "%s", &s2[1].b));
      61    T (sprintf (D, "%s", s2[1].s));       /* { dg-warning "nul-terminated" } */
      62    T (sprintf (D, "%.3s", s2[1].s));
      63    T (sprintf (D, "%.4s", s2[1].s));     /* { dg-warning "nul-terminated" } */
      64  
      65    T (sprintf (D, "%.2s", s2[1].s + 1));
      66    T (sprintf (D, "%.3s", s2[1].s + 1)); /* { dg-warning "nul-terminated" } */
      67  
      68    T (sprintf (D, "%s", &str3[3]));
      69    T (sprintf (D, "%s", &str3[4]));      /* { dg-warning "\\\[-Warray-bounds" } */
      70  }