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 *&ptr
与 const uint8_t& ptr[]
无关紧要。 ptr += num;
是有问题的部分。
与规则无关,拥有指向引用数组的指针也很可疑,需要进行审查,以防可以使用不那么复杂的替代方案。
以下代码违反了 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 *&ptr
与 const uint8_t& ptr[]
无关紧要。 ptr += num;
是有问题的部分。
与规则无关,拥有指向引用数组的指针也很可疑,需要进行审查,以防可以使用不那么复杂的替代方案。