在C中传递具有MISRA合规性的缓冲区

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而不是传递数组.

Pet*_*ter 6

John Bode已经回复了关于你的第二个代码片段如何(实际上)解决MISRA指南的问题.

我将解决你的问题"有没有办法指向一个数组中的单元格并增加它以满足MISRA?"

最简洁的答案是不".规则17.4(在MISRA 2004中 - 我没有2012版本的方便)声明"数组索引应该是唯一允许的指针算术形式".这基本上是您在这种情况下需要进行的更改的基础.

更长的答案是MISRA指南基于这样一个前提,即数组语法在某种程度上比指针解除引用更安全.我个人的观点是,这是MISRA的一个弱点,因为它没有解决数组索引超出范围的问题 - 这实际上具有超出数组边界的指针算法的相同结果.

此外,阴影变量的"旧学校"方法(使用基于索引的循环,并在循环中递增指针)也不是很好的做法.它具有MISRA指南试图阻止的所有安全性,加上使代码更难阅读(仅仅是人类必须更加努力地理解,ip_buffer- 和代码之间存在一对一的关系.这更难理解更容易出错).