如何彻底禁用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
相关产品推荐
相关产品推荐

