指针 MISRA 违规的算法

Arithmetic of pointer MISRA violation

我创建了一个函数来添加数组中的下一个数字。代码很简单,如下图

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

在静态分析过程中,我发现 MISRA 规则存在问题 - 这意味着您只能对分配给数组的指针进行数学运算。这个函数的目的是在数组上使用它,但是当然——我在这里写的并不能保证指针不会被分配给一个变量。

我想到的一个解决方法是将整个 table 复制到本地,然后对所有元素求和,但这是相当大的操作,浪费了很多 uprocessors 资产。你有什么想法我怎样才能让它变得更好?

这将来自 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 更安全的代码。