MISRA 2012规则10.1警告:运算符'!'操作数非法问题修复咨询
MISRA 2012 Rule 10.1警告修复:解决运算符'!'操作数不允许的问题
我最近碰到了MISRA 2012 Rule 10.1的强制警告,提示运算符'!'存在不允许的操作数,原代码是这样的:
#define C_BYTE unsigned char C_BYTE SessionStatus; #define DISCONNECTED 0x10 if((!(SessionStatus & (C_BYTE) DISCONNECTED))) { //Do something }
我尝试了两种修改方式,但都没能消除警告:
用
~替代!:if((~(SessionStatus & (C_BYTE) DISCONNECTED))) { //Do something }增加与0的比较:
if((!(SessionStatus & (C_BYTE) DISCONNECTED)) != 0u) { //Do something }
问题根源
MISRA 2012 Rule 10.1的核心要求是:逻辑运算符(!、&&、||)的操作数必须是本质布尔类型(_Bool),或者是可以隐式转换为布尔的类型。原代码中,SessionStatus & (C_BYTE)DISCONNECTED的结果是unsigned char类型,直接用!取反时,操作数不符合规则要求,因此触发警告。
正确的修复方案
最直接且符合MISRA要求的方式是直接将位运算结果与0比较,这样得到的是布尔类型结果,完全符合规则:
if( (SessionStatus & (C_BYTE)DISCONNECTED) == 0u ) { //Do something }
这个写法的逻辑和原代码完全一致:当SessionStatus的对应位未被置位(即未处于DISCONNECTED状态)时执行代码块。
如果一定要保留!运算符,也可以显式将位运算结果转换为布尔类型,让操作数符合规则要求:
if( !((_Bool)(SessionStatus & (C_BYTE)DISCONNECTED)) ) { //Do something }
不过第一种直接比较的写法更清晰易懂,也更符合嵌入式开发中MISRA规范的常用实践。
内容的提问来源于stack exchange,提问作者kapilddit
相关产品推荐
相关产品推荐

