MISRA令我们的开发人员感到沮丧。
我们收到关于&#34的MISRA错误;不要将指针算法应用于指针"和"指针不指向数组"。
我们使用的语法为:
uint8_t const * p_buffer
将缓冲区传递给将缓冲区写入SPI总线的函数。
给出一个示例代码片段:
static void Write_Byte_To_SPI_Bus(uint8_t byte);
void Write_Buffer_To_SPI_Bus(uint8_t const * p_buffer,
unsigned int quantity)
{
for (unsigned int i = 0; i < quantity; ++i)
{
Write_Byte_To_SPI_Bus(*p_buffer++);
}
}
有没有办法让指针指向数组中的单元格并增加它以满足MISRA?
我的解释是MISRA想要将索引递增到数组而不是指针:
void Write_Array_To_SPI_Bus(uint8_t const p_array[],
unsigned int quantity)
{
for (unsigned int i = 0; i < quantity; ++i)
{
Write_Byte_To_SPI_Bus(p_array[i]);
}
}
许多开发人员都是老派,并且更喜欢使用指向uint8_t
而不是传递数组的指针。
答案 0 :(得分:6)
John Bode已经回复了你的第二个代码片段(实际上)如何解决MISRA指南。
我将解决你的问题&#34;有没有办法让一个指向数组中单元格的指针并增加它以满足MISRA?&#34;
简短的回答是&#34; no&#34;。规则17.4(在MISRA 2004中 - 我没有2012版本的方便)状态&#34;数组索引应该是唯一允许的指针算法形式&#34;。这基本上是您在这种情况下需要进行的更改的基础。
更长的答案是MISRA指南基于这样一个前提,即数组语法比指针解除引用更安全。我个人的观点是,这是MISRA的一个弱点,因为它没有解决数组索引超出范围的问题 - 这实际上与指针算法的结果超出了数组的范围。
此外,&#34;旧学校&#34;阴影变量的方法(使用基于索引的循环,并在循环中递增指针)也不是很好的做法。它完全缺乏MISRA指南试图阻止的安全性,加上使代码更难阅读(仅仅是人类必须更加努力地理解{{1}的值之间存在一对一的关系。和i
- 而且更难理解的代码更容易出错。
答案 1 :(得分:4)
请记住,就C而言,
void Write_Buffer_To_SPI_Bus(uint8_t const * p_buffer,
unsigned int quantity)
和
void Write_Array_To_SPI_Bus(uint8_t const p_array[],
unsigned int quantity)
意味着完全同样的事情;在函数参数声明的上下文中,uint8_t const * p_buffer
和uint8_t const p_array[]
都声明指针类型,而不是指针和数组类型。
你的第二个片段应该满足MISRA,它实际上与第一个片段相同。
答案 2 :(得分:0)
MISRA令我们的开发人员感到沮丧。
具体而言,对MISRA的严格遵守令您的开发人员感到沮丧。
如果您突出显示,则偏差是一种适当的机制......