Bug 211916

Summary: segfault from common c++ code with exceptions compiled with gcc
Product: [Fedora] Fedora Reporter: cdewey
Component: gccAssignee: Jakub Jelinek <jakub>
Status: CLOSED CURRENTRELEASE QA Contact:
Severity: high Docs Contact:
Priority: medium    
Version: rawhide   
Target Milestone: ---   
Target Release: ---   
Hardware: i686   
OS: Linux   
Whiteboard:
Fixed In Version: 4.1.1-1 Doc Type: Bug Fix
Doc Text:
Story Points: ---
Clone Of: Environment:
Last Closed: 2006-10-23 22:09:26 UTC Type: ---
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:

Description cdewey 2006-10-23 20:37:28 UTC
The following code, when compiled using gcc and optimization (-O1, at least), produces
a segfault after several iterations of the loop. I have reproduced the bug on
two machines running the same OS (CentOS 4) and version of gcc:

$ gcc -v
Reading specs from /usr/lib/gcc/i386-redhat-linux/3.4.6/specs
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man
--infodir=/usr/share/info --enable-shared --enable-threads=posix
--disable-checking --with-system-zlib --enable-__cxa_atexit
--disable-libunwind-exceptions --enable-java-awt=gtk --host=i386-redhat-linux
Thread model: posix
gcc version 3.4.6 20060404 (Red Hat 3.4.6-3)

The code was compiled as:
$ g++ -O1 -o bug bug.cc

And run as:
$ ./bug
Segmentation fault

#include <stdexcept>

int main() {
        while (true) {
                try {
                        throw std::runtime_error("foo");
                } catch (const std::runtime_error& e) {
                }
        }
        return 0;
}

Comment 1 Jakub Jelinek 2006-10-23 22:09:26 UTC
This is fixed in FC5/FC6 GCC, most probably by the
http://gcc.gnu.org/PR9350
http://gcc.gnu.org/PR24374
The problem is only in the main function realignment on i?86, if you put
the body of main into a separate routine and just call it from main it will
work fine.  Doing something like this in main is certainly not common and
there is an easy workaround.  Another possible workaround is to use g++4
rather than g++.  Closing as fixed in FC5.