指针MISRA违规的算法

时间:2018-05-31 11:33:23

标签: c misra

我创建了一个在数组中添加下一个数字的函数。代码非常简单,如下面的

int math(int *address, int size)
{
    int sum = 0;
    for (int i = 0; i < size; i++)
    {
        sum += *address;
        address++;
    }
    return sum;
}

在静态分析期间,我发现MISRA规则存在问题 - 这就是说你只能对分配给数组的指针进行数学计算。这个函数的目的是在数组上使用它,但当然 - 我在这里写的并不能保证指针不会被赋值给变量。

我想到的一个解决方法是将整个表复制到本地区域然后对所有元素求和,但这是一个相当大的操作,浪费了很多上位处理器资产。你有什么想法我怎样才能做得更好?

1 个答案:

答案 0 :(得分:0)

这将来自MISRA-C:2004第17章,这对使用指针和数组非常不合理。本章在MISRA-C:2012(第18章)中从头开始重写。我强烈建议升级,因为MISRA-C:2004在这里没有多大意义。

至于如何使您的代码符合MISRA-C:2004标准,请执行以下操作:

int math(int address[], int size)
{
    int sum = 0;
    int i; // declaration must be here, MISRA-C:2004 does not allow C99
    for (i = 0; i < size; i++)
    {
        sum += address[i];
    }
    return sum;
}

是的,它做了同样的事情。但至少它使你的代码更具可读性。

为了使您的代码更安全,尽管不符合任何MISRA,请执行以下操作:

// better than MISRA-C but not compliant
int math(size_t size, int address[size])
{
    int sum = 0;
    for (size_t i = 0; i < size; i++)
    {
        sum += address[i];
    }
    return sum;
}

或者在高完整性系统的情况下,您甚至可以这样做:

int math(size_t size, int (*array)[size])
{
  int* address = *array;
  ...

这两种替代方案都提供比MISRA-C更安全的代码。