以下代码违反了MISRA C++规则5-0-15:数组索引将是指针算法的唯一形式。
(1)
void doSomething(const uint8_t *&ptr, size_t num) {
ptr += num;
}递增任何指针也违反了上述规则:
(2)
const uint8_t *ptr = ... ;
*ptr++;我发现了一个非常类似的问题,但是发问者在那里使用数组。我用指南针。
是否有替代符号或其他方法将数字添加到(1)/增量(2)指针以避免这种违反?
发布于 2022-05-14 16:31:04
阵列索引
所以使用数组索引。
void doSomething(const uint8_t ptr[], size_t num) {
const uint8_t *ptr2 = &ptr[num];
}递增任何指针
异常可以使用增量和递减运算符。使用增量解除引用是无效的。必须有两种表达方式。
const uint8_t *ptr = somearray;
++ptr;
uint8_t val = *ptr;发布于 2022-05-16 08:22:49
“数组索引将是指针算术的唯一形式”规则是从MISRA C:2004继承而来的,并且很早就讨论了该规则是否有意义。该规则的基本原理是防止*(arr+i)样式而不是arr[i]样式,我认为没有人怀疑后者更易读,因此更受欢迎。
但是,MISRA C:2004文档中的示例令人困惑--它不允许对声明为指针的变量进行数组样式的索引。但是显然在函数的情况下,如果我们声明某物为void func (int* ptr)或void func (int ptr[])并不重要,因为由于C的参数调整规则,它们是100%等价的。事实上,[]运算符只能与指针操作数一起使用,如这里所解释的:Do pointers support "array style indexing"?,因此这个规则会导致大量的误报。
这是“MISRA C:2012”中修正的许多东西之一,其中第18.4条规则的重点是指针仿造本身,而不是什么东西是如何声明的。米斯拉C:2004年和米斯拉C++:2008将仍然有旧的措辞和例子,所以如果你使用这些,你应该采取的规则一粒盐。
在您的具体情况下,使用const uint8_t *&ptr和const uint8_t& ptr[]并不重要。ptr += num;是值得怀疑的部分。
与规则无关的是,拥有一个指向一系列引用的指针也很可疑,因此需要对其进行审查,以防使用不太复杂的替代方法。
https://stackoverflow.com/questions/72240126
复制相似问题