【发布时间】:2018-06-05 03:34:40
【问题描述】:
我有一个与 MISRA 2012 规则 14.2“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
这只是一个示例案例,对于 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 */
}
【问题讨论】:
-
你是说显示的代码不是无限循环吗?您必须初始化
a才能确定。但它要么是一个无限循环,要么永远不会循环一次。 -
@Yunnosch : 谢谢你的评论,同样的注释
-
你对第二条评论的反应,第一条没有说服你?
-
我想说的是,您应该改进您的minimal reproducible example,以帮助人们专注于实际问题。显示的代码会引起我演示过的那种澄清问题。
-
对于一个不那么分散注意力的 MCVE(我希望保留它的示例函数)我建议初始化
a=20;并将函数体更改为(*ptr)--; return *ptr;
标签: c static-analysis misra