我有一个与 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< foo(&a)) 中存在的变量 (a) 时。这是有效的违规行为吗?
这只是一个示例,对于14.2,请不要关注上面示例代码中的无限循环。
14.2 规则:
第二个从句 which
- 应该是一个没有持久副作用的表达式,并且
- 应使用循环计数器和可选的循环控制标志,以及
- 不得使用在 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 */
}
最佳答案
您的示例代码违反了引用规则(第一个项目符号),因为
它确实有副作用(或者编译器无法真正判断,因为调用带有原型(prototype)的函数会允许此类副作用 - 并且碰巧至少有一个)。
您的示例可能违反引用的规则(第三个项目符号)如果
循环继续条件 ( i< foo(&a)
) 的(副作用)被计算(由您的特定 MISRA 分析器)作为“循环体”的一部分。 (我不会,但你的工具可能会。)
因此您显示的代码违反了规则一到两次。
关于c - MISRA 2012 规则 14.2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50691602/