如何修复MISRA规则14.3的代码合规问题?
修复MISRA规则14.3的问题
问题原因
你遇到的问题根源在于INSTANCE是uint8_t(无符号整数类型),函数参数x作为无符号数,取值范围天然是0到255。而INSTANCE_1被定义为0U,所以INSTANCE_1 <= x这个条件永远为真,属于恒真的不变式,违反了MISRA规则14.3(禁止控制流语句使用恒真/恒假的表达式)。
修复方案
方案1:直接移除冗余的左边界检查
最直接的修复是删掉永远成立的左判断,只保留有效的右边界检查:
int fun(INSTANCE x) { if (x <= INSTANCE_11) { do_something(); } }
方案2:保留意图注释+优化检查
如果需要保留代码的可读性,明确表达输入范围的约束意图,可以添加注释说明:
// 校验输入x在合法实例范围内(INSTANCE_1为0,无符号类型天然满足左边界) int fun(INSTANCE x) { if (x <= INSTANCE_11) { do_something(); } }
方案3:改用枚举类型优化定义(更推荐)
用枚举类型替代#define,不仅能明确实例的合法取值范围,还能提升类型安全性,从根源减少这类冗余检查问题:
// C11及以后支持指定枚举底层类型为uint8_t typedef enum : uint8_t { INSTANCE_1 = 0U, INSTANCE_2, // ... 中间实例定义 INSTANCE_11 } INSTANCE; int fun(INSTANCE x) { // 枚举类型的合法取值是INSTANCE_1到INSTANCE_11,只需检查右边界 if (x <= INSTANCE_11) { do_something(); } }
内容的提问来源于stack exchange,提问作者Paulson Raja L
相关产品推荐
相关产品推荐

