解决MISRA 2012 Rule 2.2违规:逻辑运算结果恒为false问题
解决QAC触发的MISRA违规:“该逻辑运算的结果始终为false”
问题根源
你遇到的违规是因为RISING和NON_INV两个STM32H7官方宏的定义值完全相同(均为0X00000000U),导致代码中pol == RISING || pol == NON_INV的判断逻辑冗余——本质上是重复判断同一个值。QAC的MISRA规则将这种冗余逻辑误报为“逻辑运算结果始终为false”。
解决方案
针对这个问题,有两种简洁且符合MISRA规范的修复方式:
1. 移除冗余的重复判断
直接删除其中一个等价的条件判断,保留任意一个即可,因为两者的校验逻辑完全一致:
bool IsTimClockPolarity(uint32_t pol) { bool result = false; if ((pol == RISING) || (pol == FALLING) || (pol == INV) || (pol == BOTH_EDGE)) { result = true; } return result; }
2. 使用switch-case替代条件判断
switch-case结构更清晰,能避免QAC对冗余逻辑的误判,同时更符合嵌入式代码的MISRA风格,还能完整保留所有官方宏的引用:
bool IsTimClockPolarity(uint32_t pol) { bool result = false; switch (pol) { case RISING: case NON_INV: case FALLING: case INV: case BOTH_EDGE: result = true; break; default: result = false; break; } return result; }
内容的提问来源于stack exchange,提问作者Vincenzo Cristiano
相关产品推荐
相关产品推荐

