使用 LLVM 处理异常时出错

Posted

技术标签:

【中文标题】使用 LLVM 处理异常时出错【英文标题】:Error in exception handling with 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 子句上,但没有响应。所以似乎在抛出异常时,没有找到匹配的异常捕获,并导致调用终止函数

【问题讨论】:

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

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

【讨论】:

以上是关于使用 LLVM 处理异常时出错的主要内容,如果未能解决你的问题,请参考以下文章

运行应用程序 llvm-g++-4.2 时出错,退出代码为 1

未处理的异常:[firebase_auth/unknown] null:使用颤振/firebase 进行电话身份验证时出错

处理Scala Async和Future变量的异常,在try块外访问变量名时出错

Python中异常处理

异常处理

异常处理