使用 && 和 || 时违反 MISRA 12.5在 if 语句中
MISRA Violation 12.5 when using && and || in if-statement
我正在开展一个应用 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;
}
}
这使我两次违反 MISRA 规则 12.5 非主要表达式与逻辑运算符一起使用。都符合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 坚持认为 sub-expressions 涉及二元运算符(“复杂表达式”)应始终带有括号。
对于布尔运算符 &&
和 ||
具体而言,规则 12.5 允许在同一表达式中链接多个运算符,但不能混合使用 &&
和 ||
在同一个表达式中没有括号,因为它们具有不同的优先级。
如果你写的是 && (var_c == const_c1) || (var_c == const_c2) &&
那么代码就是 non-conforming。但是你没有,你也确实在内部 sub-expressions.
周围加上了括号
我正在开展一个应用 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;
}
}
这使我两次违反 MISRA 规则 12.5 非主要表达式与逻辑运算符一起使用。都符合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 坚持认为 sub-expressions 涉及二元运算符(“复杂表达式”)应始终带有括号。
对于布尔运算符 &&
和 ||
具体而言,规则 12.5 允许在同一表达式中链接多个运算符,但不能混合使用 &&
和 ||
在同一个表达式中没有括号,因为它们具有不同的优先级。
如果你写的是 && (var_c == const_c1) || (var_c == const_c2) &&
那么代码就是 non-conforming。但是你没有,你也确实在内部 sub-expressions.