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