#define NULL ((void*)0) typedef __SIZE_TYPE__ size_t; extern int errno; extern void free (void *); char *strdup (const char *) __attribute__((malloc (free))); extern size_t strlen (const char *__s) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))); extern void error (int __status, int __errnum, const char *__format, ...) __attribute__ ((__format__ (__printf__, 3, 4))); extern void error_at_line (int __status, int __errnum, const char *__fname, unsigned int __lineno, const char *__format, ...) __attribute__ ((__format__ (__printf__, 5, 6))); /* PR analyzer/99196; extract taken from https://github.com/libguestfs/libguestfs/blob/f19fd566f6387ce7e4d82409528c9dde374d25e0/daemon/tar.c#L108 (which is GPLv2 or later). */ extern char *read_whole_file (const char *error_file, size_t *out); #define EXIT_FAILURE 1 char *read_error_file (const char *error_file) { size_t len; char *str; str = read_whole_file (error_file, &len); if (str == NULL) { str = strdup ("(no error)"); if (str == NULL) error (EXIT_FAILURE, errno, "strdup"); len = strlen (str); /* { dg-bogus "NULL" } */ } /* Remove trailing \n character if any. */ if (len > 0 && str[len-1] == '\n') str[--len] = '\0'; return str; /* caller frees */ }