为何GCC无法捕获多target属性函数抛出的异常?
使用GCC的
target属性实现多版本函数时异常无法捕获,是否属于GCC Bug? 我通过target属性为不同CPU架构生成函数的不同实现,当函数抛出异常时,GCC编译后无法捕获该异常,但Clang编译结果符合预期;如果只保留单个函数实现,GCC也能正常捕获异常,这是否属于GCC的Bug?
示例代码
#include <stdexcept> #include <iostream> using namespace std; __attribute__((target("default"))) void f() { throw 1; } __attribute__((target("sse4.2,bmi"))) void f() { throw 2; } int main() { try { f(); } catch(... ) { std::cout << "Caught exception" << std::endl; } }
编译输出
GCC编译输出
terminate called after throwing an instance of 'int'
Clang编译输出
Caught exception
结论
这确实是GCC的已知Bug。
GCC在处理由target属性生成的多版本函数时,异常处理机制存在实现缺陷:调用这类多版本函数时,GCC没有正确生成异常处理所需的栈帧信息和异常表条目,导致抛出的异常无法被上层catch块捕获,最终触发terminate终止程序。
而Clang对target属性多版本函数的实现中,正确维护了异常处理的相关信息,因此异常能被正常捕获;当仅保留单个函数实现时,GCC的异常处理逻辑恢复正常,自然可以捕获异常。
该问题属于GCC在多版本函数与C++异常交互场景下的实现漏洞,相关问题已在GCC的Bugzilla中记录,后续版本有望修复。
内容的提问来源于stack exchange,提问作者sirain
相关产品推荐
相关产品推荐

