Tho*_*ews 1 c arrays pointers misra
MISRA令我们的开发人员感到沮丧.
我们得到MISRA错误"不要将指针算法应用于指针"和"指针不指向数组".
我们使用以下语法:
uint8_t const * p_buffer
Run Code Online (Sandbox Code Playgroud)
将缓冲区传递给将缓冲区写入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++);
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法让一个指向数组中单元格的指针并增加它以满足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]);
}
}
Run Code Online (Sandbox Code Playgroud)
许多开发人员都是老派,他们更喜欢使用指针uint8_t而不是传递数组.
John Bode已经回复了关于你的第二个代码片段如何(实际上)解决MISRA指南的问题.
我将解决你的问题"有没有办法指向一个数组中的单元格并增加它以满足MISRA?"
最简洁的答案是不".规则17.4(在MISRA 2004中 - 我没有2012版本的方便)声明"数组索引应该是唯一允许的指针算术形式".这基本上是您在这种情况下需要进行的更改的基础.
更长的答案是MISRA指南基于这样一个前提,即数组语法在某种程度上比指针解除引用更安全.我个人的观点是,这是MISRA的一个弱点,因为它没有解决数组索引超出范围的问题 - 这实际上具有超出数组边界的指针算法的相同结果.
此外,阴影变量的"旧学校"方法(使用基于索引的循环,并在循环中递增指针)也不是很好的做法.它具有MISRA指南试图阻止的所有安全性,加上使代码更难阅读(仅仅是人类必须更加努力地理解,i和p_buffer- 和代码之间存在一对一的关系.这更难理解更容易出错).