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