首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MISRA 5-0-15指针算法-规则违反

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

Stack Overflow用户
提问于 2022-05-14 12:20:07
回答 2查看 208关注 0票数 2

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

(1)

代码语言:javascript
复制
void doSomething(const uint8_t *&ptr, size_t num) {
  ptr += num;
}

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

(2)

代码语言:javascript
复制
const uint8_t *ptr = ... ;
*ptr++;

我发现了一个非常类似的问题,但是发问者在那里使用数组。我用指南针。

是否有替代符号或其他方法将数字添加到(1)/增量(2)指针以避免这种违反?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-05-14 16:31:04

阵列索引

所以使用数组索引。

代码语言:javascript
复制
void doSomething(const uint8_t ptr[], size_t num) {
     const uint8_t *ptr2 = &ptr[num];
}

递增任何指针

异常可以使用增量和递减运算符。使用增量解除引用是无效的。必须有两种表达方式。

代码语言:javascript
复制
const uint8_t *ptr = somearray;
++ptr;
uint8_t val = *ptr;
票数 2
EN

Stack Overflow用户

发布于 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 *&ptrconst uint8_t& ptr[]并不重要。ptr += num;是值得怀疑的部分。

与规则无关的是,拥有一个指向一系列引用的指针也很可疑,因此需要对其进行审查,以防使用不太复杂的替代方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72240126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档