You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 06:54:23