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