M2 Mac上GCC中std::optional相关运行时异常问题求助
GCC 13.2.0在Apple Silicon macOS上std::optional与异常处理的兼容性问题
结论
这是GCC 13.x系列在Apple Silicon(M系列)macOS上的已知兼容性bug,你遇到的两种现象完全同源,根源在于libunwind实现缺失关键API导致的异常处理崩溃。
问题分析
- macOS平台的GCC依赖libunwind库处理异常栈展开,但Apple Silicon版本的libunwind并未完整实现所有
_Unwind_*系列API,其中_Unwind_GetTextRelBase函数处于缺失状态。 - 当代码同时包含
try-catch异常捕获逻辑和std::optional实例化时,GCC生成的异常处理代码会触发对该缺失函数的调用,直接引发程序崩溃:- 初始问题中,
std::stoi抛出的异常未被捕获,本质是异常处理机制提前崩溃,导致catch块根本无法执行。 - 简化测试中的
libunwind报错,直接暴露了缺失函数的问题。
- 初始问题中,
验证依据
- Linux环境下GCC 13.2.0正常运行,因为Linux的libunwind完整实现了所有Unwind接口。
- 单独移除简化测试中的
std::optional声明,或单独移除try-catch块,程序均能正常结束,证明两者结合才是触发崩溃的条件。
临时解决方案
- 降级GCC版本:使用GCC 12.x系列,该版本在Apple Silicon macOS上的异常处理逻辑未依赖缺失的
_Unwind_GetTextRelBase函数,可避免此问题。 - 替换为Clang编译:Clang在macOS上使用系统原生的异常处理机制,不存在libunwind的兼容性问题,编译命令改为
clang++ -std=c++23 xxx.cpp即可。 - 禁用异常编译:如果代码允许,添加编译选项
-fno-exceptions,跳过异常处理代码生成,避免触发缺失函数调用,但会导致原有try-catch逻辑失效。
后续处理
该bug已在GCC官方bug追踪系统中被记录,后续版本大概率会修复此兼容性问题,可关注GCC官方更新,升级到修复后的版本即可彻底解决。
内容的提问来源于stack exchange,提问作者arobinson
相关产品推荐
相关产品推荐

