【问题标题】:Error in exception handling with LLVM使用 LLVM 处理异常时出错
【发布时间】:2012-01-29 17:26:07
【问题描述】:

我正在尝试使用 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 机器上编译了上面的代码。 我还尝试将 printf 放在每个 catch 子句上,但没有响应。所以似乎在抛出异常时,没有找到匹配的异常捕获,并导致调用终止函数

【问题讨论】:

  • 在底部阅读此答案的注意stackoverflow.com/a/8883505/733152
  • 您遗漏了最重要的一点 - 哪个操作系统?
  • 我修改了评论。在linux机器上
  • @rahul:与其调用abort,不如打印一条消息更有趣,这样您就可以在一次测试中知道每种情况下采用的路径。请注意,在确定其基数时,我不太确定抛出空指针的行为......它很可能会调用未定义的行为。
  • @MatthieuM。已经尝试在每个 catch 子句中添加注释,但似乎异常不仅仅被捕获,而是直接发送到终止函数,即它没有找到任何匹配的异常捕获。

标签: c++ llvm clang


【解决方案1】:

看到您的其他问题...如果您使用的是 arm/linux - 那么这样的结果是可以预期的。对 EH 的支持还没有结束,所以可能会被任意破坏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多