Bad gcc -O optimization cause core dump. What to do?
mux at FreeBSD.org
Tue Mar 13 14:38:36 UTC 2007
Ricardo Nabinger Sanchez wrote:
> On Tue, 13 Mar 2007 15:11:07 +0300
> Andrey Chernov <ache at freebsd.org> wrote:
> > cc -O -S a.c
> > .file "a.c"
> > .text
> > .p2align 2,,3
> > .globl main
> > .type main, @function
> > main:
> > pushl %ebp
> > movl %esp, %ebp
> > subl $8, %esp
> > andl $-16, %esp
> > subl $28, %esp
> > pushl $0
> > call puts
> > leave
> > ret
> > .size main, .-main
> > .ident "GCC: (GNU) 3.4.6 [FreeBSD] 20060825"
> Confirmed on FreeBSD-6.1 RELEASE:
> .file "bla.c"
> .p2align 2,,3
> .globl main
> .type main, @function
> pushl %ebp
> movl %esp, %ebp
> subl $8, %esp
> andl $-16, %esp
> subl $28, %esp
> pushl $0
> call puts
> .size main, .-main
> .ident "GCC: (GNU) 3.4.4 [FreeBSD] 20050518"
> > It calls "puts(NULL)" with core dump.
> > It means "printf("%s\n", NULL)" is overoptimized.
> > BTW, things like "printf("1%s\n", NULL)" are not overoptimized.
> > Any ideas? Is it right or needs to be fixed?
> Given that this is not what the user asked (replacing printf with puts), I
> consider this a bug. GCC made its assumption, and it was incorrect--it's not
> user's fault.
GCC can do whatever it wants here, even printing "foobar42", because the
C standard says that passing a NULL pointer to a %s format will yield
undefined behaviour. It *is* user's fault to have passed NULL to
printf() in the first place.
So, while we could argue that GCC's behaviour here is useless, annoying,
etc, this just can't be called a bug in GCC. As a side note, these
"optimizations" are in place since a *long* time now.
More information about the freebsd-bugs