Misra-C违规行为:for循环条件格式不正确

hfwmuf9z  于 2023-01-04  发布在  其他
关注(0)|答案(3)|浏览(185)

我不知道,为什么Misra-C报告这个错误在下面的代码快照。

int count = 0;
element = TAILQ_LAST(&(phdata->ph_consice_head), phqueue);

for (;
        element; // Malformed for-loop Condition help
                    The termination clause of this for loop is not of the expected form. 
        element = TAILQ_PREV(element, phqueue, next)) {
    count ++;
}

注意-元素是指向结构的指针。

如果有人能帮我找出for循环的问题所在,那就太好了。

gzszwxb4

gzszwxb41#

米斯拉是一个习惯的动物,不喜欢任何“看起来不寻常”的东西。
它最喜欢for循环,如

for(something=value;
    boolean_expression /* ideally something<size */;
    incremental_change /* ideally something++)
2w2cym1i

2w2cym1i2#

MISRA C:2012年规则14.2对于for循环的3个子句中允许的内容是非常不言自明的。与任何规则一样,在使用MISRA C之前,您需要研究它。
在这种情况下,第二个子句需要使用循环迭代器,静态分析器可能会对这里的循环迭代器感到困惑。
此外,element;不符合MISRA 14.4,您需要显式地创建一个“本质上为布尔”的表达式,例如element != NULL
为了符合MISRA,我建议如下重写:

element = TAILQ_LAST(&(phdata->ph_consice_head), phqueue);

for (int count = 0; ; count++)
{
  if(element == NULL)
  {
    break;
  }
  element = TAILQ_PREV(element, phqueue, next);
}

或者,如果存在某个已知的最大迭代次数,则也可以将第2子句设为count<n

xpszyzbs

xpszyzbs3#

for循环最好用于已知次数的迭代; while循环对于以下情况更有意义:
您的代码显示的是while循环,而不是for循环...它可以更清楚地显示为(并且符合MISRA):

int count = 0;
do
{
  count++;
  element = TAILQ_LAST( &(phdata->ph_consice_head), phqueue );
} while ( element != NULL );

或确保正确的count

int count = 0;
element = TAILQ_LAST( &(phdata->ph_consice_head), phqueue );

while ( element != NULL )
{
  count++;
  element = TAILQ_LAST( &(phdata->ph_consice_head), phqueue );
}

相关问题