C 指针MISRA冲突算法

C 指针MISRA冲突算法,c,misra,C,Misra,我制作了一个在数组中添加下一个数字的函数。代码非常简单,如下所示 int math(int *address, int size) { int sum = 0; for (int i = 0; i < size; i++) { sum += *address; address++; } return sum; } int数学(int*地址,int大小) { 整数和=0; 对于(int i=0;i

我制作了一个在数组中添加下一个数字的函数。代码非常简单,如下所示

int math(int *address, int size)
{
    int sum = 0;
    for (int i = 0; i < size; i++)
    {
        sum += *address;
        address++;
    }
    return sum;
}
int数学(int*地址,int大小)
{
整数和=0;
对于(int i=0;i
在静态分析期间,我发现MISRA规则存在问题,也就是说,只能对分配给数组的指针进行计算。这个函数的目的是在数组上使用它,但当然,我在这里写的并不能保证指针不会被分配给变量


我考虑的一个工作是将整个表复制到局部区域,然后对所有元素求和,但这是一个相当大的操作,浪费了大量的资源。你有什么办法让我做得更好吗

这将来自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;
}
// 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;
}

这两种选择都比MISRA-C提供了更安全的代码。

如果不做出MISRA禁止的相同假设,就无法复制到本地数组。因此,这是一个非常糟糕的解决方法。本质上,MISRA规则相当于“唯一允许的指针数学是数组索引”。更改示例以使用数组语法访问元素,不增加指针。@ Peter MISRA-C已经被修复,这是从旧的标准中没有意义的要求。等等,为什么这是C++和C++的标记?如果你真的在使用MISRA-C++的话,那你就浪费了我很多时间,因为我的答案不适用于这种情况。请通过编辑问题澄清您使用的是哪种编程语言和MISRA。@Peter您的意思是这样的:sum+=address[i];当函数的参数将被分配给变量而不是数组时,这将导致出现问题。但是你的解决方案更好——那么指针上就没有数学了。
int-math(size\t-size,int-address[size])
更安全。。。因为它不会编译:“错误:在']'标记之前在函数体外部使用参数”(或使用VLA扩展)。无论如何,第二个
size
将被忽略(至少当常量表达式出现时)。
template int math(int(&array)[N])
仍然有效。(但C++)。@Jarod42您需要使用标准C编译器进行编译。无论是C++编译器还是C++编译器都不工作。G++/CLAN+++都抱怨(C++)。现在问题只被标记为….jAROD42,因为C++是C语言的另一种编程语言。
int math(size_t size, int (*array)[size])
{
  int* address = *array;
  ...