LLVM的异常处理出错

Error in exception handling with LLVM

本文关键字:出错 异常处理 LLVM      更新时间:2023-10-16

我正试图用CLANG++作为前端,用LLVM作为后端编译C++代码。版本为3.0。异常处理似乎有问题。每当代码抛出异常时,程序就会终止,并显示消息"抛出异常后终止"。

这是我使用CLANG++尝试的一个示例代码。

struct A {};
struct B : virtual A {};
struct C : virtual A {};
struct D : virtual A {};
struct E : private B, public C, private D {};
extern "C" void abort ();
void fne (E *e)
{
  throw e;
}
void check(E *e)
{
  int caught;
  caught = 0;
  try { fne(e); }
  catch(A *p) { caught = 1; if (p != e) abort();}
  catch(...) { abort(); }
  if (!caught) abort();
  caught = 0;
  try { fne(e); }
  catch(B *p) { abort ();}
  catch(...) { caught = 1; }
  if (!caught) abort();
  caught = 0;
  try { fne(e); }
  catch(C *p) { caught = 1; if (p != e) abort();}
  catch(...) { abort(); }
  if (!caught) abort();
  caught = 0;
  try { fne(e); }
  catch(D *p) { abort ();}
  catch(...) { caught = 1; }
  if (!caught) abort();
  return;
}
int main ()
{
  E e;
  check (&e);
  check ((E *)0);
  return 0;
}

我对LLVM还很陌生,所以对它不太了解。它也有任何与LLVM生成异常处理表有关的内容吗。对于任何代码,上述问题都会继续存在。我已经在Linux机器上编译了上面的代码。我还试着在每个catch子句上加上printf,但没有得到回应。因此,当抛出异常时,似乎没有为异常找到匹配的catch,这导致了对的terminate函数的调用

看到您的另一个问题。。。如果您使用的是arm/linux,那么这样的结果是意料之中的。对EH的支持还没有结束,因此,它可能会被任意破坏。