(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
builtins-nonnull.c
       1  /* PR c/17308 - nonnull attribute not as useful as it could be
       2     PR c/78673 - sprintf missing attribute nonnull on destination argument
       3     { dg-do "compile" }
       4     { dg-additional-options "-O2 -Wnonnull -ftrack-macro-expansion=0 -std=c99" } */
       5  
       6  #define va_list __builtin_va_list
       7  
       8  typedef struct FILE FILE;
       9  
      10  static char* null (void)
      11  {
      12    return 0;
      13  }
      14  
      15  void sink (int, ...);
      16  #define T(arg) sink (0, arg)
      17  
      18  
      19  #define bzero    __builtin_bzero
      20  #define memcpy   __builtin_memcpy
      21  #define memmove  __builtin_memmove
      22  #define mempcpy  __builtin_mempcpy
      23  #define memset   __builtin_memset
      24  
      25  void test_memfuncs (void *s, unsigned n)
      26  {
      27    /* Bzero is not declared attribute nonnull (maybe it should be?)
      28       but it's transformed into a call to memset() which is.  */
      29    bzero (null (), n);             /* { dg-warning "argument 1 null where non-null expected" } */
      30  
      31    T (memcpy (null (), s, n));     /* { dg-warning "argument 1 null where non-null expected" } */
      32    T (memcpy (s, null (), n));     /* { dg-warning "argument 2 null where non-null expected" } */
      33  
      34    T (memmove (null (), s, n));    /* { dg-warning "argument 1 null where non-null expected" } */
      35    T (memmove (s, null (), n));    /* { dg-warning "argument 2 null where non-null expected" } */
      36  
      37    T (mempcpy (null (), s, n));    /* { dg-warning "argument 1 null where non-null expected" } */
      38    T (mempcpy (s, null (), n));    /* { dg-warning "argument 2 null where non-null expected" } */
      39  
      40    T (memset (null (), 0, n));     /* { dg-warning "argument 1 null where non-null expected" } */
      41  }
      42  
      43  #undef memcpy
      44  #undef memmove
      45  #undef mempcpy
      46  #undef memset
      47  #define memcpy(d, s, n)   __builtin___memcpy_chk (d, s, n, n)
      48  #define memmove(d, s, n)  __builtin___memmove_chk (d, s, n, n)
      49  #define mempcpy(d, s, n)  __builtin___mempcpy_chk (d, s, n, n)
      50  #define memset(d, x, n)   __builtin___memset_chk (d, x, n, n)
      51  
      52  void test_memfuncs_chk (void *s, unsigned n)
      53  {
      54    T (memcpy (null (), s, n));     /* { dg-warning "argument 1 null where non-null expected" } */
      55    T (memcpy (s, null (), n));     /* { dg-warning "argument 2 null where non-null expected" } */
      56  
      57    T (memmove (null (), s, n));    /* { dg-warning "argument 1 null where non-null expected" } */
      58    T (memmove (s, null (), n));    /* { dg-warning "argument 2 null where non-null expected" } */
      59  
      60    T (mempcpy (null (), s, n));    /* { dg-warning "argument 1 null where non-null expected" } */
      61    T (mempcpy (s, null (), n));    /* { dg-warning "argument 2 null where non-null expected" } */
      62  
      63    T (memset (null (), 0, n));     /* { dg-warning "argument 1 null where non-null expected" } */
      64  }
      65  
      66  
      67  #define strcat   __builtin_strcat
      68  #define strchr   __builtin_strchr
      69  #define stpcpy   __builtin_stpcpy
      70  #define stpncpy  __builtin_stpncpy
      71  #define strcpy   __builtin_strcpy
      72  #define strncpy  __builtin_strncpy
      73  #define strlen   __builtin_strlen
      74  #define strncat  __builtin_strncat
      75  #define strstr   __builtin_strstr
      76  
      77  void test_strfuncs (char *s, unsigned n)
      78  {
      79    T (strcat (null (), s));        /* { dg-warning "argument 1 null where non-null expected" } */
      80    T (strcat (s, null ()));        /* { dg-warning "argument 2 null where non-null expected" } */
      81  
      82    T (strchr (null (), 'x'));      /* { dg-warning "argument 1 null where non-null expected" } */
      83  
      84    T (stpcpy (null (), s));        /* { dg-warning "argument 1 null where non-null expected" } */
      85    T (stpcpy (s, null ()));        /* { dg-warning "argument 2 null where non-null expected" } */
      86  
      87    T (stpncpy (null (), s, n));    /* { dg-warning "argument 1 null where non-null expected" } */
      88    T (stpncpy (s, null (), n));    /* { dg-warning "argument 2 null where non-null expected" } */
      89  
      90    T (strcpy (null (), s));        /* { dg-warning "argument 1 null where non-null expected" } */
      91    T (strcpy (s, null ()));        /* { dg-warning "argument 2 null where non-null expected" } */
      92  
      93    T (strncpy (null (), s, n));    /* { dg-warning "argument 1 null where non-null expected" } */
      94    T (strncpy (s, null (), n));    /* { dg-warning "argument 2 null where non-null expected" } */
      95  
      96    T (strlen (null ()));           /* { dg-warning "argument 1 null where non-null expected" } */
      97  
      98    T (strncat (s, null (), n));    /* { dg-warning "argument 2 null where non-null expected" } */
      99    T (strncat (null (), s, n));    /* { dg-warning "argument 1 null where non-null expected" } */
     100  
     101    T (strstr (null (), s));        /* { dg-warning "argument 1 null where non-null expected" } */
     102    T (strstr (s, null ()));        /* { dg-warning "argument 2 null where non-null expected" } */
     103  }
     104  
     105  
     106  #undef strcat
     107  #undef stpcpy
     108  #undef stpncpy
     109  #undef strcpy
     110  #undef strncpy
     111  #undef strncat
     112  
     113  #define strcat(d, s)      __builtin___strcat_chk (d, s, n)
     114  #define stpcpy(d, s)      __builtin___stpcpy_chk (d, s, n)
     115  #define stpncpy(d, s, n)  __builtin___stpncpy_chk (d, s, n, n)
     116  #define strcpy(d, s)      __builtin___strcpy_chk (d, s, n)
     117  #define strncpy(d, s, n)  __builtin___strncpy_chk (d, s, n, n)
     118  #define strncat(d, s, n)  __builtin___strncat_chk (d, s, n, n)
     119  
     120  void test_strfuncs_chk (char *s, unsigned n)
     121  {
     122    T (strcat (null (), s));        /* { dg-warning "argument 1 null where non-null expected" } */
     123    T (strcat (s, null ()));        /* { dg-warning "argument 2 null where non-null expected" } */
     124  
     125    T (strchr (null (), 'x'));      /* { dg-warning "argument 1 null where non-null expected" } */
     126  
     127    T (stpcpy (null (), s));        /* { dg-warning "argument 1 null where non-null expected" } */
     128    T (stpcpy (s, null ()));        /* { dg-warning "argument 2 null where non-null expected" } */
     129  
     130    T (stpncpy (null (), s, n));    /* { dg-warning "argument 1 null where non-null expected" } */
     131    T (stpncpy (s, null (), n));    /* { dg-warning "argument 2 null where non-null expected" } */
     132  
     133    T (strcpy (null (), s));        /* { dg-warning "argument 1 null where non-null expected" } */
     134    T (strcpy (s, null ()));        /* { dg-warning "argument 2 null where non-null expected" } */
     135  
     136    T (strncpy (null (), s, n));    /* { dg-warning "argument 1 null where non-null expected" } */
     137    T (strncpy (s, null (), n));    /* { dg-warning "argument 2 null where non-null expected" } */
     138  
     139    T (strncat (s, null (), n));    /* { dg-warning "argument 2 null where non-null expected" } */
     140    T (strncat (null (), s, n));    /* { dg-warning "argument 1 null where non-null expected" } */
     141  }
     142  
     143  
     144  #define fprintf             __builtin_fprintf
     145  #define fprintf_unlocked    __builtin_fprintf_unlocked
     146  #define vfprintf            __builtin_vfprintf
     147  #define printf              __builtin_printf
     148  #define printf_unlocked     __builtin_printf_unlocked
     149  #define vprintf             __builtin_vprintf
     150  #define sprintf             __builtin_sprintf
     151  #define snprintf            __builtin_snprintf
     152  #define vsprintf            __builtin_vsprintf
     153  #define vsnprintf           __builtin_vsnprintf
     154  
     155  void test_stdio_funcs (FILE *f, char *d, unsigned n, va_list va)
     156  {
     157    T (fprintf (null (), "%i", 0)); /* { dg-warning "argument 1 null where non-null expected" } */
     158    T (fprintf (f, null ()));       /* { dg-warning "argument 2 null where non-null expected" } */
     159  
     160    T (fprintf_unlocked (null (), "%i", 0)); /* { dg-warning "argument 1 null where non-null expected" } */
     161    T (fprintf_unlocked (f, null ()));       /* { dg-warning "argument 2 null where non-null expected" } */
     162  
     163    T (vfprintf (null (), "%i", va));/* { dg-warning "argument 1 null where non-null expected" } */
     164    T (vfprintf (f, null (), va));   /* { dg-warning "argument 2 null where non-null expected" } */
     165  
     166    T (vprintf (null (), va));      /* { dg-warning "argument 1 null where non-null expected" } */
     167  
     168    T (printf (null ()));           /* { dg-warning "argument 1 null where non-null expected" } */
     169    T (printf_unlocked (null ()));  /* { dg-warning "argument 1 null where non-null expected" } */
     170  
     171    T (vprintf (null (), va));      /* { dg-warning "argument 1 null where non-null expected" } */
     172  
     173    T (sprintf (null (), "%i", 0)); /* { dg-warning "argument 1 null where non-null expected" } */
     174    T (sprintf (d, null ()));       /* { dg-warning "argument 2 null where non-null expected" } */
     175  
     176    T (snprintf (null (), n, "%i", 0));
     177    T (snprintf (d, n, null ()));   /* { dg-warning "argument 3 null where non-null expected" } */
     178  
     179    T (vsprintf (null (), "%i", va)); /* { dg-warning "argument 1 null where non-null expected" } */
     180    T (vsprintf (d, null (), va));   /* { dg-warning "argument 2 null where non-null expected" } */
     181  
     182    T (vsnprintf (null (), n, "%i", va));
     183    T (vsnprintf (d, n, null (), va));  /* { dg-warning "argument 3 null where non-null expected" } */
     184  }
     185  
     186  #undef fprintf
     187  #undef fprintf_unlocked
     188  #undef vfprintf
     189  #undef printf
     190  #undef printf_unlocked
     191  #undef vprintf
     192  #undef sprintf
     193  #undef snprintf
     194  #undef vsprintf
     195  #undef vsnprintf
     196  
     197  #define fprintf(f, fmt, ...)				\
     198    __builtin___fprintf_chk (f, 0, fmt, __VA_ARGS__)
     199  #define vfprintf(f, fmt, va)			\
     200    __builtin___vfprintf_chk (f, 0, fmt, va)
     201  #define printf(fmt, ...)			\
     202    __builtin___printf_chk (0, fmt, __VA_ARGS__)
     203  #define vprintf(fmt, va)			\
     204    __builtin___vprintf_chk (0, fmt, va)
     205  #define sprintf(d, fmt, ... )				\
     206    __builtin___sprintf_chk (d, 0, n, fmt, __VA_ARGS__)
     207  #define snprintf(d, n, fmt, ...)			\
     208    __builtin___snprintf_chk (d, n, 0, n,  fmt, __VA_ARGS__)
     209  #define vsprintf(d, fmt, va)			\
     210    __builtin___vsprintf_chk (d, 0, n, fmt, va)
     211  #define vsnprintf(d, n, fmt, va)			\
     212    __builtin___vsnprintf_chk (d, n, 0, n, fmt, va)
     213  
     214  void test_stdio_funcs_chk (FILE *f, char *d, const char *fmt,
     215  			   unsigned n, va_list va)
     216  {
     217    T (fprintf (null (), "%i", 0)); /* { dg-warning "argument 1 null where non-null expected" } */
     218    T (fprintf (f, null (), 0));    /* { dg-warning "argument 3 null where non-null expected" } */
     219  
     220    T (vfprintf (null (), "%i", va));/* { dg-warning "argument 1 null where non-null expected" } */
     221    T (vfprintf (f, null (), va));   /* { dg-warning "argument 3 null where non-null expected" } */
     222  
     223    T (vprintf (null (), va));      /* { dg-warning "argument 2 null where non-null expected" } */
     224  
     225    T (printf (null (), 0));        /* { dg-warning "argument 2 null where non-null expected" } */
     226  
     227    T (vprintf (null (), va));      /* { dg-warning "argument 2 null where non-null expected" } */
     228  
     229    T (sprintf (null (), "%i", 0)); /* { dg-warning "argument 1 null where non-null expected" } */
     230    T (sprintf (d, null (), 0));    /* { dg-warning "argument 4 null where non-null expected" } */
     231  
     232    T (snprintf (null (), n, "%i", 0));
     233    T (snprintf (d, n, null (), 0));  /* { dg-warning "argument 5 null where non-null expected" } */
     234  
     235    T (vsprintf (null (), "%i", va)); /* { dg-warning "argument 1 null where non-null expected" } */
     236    T (vsprintf (d, null (), va));   /* { dg-warning "argument 4 null where non-null expected" } */
     237  
     238    T (vsnprintf (null (), n, "%i", va));
     239    T (vsnprintf (d, n, null (), va));  /* { dg-warning "argument 5 null where non-null expected" } */
     240  }