Possible bug in register restoration in __throw()

Shinji Suzuki suzuki@wni.co.jp
Mon Oct 13 07:03:00 GMT 1997


There may be a problem in copy_reg() in libgcc2.c.
The following program should crash via abort() when compiled and
run on Linux(RedHat 4.2) i686-pc-linux-gnulibc1 using egcs-971008 .
The implementaiton of copy_reg() in 'libgcc2.c' may be making possibly
wrong assumption that the same register does not get restored more than
once. After removing the condition
  && target_udata->saved[reg] == REG_SAVED_OFFSET
from copy_reg(), the attached program seems to run fine.

-shinji

#include <iostream.h>

class B {
public:
  B() {};
};

class D : public B {
public:
  D() {};
};

static void throwD()
{
  throw D();
}

static void hoge()
{
  volatile int k = 0;
  try {
    throwD();
  } catch( B& e ) {
    cout << "Gotcha! in hoge()" << endl;
    cout << k << endl;
  }
}

int main(int,char**)
{
  volatile int f = 5;
  try {
    hoge();
  } catch( B& e ) {
    cout << "Gotcha!" << endl;
  }
  cout << f << endl;
  
  return 0;
}

// compilation log
[suzuki@micron /tmp]$ g++ -g -v test.cpp
Reading specs from /usr/local/lib/gcc-lib/i686-pc-linux-gnulibc1/egcs-2.90.12/specs
gcc version egcs-2.90.12 971008 (gcc2-970802 experimental)
 /usr/local/lib/gcc-lib/i686-pc-linux-gnulibc1/egcs-2.90.12/cpp -lang-c++ -v -undef -D__GNUC__=2 -D__GNUG__=2 -D__cplusplus -D__GNUC_MINOR__=90 -D__ELF__ -Dunix -Dlinux -D__ELF__ -D__unix__ -D__linux__ -D__unix -D__linux -Asystem(posix) -D__EXCEPTIONS -g -Di386 -Di686 -Asystem(unix) -Acpu(i386) -Amachine(i386) -D__i386__ -D__i686__ -Asystem(unix) -Acpu(i386) -Amachine(i386) test.cpp /tmp/cca11142.ii
GNU CPP version egcs-2.90.12 971008 (gcc2-970802 experimental) (i386 Linux/ELF)
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include/g++
 /usr/local/include
 /usr/local/i686-pc-linux-gnulibc1/include
 /usr/local/lib/gcc-lib/i686-pc-linux-gnulibc1/egcs-2.90.12/include
 /usr/include
End of search list.
 /usr/local/lib/gcc-lib/i686-pc-linux-gnulibc1/egcs-2.90.12/cc1plus /tmp/cca11142.ii -quiet -dumpbase test.cc -g -version -o /tmp/cca11142.s
GNU C++ version egcs-2.90.12 971008 (gcc2-970802 experimental) (i686-pc-linux-gnulibc1) compiled by GNU C version egcs-2.90.12 971008 (gcc2-970802 experimental).
 as -V -Qy -o /tmp/cca111421.o /tmp/cca11142.s
GNU assembler version 2.7 (i586-unknown-linux), using BFD version 2.7.0.2
 /usr/local/lib/gcc-lib/i686-pc-linux-gnulibc1/egcs-2.90.12/ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.1 /usr/lib/crt1.o /usr/lib/crti.o /usr/local/lib/gcc-lib/i686-pc-linux-gnulibc1/egcs-2.90.12/crtbegin.o -L/usr/local/lib/gcc-lib/i686-pc-linux-gnulibc1/egcs-2.90.12 -L/usr/local/i686-pc-linux-gnulibc1/lib -L/usr/local/lib /tmp/cca111421.o -lstdc++ -lm -lgcc -lc -lgcc /usr/local/lib/gcc-lib/i686-pc-linux-gnulibc1/egcs-2.90.12/crtend.o /usr/lib/crtn.o




More information about the Gcc-bugs mailing list