コピーコンストラクタを無理やり探索→失敗
g++で例外をコピーするのにコピーコンストラクタのアドレスがどうしても必要なので、無理やり探す方法を考えてみました。
struct copy { copy(); copy(const copy&); }; void bar(const copy& e) { throw e; }
みたいなコードがあった場合、
__Z3barRK4copy: pushl %ebp movl %esp, %ebp pushl %ebx subl $20, %esp movl $1, (%esp) call ___cxa_allocate_exception movl %eax, %ebx movl 8(%ebp), %eax movl %eax, 4(%esp) movl %ebx, (%esp) call __ZN4copyC1ERKS_ movl $0, 8(%esp) movl $__ZTI4copy, 4(%esp) movl %ebx, (%esp) call ___cxa_throw
のようなコードになって、コピーコンストラクタは___cxa_allocate_exceptionと___cxa_throwの間で呼び出されます。
元々コンパイラが生成するコードということもあり、このコードは最適化をオンにしても大して変わりません。
なので、この場合は例外の送出元が分かればコピーコンストラクタを見つけることが可能です。
また、
void foo() { throw copy(); }
のようなコードでは、最適化の結果コピーコンストラクタの呼び出しがなくなることがありますが、ほとんどのクラスがデフォルトコンストラクタで初期化したオブジェクト同士が等しくなるので、デフォルトコンストラクタでおおよそ代用可能です。
で、ここまではよかったんですが、肝心の例外の送出元アドレスが分かりません。
さらに、
struct copy { copy(int); copy(const copy&); }; void foo(int n) { throw copy(n); }
みたいなパターンだと、デフォルトコンストラクタすら取得できず、断念。
いい考えだと思ったんですけどねぇ。