(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
warn-sprintf-no-nul-3.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  typedef __WCHAR_TYPE__ wchar_t;
       7  
       8  int sprintf (char*, const char*, ...);
       9  
      10  extern char* dest (void);
      11  extern void sink (int, ...);
      12  
      13  #define D dest ()
      14  #define T(expr)   sink (0, (expr))
      15  
      16  const wchar_t wnul = L'\0';
      17  const wchar_t wnonul = L'a';
      18  const wchar_t wcs3[] = L"123";
      19  
      20  const struct
      21  {
      22    wchar_t a, b, s[3];
      23  } w1 = { L'\0', L'b', L"123" },
      24    w2[2] = {
      25    { L'\0', L'c', L"12" },
      26    { L'd', L'\0', L"123" }
      27    };
      28  
      29  void test_sprintf_ls (void)
      30  {
      31    T (sprintf (D, "%ls", &wnul));
      32    T (sprintf (D, "%ls", &wnonul));      /* { dg-warning "nul-terminated" } */
      33    T (sprintf (D, "%.1ls", &wnonul));
      34    T (sprintf (D, "%.2ls", &wnonul));    /* { dg-warning "nul-terminated" } */
      35  
      36    T (sprintf (D, "%ls", &w1.a));
      37    T (sprintf (D, "%ls", &w1.b));        /* { dg-warning "nul-terminated" "pr88211" { xfail *-*-* } } */
      38    T (sprintf (D, "%.1ls", &w1.b));
      39    T (sprintf (D, "%.2ls", &w1.b));      /* { dg-warning "nul-terminated" "pr88211" { xfail *-*-* } } */
      40    T (sprintf (D, "%ls", w1.s));         /* { dg-warning "nul-terminated" } */
      41    T (sprintf (D, "%.3ls", w1.s));
      42    T (sprintf (D, "%.4ls", w1.s));       /* { dg-warning "nul-terminated" } */
      43  
      44    T (sprintf (D, "%.2ls", w1.s + 1));
      45    T (sprintf (D, "%.3ls", w1.s + 1));   /* { dg-warning "nul-terminated" } */
      46  
      47    T (sprintf (D, "%ls", &w2[0].a));
      48    T (sprintf (D, "%ls", &w2[0].b));     /* { dg-warning "nul-terminated" "pr88211" { xfail *-*-* } } */
      49    T (sprintf (D, "%.1ls", &w2[0].b));
      50    T (sprintf (D, "%.2ls", &w2[0].b));   /* { dg-warning "nul-terminated" "pr88211" { xfail *-*-* } } */
      51    T (sprintf (D, "%ls", w2[0].s));
      52    T (sprintf (D, "%.3ls", w2[0].s));
      53    T (sprintf (D, "%.4ls", w2[0].s));
      54  
      55    T (sprintf (D, "%.2ls", w2[0].s + 1));
      56    T (sprintf (D, "%.3ls", w2[0].s + 1));
      57  
      58    T (sprintf (D, "%ls", &w2[1].a));     /* { dg-warning "nul-terminated" "pr88211" { xfail *-*-* } } */
      59    T (sprintf (D, "%.1ls", &w2[1].a));
      60    T (sprintf (D, "%.2ls", &w2[1].a));   /* { dg-warning "nul-terminated" "pr88211" { xfail *-*-* } } */
      61    T (sprintf (D, "%ls", &w2[1].b));
      62    T (sprintf (D, "%ls", w2[1].s));      /* { dg-warning "nul-terminated" } */
      63    T (sprintf (D, "%.3ls", w2[1].s));
      64    T (sprintf (D, "%.4ls", w2[1].s));    /* { dg-warning "nul-terminated" } */
      65  
      66    T (sprintf (D, "%.2ls", w2[1].s + 1));
      67    T (sprintf (D, "%.3ls", w2[1].s + 1));/* { dg-warning "nul-terminated" } */
      68  
      69    T (sprintf (D, "%ls", &wcs3[3]));
      70    T (sprintf (D, "%ls", &wcs3[4]));     /* { dg-warning "\\\[-Warray-bounds" } */
      71  }