C++ 注961:违反MISRA 2004咨询规则12.6,运算符“!”需要布尔表达式
这是我代码的一部分,我收到了标题中提到的警告 代码是C++ 注961:违反MISRA 2004咨询规则12.6,运算符“!”需要布尔表达式,c++,C++,这是我代码的一部分,我收到了标题中提到的警告 代码是 #define OMAP3_MCSPI_SYSSTATUS_RESETDONE (1U) uint32_t tmp =6 ; while (!(tmp & OMAP3_MCSPI_SYSSTATUS_RESETDONE)) 警告是 Note 961: Violates MISRA 2004 Advisory Rule 12.6, boolean expression required for operator: '!
#define OMAP3_MCSPI_SYSSTATUS_RESETDONE (1U)
uint32_t tmp =6 ;
while (!(tmp & OMAP3_MCSPI_SYSSTATUS_RESETDONE))
警告是
Note 961: Violates MISRA 2004 Advisory Rule 12.6, boolean expression required for operator: '!'
为什么我会收到这个警告
while (!(tmp & OMAP3_MCSPI_SYSSTATUS_RESETDONE != 0))
如果您想避免警告,MISRA规则引用的是a,因为版权原因,a必须修改规则 12.6 adv:逻辑运算符&、|和的操作数!应该是有效的布尔值。有效布尔表达式不应用作除&、| |和!之外的运算符的操作数 这意味着您需要将表达式tmp&OMAP3\u MCSPI\u SYSSTATUS\u RESETDONE替换为布尔值。在这种情况下,正确的方法是将其与0进行比较 e、 g
“tmp”是一个32位无符号整数uint32\u t。”OMAP3_MCSPI_SYSSTATUS_RESETDONE'是一个无符号整数。使用“&”运算符是“and”,将这些位相加,得到另一个无符号整数。MISRA规则希望您使用布尔表达式而不是无符号整数表达式作为“!”的参数接线员 要解决此问题,您可以使用
while ( !((tmp & OMAP3_MCSPI_SYSSTATUS_RESETDONE) != 0))
或
问题是什么?@juanchopanza为什么我会收到这个警告?因为MISRA规则说在这种情况下你应该得到警告。我认为你可能需要注意操作符的优先级。据我记忆所及,!=具有比&更高的优先级,因此您将以!tmp&OMAP3\u MCSPI\u系统状态\u重置完成!=0Hi Wojtek,我得到的警告与其他代码行相同,即如果strstrstrflash->name,M25P=NULL..但仍然得到与警告613相同的警告:可能在运算符'->'的左参数中使用NULL指针'flash',我尝试使用NULL检查条件,但得到的警告相同warning@Aswin-这是另一个问题-我们需要查看所有使用和设置flash的代码。
while ( !((tmp & OMAP3_MCSPI_SYSSTATUS_RESETDONE) != 0))
while ( (tmp & OMAP3_MCSPI_SYSSTATUS_RESETDONE) != OMAP3_MCSPI_SYSSTATUS_RESETDONE)