如何解决此MISRA c ++兼容警告

时间:2014-01-28 10:48:54

标签: c++

int foo(const uint8_t array[]) {
int x;
  for(i=0;i<5;i++){
  x= array[i];
}
return 0;
}

它会发出如下警告,

“参数数组可以声明为const”==&gt;我已经声明了数组const,我用C ++编程。

3 个答案:

答案 0 :(得分:7)

首先要注意的是int foo(const uint8_t array[])等同于int foo(const uint8_t* array),即该函数采用指向const uint8_t的指针,而不是数组。指针本身不是const,指针是。签名应该是:

int foo(const uint8_t* const array)  

为了记录,我发现这个警告特别有用。该参数是按值获取的,并且调用者不会关心函数对它的作用。此外,在比较函数签名时,会忽略参数的顶级const限定符,这可能会导致一些混淆。

例如,

void foo(int)void foo(const int)是相同的签名。

编辑:

所以,根据your comment,MISRA并不知道你不能按值传递数组,并抱怨数组索引的工作方式与指针算法不同。 Shudder ...... 问题在于,您无法使用数组语法添加顶级const,这使得对这两个警告的修复变得不可思议。

尝试欺骗它,然后:

typedef const uint8_t Array[];
int foo(const Array arr);

答案 1 :(得分:1)

请记住,尽管有语法,但该函数实际上是一个指针,相当于

int foo(const uint8_t * array)

所以array指向一个常量字节数组;但本身并不是一成不变的。警告指出,由于函数没有修改指针,它可以(并且,至少根据这个规则,应该)是不变的:

int foo(const uint8_t * const array)

答案 2 :(得分:0)

还有另一种方式,它似乎在<iterator>

之下

要将指针向前移动&#39;安全&#39; ,您只需使用std::advance(array, 1)然后访问该值,您只需解除引用(*array)的位置,这似乎摆脱有问题的MISRA警告。