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; }
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.