vasprintf(buffer, "%llu %s", ...) The code is: while (strchr ("hlL", *p)) ++p; /* Should be big enough for any format specifier except %s and floats. */ total_width += 30; switch (*p) { case 'd': case 'i': case 'o': case 'u': case 'x': case 'X': case 'c': (void) va_arg (ap, int); break;
It is ignoring the ll and processing the long long argument as an int. Unfortunately this leaves the va-list pointer in the wrong place (4 bytes out I think). The next argument is %s, so it takes the next thing, treats it as a pointer, and strlen() it, but this is an invalid pointer (it is really the second part of the long long) so it seg faults. The above code needs to count l prefixes and use va_arg(ap, long) or va_arg(ap, long long) as appropriate. (The h is safe as a short will be promoted to int in the variable arg list, just the l prefix needs fixing). -- Summary: vasprintf in libiberty fails for %llu on solaris Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: other AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: mark at easterbrook dot org dot uk http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37080