我正在開發一個應用 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)))
uj5u.com熱心網友回復:
這似乎是您的靜態分析儀的誤報。您的代碼是合規的。
MISRA C:2004 12.5(以及 2012 版本中的等效規則)的基本原理是避免運算子優先級可能不明顯的情況。總體而言,MISRA 堅持認為涉及二元運算子(“復雜運算式”)的子運算式應始終帶有括號。
特別是在布爾&&和||運算子的情況下,規則 12.5 允許將它們中的多個鏈接在同一個運算式中,但不能混合&&,并且||在沒有括號的同一個運算式中,因為它們具有不同的優先級。
如果您撰寫&& (var_c == const_c1) || (var_c == const_c2) &&了代碼,那么代碼將是不合格的。但是,您沒有,并且您也確實在內部子運算式周圍加上了括號。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/449329.html
