(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
analyzer/
pr99193-2.c
       1  /* Verify absence of false positive from -Wanalyzer-mismatching-deallocation
       2     on realloc(3).
       3     Based on https://github.com/libguestfs/libguestfs/blob/f19fd566f6387ce7e4d82409528c9dde374d25e0/df/main.c#L404
       4     which is GPLv2 or later.  */
       5  
       6  typedef __SIZE_TYPE__ size_t;
       7  typedef __builtin_va_list va_list;
       8  
       9  #define NULL ((void *)0)
      10  
      11  extern void free (void *);
      12  extern void *realloc (void *__ptr, size_t __size)
      13    __attribute__ ((__nothrow__ , __leaf__))
      14    __attribute__ ((__warn_unused_result__))
      15    __attribute__ ((__alloc_size__ (2)));
      16  char *strdup (const char *)
      17    __attribute__((malloc (free)));
      18  
      19  extern void error (int __status, int __errnum, const char *__format, ...)
      20       __attribute__ ((__format__ (__printf__, 3, 4)));
      21  
      22  extern int errno;
      23  
      24  struct drv
      25  {
      26    struct drv *next;
      27  };
      28  
      29  #define EXIT_FAILURE 1
      30  
      31  static char *
      32  single_drive_display_name (struct drv *)
      33  {
      34    char *result = strdup ("placeholder");
      35    if (!result)
      36      __builtin_abort ();
      37    return result;
      38  }
      39  
      40  char *
      41  make_display_name (struct drv *drvs)
      42  {
      43    char *ret;
      44  
      45    if (drvs->next == NULL)
      46      ret = single_drive_display_name (drvs);
      47    else {
      48      size_t pluses = 0;
      49      size_t i, len;
      50  
      51      while (drvs->next != NULL) {
      52        drvs = drvs->next;
      53        pluses++;
      54      }
      55  
      56      ret = single_drive_display_name (drvs);
      57      len = __builtin_strlen (ret);
      58  
      59      ret = realloc (ret, len + pluses + 1); /* { dg-bogus "'free'" } */
      60      if (ret == NULL)
      61        error (EXIT_FAILURE, errno, "realloc");
      62      for (i = len; i < len + pluses; ++i)
      63        ret[i] = '+';
      64      ret[i] = '\0';
      65    }
      66  
      67    return ret;
      68  }