使用 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 进行电话身份验证时出错