Skip site navigation (1)Skip section navigation (2)
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>