[英]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.