c - MISRA 2012 规则 14.2

标签 c static-analysis misra

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

相关文章:

C POSIX 线程的互斥锁/条件根据变量所在位置的不同而不同

c - SIMD以下代码

dart - 通用参数未显示不合理的隐式强制转换警告

c++ - 如何在不违反 MISRA C++ 2008 咨询规则 5-2-10 的情况下使用 std::transform?

在 C 中从 unsigned 转换为 signed char

c - 从字符串中读取字符并获取整数值

Gradle - "apply from"一个 ZIP 依赖​​项

c - 收到警告 - 在 C 代码中可能为 null 之前取消引用

c - 初始化字符数组和 MISRA 错误

c - MISRA 违规 12.9 一元减号的操作数未签名