c语言 - 使用 && 和 || 时违反 MISRA 12.5在 if 语句中



我正在进行一个应用MISRA 2004的项目。

关于大多数违规行为,我都知道原因,但有一个我不明白:

它在带有&&||操作的if语句中。

示例:

uint8 getValue()
{
// Some algorithm, simplified with return 1
uint8 someValue = 1u;
return someValue;
}
int main(int argc, char *argv[]) {
uint8 currentState = 0u;
uint8 var_a = getValue();
uint8 var_b = getValue();
uint8 var_c = getValue();
uint8 var_d = getValue();
const uint8 const_a = 1u;
const uint8 const_b = 2u;
const uint8 const_c1 = 3u;
const uint8 const_c2 = 30u;
const uint8 const_d = 4u;
if ((var_a == const_a) && (var_b == const_b) && ((var_c == const_c1) || (var_c == const_c2)) && (var_d == const_d))
{
currentState = 1;
} else 
{
currentState = 2;
}
}

这使我违反了与逻辑运算符一起使用的规则12.5非主表达式的两倍MISRA。两者都符合IF语句

我不认为这个if语句有什么问题,尽管它有点长。

有人知道吗,这里出了什么问题,以及如何解决违规行为?

编辑:我稍微调整了一下这个例子。我还注意到,如果我将if语句简化为:,我只会得到一个错误

if ((var_a == const_a) && ((var_c == const_c1) || (var_c == const_c2)) && (var_d == const_d))

如果更改为:,则没有违规

if ((var_a == const_a) && ((var_c == const_c1) || (var_c == const_c2)))

静态分析器显示这是一个假阳性。您的代码符合要求。

MISRA C:2004 12.5(以及2012年版本中的等效规则(的基本原理是避免操作员优先级可能不明显的情况。总的来说,MISRA坚持认为涉及二进制运算符的子表达式("复杂表达式"(应该总是有括号。

特别是在布尔型&&||运算符的情况下,规则12.5允许在同一表达式中链接它们中的多个,但不允许在没有括号的情况下将&&||混合在同一个表达式中,因为它们具有不同的优先级。

如果您编写了&& (var_c == const_c1) || (var_c == const_c2) &&,那么代码将不符合要求。但是,您没有,并且在内部子表达式周围加了括号。

相关内容

  • 没有找到相关文章

最新更新