如何解决这个符合MISRA c++标准的警告?

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

以下是警告信息:

"参数数组可以被声明为const" ==> 我已经声明了数组为const,我正在使用C++编程。

3个回答

7

需要注意的第一件事是int foo(const uint8_t array[])等同于int foo(const uint8_t* array),即函数接受一个指向const uint8_t的指针,而不是一个数组。指针本身并不是const的,只有指向的内容是const的。函数签名应该为:

int foo(const uint8_t* const array)  

记录一下,我并不认为这个警告特别有用。参数是按值传递的,调用者并不关心函数对它做了什么。此外,当比较函数签名时,顶层const限定符在参数上被忽略,这可能会导致一些混淆。
例如,void foo(int)void foo(const int)是相同的签名。
编辑:
因此,根据您的评论,MISRA不知道您不能通过值传递数组,并且抱怨数组索引与指针算术不同。 恐怖... 问题在于您无法使用数组语法添加顶级const,这使得对这两个警告的修复彼此排斥。
然后尝试像这样欺骗它:
typedef const uint8_t Array[];
int foo(const Array arr);

2
我之前尝试过相同的方法,但是它又开始给出不同的警告,如下所示:"Rule 5-0-15,使用指针算术运算而非数组索引" ==> 对于行 x = array[i]; - suhel
@suhel 哇,那真是太糟糕了 :) 已更新答案。 - jrok
1
@suhel,我很感激你的反馈,无论 typedef 是否有效。 - jrok

1

记住,尽管语法如此,该函数实际上接受一个指针,并等效于

int foo(const uint8_t * array)

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

int foo(const uint8_t * const array)

0

还有另一种方法,似乎是在<iterator>

为了安全地将指针向前移动,您只需使用std::advance(array, 1),然后访问该值只需解除引用(*array),即位置,这似乎消除了所提出的MISRA警告。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接