bug-bash
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: miscompilation at gcc -O2


From: Jon Seymour
Subject: Re: miscompilation at gcc -O2
Date: Thu, 10 Feb 2011 09:49:28 +1100

Good catch - how long did that take to find?

jon.

On Thu, Feb 10, 2011 at 6:06 AM, Eric Blake <address@hidden> wrote:
> Configuration Information [Automatically generated, do not change]:
> Machine: x86_64
> OS: linux-gnu
> Compiler: gcc
> Compilation CFLAGS:  -DPROGRAM='bash' -DCONF_HOSTTYPE='x86_64'
> -DCONF_OSTYPE='linux-gnu' -DCONF_MACHTYPE='x86_64-redhat-linux-gnu'
> -DCONF_VENDOR='redhat' -DLOCALEDIR='/usr/share/locale' -DPACKAGE='bash'
> -DSHELL -DHAVE_CONFIG_H   -I.  -I. -I./include -I./lib  -D_GNU_SOURCE
> -DRECYCLES_PIDS  -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions
> -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic
> uname output: Linux office 2.6.35.10-74.fc14.x86_64 #1 SMP Thu Dec 23
> 16:04:50 UTC 2010 x86_64 x86_64 x86_64 GNU/Linux
> Machine Type: x86_64-redhat-linux-gnu
>
>
> Bash Version: 4.1
> Patch Level: 7
> Release Status: release
>
> Description:
> There is a report of bash being miscompiled for cygwin when using gcc
> 4.3.4 -O2, but succeeding when compiled with -O1:
> http://cygwin.com/ml/cygwin/2011-02/msg00230.html
>
> Compiling with -Wextra reveals the culprit:
> execute_cmd.c: In function ‘execute_function.clone.2’:
> execute_cmd.c:4007:23: warning: variable ‘bash_source_a’ might be
> clobbered by ‘longjmp’ or ‘vfork’
> execute_cmd.c:4007:39: warning: variable ‘bash_lineno_a’ might be
> clobbered by ‘longjmp’ or ‘vfork’
> execute_cmd.c: In function ‘execute_in_subshell’:
> execute_cmd.c:1296:12: warning: variable ‘tcom’ might be clobbered by
> ‘longjmp’ or ‘vfork’
>
> POSIX is clear that the value of an automatic variable changed between
> setjmp() and the subsequent longjmp() is unspecified unless the variable
> is marked volatile, but bash is violating this constraint and modifying
> several variables that cannot reliably be restored.  Depending on what
> code transformations the compiler makes, this can lead to crashes; in
> cygwin's case, it appears that mere execution of a trap return handler
> can cause bash to corrupt its own stack.
>
> Repeat-By:
> make
> rm execute_cmd.o
> make CFLAGS='-Wextra -O2'
>
> Fix:
> --- execute_cmd.c.orig  2011-02-09 11:53:13.470850670 -0700
> +++ execute_cmd.c       2011-02-09 11:53:48.422939088 -0700
> @@ -1293,7 +1293,7 @@
>   int user_subshell, return_code, function_value, should_redir_stdin,
> invert;
>   int ois, user_coproc;
>   int result;
> -  COMMAND *tcom;
> +  COMMAND *volatile tcom;
>
>   USE_VAR(user_subshell);
>   USE_VAR(user_coproc);
> @@ -4004,7 +4004,7 @@
>   char *debug_trap, *error_trap, *return_trap;
>  #if defined (ARRAY_VARS)
>   SHELL_VAR *funcname_v, *nfv, *bash_source_v, *bash_lineno_v;
> -  ARRAY *funcname_a, *bash_source_a, *bash_lineno_a;
> +  ARRAY *funcname_a, *volatile bash_source_a, *volatile bash_lineno_a;
>  #endif
>   FUNCTION_DEF *shell_fn;
>   char *sfile, *t;
>
>
> --
> Eric Blake   address@hidden    +1-801-349-2682
> Libvirt virtualization library http://libvirt.org
>
>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]