如何解决这个符合MISRA C 的警告

How to resolve this MISRA c++ compliant warning

本文关键字:MISRA 警告 何解决 解决      更新时间:2023-10-16
int foo(const uint8_t array[]) {
int x;
  for(i=0;i<5;i++){
  x= array[i];
}
return 0;
}

它给出以下警告,

"参数数组可以声明const" ==>我已经声明了数组const,我正在c 中编程。

要注意的第一件事是 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)是相同的签名。

编辑:

因此,根据您的评论,Misra不知道您不能以价值传递数组,并且抱怨阵列索引的作用与指针算术不同。 shudder ... 问题是您无法使用数组语法添加顶级const,这可以解决这两个警告互斥。

尝试这样欺骗它,然后:

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

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

int foo(const uint8_t * const array)

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

要向前移动指针'安全'您只需使用 std::advance(array, 1),然后即可访问该值,您只需取消 (*array),位置,这似乎可以摆脱有问题的Misra警告。