(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
tree-ssa/
builtin-sprintf-warn-8.c
       1  /* PR middle-end/78519 - missing warning for sprintf %s with null pointer
       2     Also exercises null destination pointer and null format string.
       3     { dg-do compile }
       4     { dg-options "-O2 -Wformat -Wformat-overflow -Wno-nonnull -ftrack-macro-expansion=0" } */
       5  
       6  typedef __builtin_va_list va_list;
       7  
       8  #define sprintf   __builtin_sprintf
       9  #define snprintf  __builtin_snprintf
      10  #define vsprintf  __builtin_vsprintf
      11  #define vsnprintf __builtin_vsnprintf
      12  
      13  
      14  static char* null (void)
      15  {
      16    return 0;
      17  }
      18  
      19  
      20  void sink (int);
      21  #define T sink
      22  
      23  
      24  /* Verify that calls with a null destination pointer are diagnosed.  */
      25  
      26  void test_null_dest (va_list va)
      27  {
      28    char *p = null ();
      29    T (sprintf (null (), "%i", 0));   /* { dg-warning "null destination pointer" } */
      30    T (sprintf (p, "%i", 0));         /* { dg-warning "null destination pointer" } */
      31    T (sprintf (p, "%i abc", 0));     /* { dg-warning "null destination pointer" } */
      32  
      33    T (snprintf (null (), 1, "%i", 0));   /* { dg-warning "null destination pointer" } */
      34    T (snprintf (p, 2, "%i", 0));         /* { dg-warning "null destination pointer" } */
      35    T (snprintf (p, 3, "%i abc", 0));     /* { dg-warning "null destination pointer" } */
      36  
      37    /* Snprintf with a null pointer and a zero size is a special request
      38       to determine the size of output without writing any.  Such calls
      39       are valid must not be diagnosed.  */
      40    T (snprintf (p, 0, "%i", 0));
      41  
      42    T (vsprintf (null (), "%i", va)); /* { dg-warning "null destination pointer" } */
      43    T (vsprintf (p,       "%i", va)); /* { dg-warning "null destination pointer" } */
      44  
      45    T (vsnprintf (null (), 1, "%i", va)); /* { dg-warning "null destination pointer" } */
      46    T (vsnprintf (p,       2, "%i", va));       /* { dg-warning "null destination pointer" } */
      47    T (vsnprintf (p,       0, "%i", va));
      48  }
      49  
      50  void test_null_format (char *d, va_list va)
      51  {
      52    char *fmt = null ();
      53  
      54    T (sprintf (d, null ()));    /* { dg-warning "null format string" } */
      55    T (sprintf (d, fmt));        /* { dg-warning "null format string" } */
      56  
      57    T (snprintf (d, 0, null ()));    /* { dg-warning "null format string" } */
      58    T (snprintf (d, 1, fmt));        /* { dg-warning "null format string" } */
      59  
      60    T (vsprintf (d, null (), va));   /* { dg-warning "null format string" } */
      61    T (vsprintf (d, fmt, va));       /* { dg-warning "null format string" } */
      62  
      63    T (vsnprintf (d, 0, null (), va));  /* { dg-warning "null format string" } */
      64    T (vsnprintf (d, 1, fmt, va));      /* { dg-warning "null format string" } */
      65  }
      66  
      67  void test_null_arg (char *d, const char *s)
      68  {
      69    char *p = null ();
      70  
      71    T (sprintf (d, "%-s", null ()));  /* { dg-warning "directive argument is null" } */
      72    T (sprintf (d, "%-s", p));        /* { dg-warning "directive argument is null" } */
      73    T (sprintf (d, "%s %s", p, s));   /* { dg-warning "directive argument is null" } */
      74    T (sprintf (d, "%s %s", s, p));   /* { dg-warning "directive argument is null" } */
      75    T (sprintf (d, "%s %i", p, 1));   /* { dg-warning "directive argument is null" } */
      76    T (sprintf (d, "%i %s", 1, p));   /* { dg-warning "directive argument is null" } */
      77    T (sprintf (d, "%.0s", p));       /* { dg-warning "directive argument is null" } */
      78    T (sprintf (d, "%1.0s", p));      /* { dg-warning "directive argument is null" } */
      79  
      80    T (snprintf (d, 0, "%-s", null ()));  /* { dg-warning "directive argument is null" } */
      81    T (snprintf (d, 1, "%-s", p));        /* { dg-warning "directive argument is null" } */
      82  
      83    T (sprintf (d, "%i %s", 1, null ()));  /* { dg-warning "directive argument is null" } */
      84    T (sprintf (d, "%i %s", 2, p));        /* { dg-warning "directive argument is null" } */
      85  
      86    T (snprintf (d, 0, "%i %s", 1, null ()));  /* { dg-warning "directive argument is null" } */
      87    T (snprintf (d, 9, "%i %s", 2, p));        /* { dg-warning "directive argument is null" } */
      88  
      89    /* A sanity check that the %p directive doesn't emit a warning
      90       with a null pointer.  */
      91    T (sprintf (d, "%p", null ()));
      92    T (sprintf (d, "%p", p));
      93  }