MISRA 5-0-15 - 指针运算 - 违反规则

MISRA 5-0-15 - Pointer Arithmetic - Rule Violation

以下代码违反了 MISRA C++ 规则 5-0-15:数组索引应是指针运算的唯一形式。

(1)

void doSomething(const uint8_t *&ptr, size_t num) {
  ptr += num;
}

增加任何指针也违反了上述规则:

(2)

const uint8_t *ptr = ... ;
*ptr++;

我发现了一个非常相似的问题,但是提问者使用数组。我用指针。

是否有替代符号或其他方法来将数字添加到 (1)/ increment (2) 指针来解决这个问题违规?

Array indexing

所以使用数组索引。

void doSomething(const uint8_t ptr[], size_t num) {
     const uint8_t *ptr2 = &ptr[num];
}

Incrementing any pointer

自增自减运算符可以异常使用。使用 递增取消引用 是无效的。必须有两个表达式。

const uint8_t *ptr = somearray;
++ptr;
uint8_t val = *ptr;

“数组索引应该是指针运算的唯一形式”规则是从 MISRA C:2004 继承的,并且很早就讨论过该规则是否有意义。该规则背后的基本原理是防止 *(arr+i) 风格优于 arr[i] 风格,我认为没有人质疑后者更具可读性,因此更受欢迎。

但是,MISRA C:2004 文档中的示例令人困惑 - 它不允许对声明为指针的变量进行数组样式索引。但显然在函数的情况下,我们将某些东西声明为 void func (int* ptr)void func (int ptr[]) 并不重要,因为由于 C 的参数调整规则,它们是 100% 等价的。事实上 []operator can only be used with pointer operands as explained here: 所以这条规则会导致很多误报。

这是 MISRA C:2012 中修复的众多问题之一,其中规则 18.4 关注指针算法本身,而不是声明某物的方式。 MISRA C:2004 和 MISRA C++:2008 仍然会有旧的措辞和示例,因此如果您正在使用它们,您应该对规则持保留态度。

在您的特定情况下,使用 const uint8_t *&ptrconst uint8_t& ptr[] 无关紧要。 ptr += num;是有问题的部分。

与规则无关,拥有指向引用数组的指针也很可疑,需要进行审查,以防可以使用不那么复杂的替代方案。