gpt4 book ai didi

c - MISRA 2012 规则 14.2

转载 作者:太空狗 更新时间:2023-10-29 16:10:13 25 4
gpt4 key购买 nike

我有一个与 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com