簡體   English   中英

MISRA 2012規則14.2

[英]MISRA 2012 Rule 14.2

我有一個與MISRA 2012規則14.2有關的問題“for for循環應該是格式良好的”

考慮以下示例代碼:

int foo (int *ptr)
{
    (*ptr)--;
     return *ptr;
}

void main()
{
    int a =20;
    int i;
    for (i=0; i< foo(&a) ; i++)
    {
         /*
         <loop body>
         */       
    }
}

這里換行for (i=0; i< foo(&a) ; i++)我得到MISRA違規,14.2。 問題是當我們在如圖所示的函數中修改循環條件(i <foo(&a))中存在的變量(a)時。 是有效違規嗎?

它只是一個示例案例,對於14.2,請不要關注上面示例代碼中的無限循環。


14.2規則: 第二條款
- 應該是一個沒有持久性副作用的表達,並且
- 應使用循環計數器和可選的循環控制標志,和
- 不要使用for循環體中修改的任何其他對象。

示例: -

 bool_t flag = false;
    for ( int16_t i = 0; ( i < 5 ) && !flag; i++ )
    {
    if ( C )
    {
    flag = true; /* Compliant - allows early termination
    * of loop */
    }
    i = i + 3; /* Non-compliant - altering the loop
    * counter */
    }

您的示例代碼違反了引用的規則(第一個項目符號),因為
它確實有副作用(或者編譯器無法真正告訴,因為調用具有允許這種副作用的原型的函數 - 並且碰巧至少有一個)。

如果循環連續條件( i< foo(&a) )的(側面)效應(由您的特定MISRA分析器計算)作為“循環體”的一部分,則您的示例可能違反引用的規則(第三個項目符號)。 (我不會,但你的工具可能。)

因此,您顯示的代碼違反了規則一到兩次。

對於第14.2條的基本原理表明,該規則旨在限制for循環,停止“聰明”的使用,從而使代碼更易於查看和分析...

我有一個簡單的格言:

  • 如果您有預先確定的迭代次數,請使用for循環
  • 如果沒有預先確定的迭代次數,請使用while ... do循環

假設foo(&a)不返回常量,那么最好使用while ... do循環:

int a = 20;
int i = 0;

while ( i < foo(&a) )
{
  // Loop body
  ...
  ++i;
}

注意:請參閱免責聲明的個人資料。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM