| /* Verify absence of false positive from -Wanalyzer-mismatching-deallocation |
| on realloc(3). |
| Based on https://github.com/libguestfs/libguestfs/blob/f19fd566f6387ce7e4d82409528c9dde374d25e0/df/main.c#L404 |
| which is GPLv2 or later. */ |
| |
| typedef __SIZE_TYPE__ size_t; |
| typedef __builtin_va_list va_list; |
| |
| #define NULL ((void *)0) |
| |
| extern void free (void *); |
| extern void *realloc (void *__ptr, size_t __size) |
| __attribute__ ((__nothrow__ , __leaf__)) |
| __attribute__ ((__warn_unused_result__)) |
| __attribute__ ((__alloc_size__ (2))); |
| char *strdup (const char *) |
| __attribute__((malloc (free))); |
| |
| extern void error (int __status, int __errnum, const char *__format, ...) |
| __attribute__ ((__format__ (__printf__, 3, 4))); |
| |
| extern int errno; |
| |
| struct drv |
| { |
| struct drv *next; |
| }; |
| |
| #define EXIT_FAILURE 1 |
| |
| static char * |
| single_drive_display_name (struct drv *) |
| { |
| char *result = strdup ("placeholder"); |
| if (!result) |
| __builtin_abort (); |
| return result; |
| } |
| |
| char * |
| make_display_name (struct drv *drvs) |
| { |
| char *ret; |
| |
| if (drvs->next == NULL) |
| ret = single_drive_display_name (drvs); |
| else { |
| size_t pluses = 0; |
| size_t i, len; |
| |
| while (drvs->next != NULL) { |
| drvs = drvs->next; |
| pluses++; |
| } |
| |
| ret = single_drive_display_name (drvs); |
| len = __builtin_strlen (ret); |
| |
| ret = realloc (ret, len + pluses + 1); /* { dg-bogus "'free'" } */ |
| if (ret == NULL) |
| error (EXIT_FAILURE, errno, "realloc"); |
| for (i = len; i < len + pluses; ++i) |
| ret[i] = '+'; |
| ret[i] = '\0'; |
| } |
| |
| return ret; |
| } |