Testcase: #include <stdio.h> #include <stdarg.h>
static void argy (int foo, ...) { va_list arg; char **sp; va_start(arg, foo); sp = va_arg(arg,char **); /* WHAM. */ *sp = "foo"; } int main (void) { char *foo; /* Comment the next line out for instant crash. */ /* (fprintf) (stderr, "&foo: %p\n", &foo); */ argy(0, &foo); return 0; } It still crashes if the #include of <stdio.h> is removed, so glibc version is immaterial. If the fprintf() call is uncommented, it no longer crashes. Only the 64-bit version crashes. The tree dumps show no significant differences, so this is presumably an RTL-or-later problem. Only the caller differs: GDB output confirms that what is put on the stack is wrong in the crashing case. I have no idea if the problem is middle-end or target, I'm afraid. (I find myself wondering how *scanf() is still working in the presence of this bug. Presumably we're saved by the circumstance that *scanf() use is relatively rare and that its users tend to use the variable again in non-stdargs context in the same function?) Originally spotted in libquvi: <http://code.google.com/p/quvi/issues/detail?id=1>. Preprocessed testcase (of still-crashing version without #include <stdio.h>) follows. -- Summary: varargs of pointer types triggers coredump Product: gcc Version: 4.4.3 Status: UNCONFIRMED Severity: normal Priority: P3 Component: middle-end AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: nix at esperi dot org dot uk GCC build triplet: x86_64-pc-linux-gnu GCC host triplet: x86_64-pc-linux-gnu GCC target triplet: x86_64-pc-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43020