Date: Tue, 13 Mar 2007 15:37:18 +0300 From: Eygene Ryabinkin <rea-fbsd@codelabs.ru> To: Andrey Chernov <ache@freebsd.org>, current@freebsd.org Subject: Re: Bad gcc -O optimization cause core dump. What to do? Message-ID: <20070313123717.GU58523@codelabs.ru> In-Reply-To: <20070313121106.GA96293@nagual.pp.ru> References: <20070313121106.GA96293@nagual.pp.ru>
next in thread | previous in thread | raw e-mail | index | archive | help
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@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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20070313123717.GU58523>
