Bad gcc -O optimization cause core dump. What to do?
Eygene Ryabinkin
rea-fbsd at codelabs.ru
Tue Mar 13 12:53:46 UTC 2007
Andrey, good day.
> 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.
Yes, it is in the gcc/builtins.c::expand_builtin_printf(). Currently
it only handles "%s" and "%c".
> Any ideas? Is it right or needs to be fixed?
It is definitely not right, since it produces the bad code.
And there are no compilation-time checks that can say for
sure will the argument for the "%s" be NULL:
-----
$ cat 1.c
#include <stdio.h>
int main(void)
{
void *ptr = NULL;
func(ptr);
}
int func(void *ptr)
{
printf("%s\n", ptr);
}
:: rea at codelabs : 15:31:43 : ~/xlam
$ cat 1.s
.file "1.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 func
leave
ret
.size main, .-main
.p2align 2,,3
.globl func
.type func, @function
func:
pushl %ebp
movl %esp, %ebp
subl $20, %esp
pushl 8(%ebp)
call puts
leave
ret
.size func, .-func
-----
The possible way to proceed with this optimization is to have the
'puts', but to enable runtime check for the NULL value.
I see the following definition for the fn_puts in builtins.def:
-----
DEF_EXT_LIB_BUILTIN (BUILT_IN_PUTS_UNLOCKED, "puts_unlocked", BT_FN_INT_CONST_STRING, ATTR_NOTHROW_NONNULL_1)
-----
The ATTR_NOTHROW_NONNULL_1 makes me think that not all is lost and something
can be done with the NULL pointer. I am not very familiar with gcc
internals, but I will try to see if something can be changed.
--
Eygene
More information about the freebsd-current
mailing list