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

如何彻底禁用C++异常?MCU固件项目代码膨胀问题求解

微控制器C++固件代码体积暴增问题与编译检查需求

我在开发微控制器底层C++固件项目时,原本代码体积维持在约4KB,直到引入以下代码后,程序体积直接暴增至90KB:

uint8_t index = __builtin_ctz(exti_set_mask);
auto &gpio_irq_info = irq_callback_table[index];

问题根源在于:irq_callback_table是大小为16的std::array<>,exti_set_mask为uint16_t类型,在32位CPU架构下会被提升为uint32_t。编译器无法确定__builtin_ctz()的返回值小于16,判定存在数组越界访问的潜在风险,因此生成了大量异常支持代码。

通过对索引结果进行掩码处理后,异常代码被移除,代码体积恢复至4KB,修正后的代码如下:

uint8_t index = __builtin_ctz(exti_set_mask) & 0xf;
auto &gpio_irq_info = irq_callback_table[index];

我已通过Meson配置了包含-fno-exceptions在内的编译标志,但该标志并未阻止异常代码的生成。我希望任何可能触发异常(或malloc这类动态内存分配操作)的代码都能触发警告甚至错误,请问有什么实现方法?

补充说明:未添加掩码的索引代码反汇编输出中包含大量异常相关函数,添加掩码后的代码反汇编则无此类函数。

内容的提问来源于stack exchange,提问作者Jon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 06:32:43