https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115404
--- Comment #2 from Sergei Trofimovich <slyfox at gcc dot gnu.org> --- Thank you for the hints! I did not yet fully extracted self-contained example but got a bit closer to it. Comparing glibc binary before and after r15-1113-gde05e44b2ad963 the only function that changes is __vsprintf_internal. Smaller reproducer (against glibc-2.39 built with affected compiler): // $ cat over.c #include <printf.h> #include <stdio.h> static int printf_e(FILE *fp, const struct printf_info *info, const void *const *args) { return -2; } static int size_type(const struct printf_info *info, size_t n, int *argtype, int *size) { return -1; } int main(void) { char buf[255]; register_printf_specifier('e', printf_e, size_type); sprintf(buf, "%e", -12.5); return 0; } $ gcc over.c -o over -O2 -D_FORTIFY_SOURCE=3 && ./over Fatal glibc error: printf_buffer_as_file.c:31 (__printf_buffer_as_file_commit): assertion failed: file->stream._IO_write_ptr <= file->next->write_end Aborted (core dumped)