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 *
single_drive_display_name(struct drv *)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 *
make_display_name(struct drv * drvs)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 }
69