1

MISRA 让我们的开发人员感到沮丧。

我们收到有关“不要将指针算法应用于指针”和“指针不指向数组”的 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而不是传递数组。

4

3 回答 3

6

John Bode 已经就您的第二个代码片段(实际上)如何解决 MISRA 指南给出了答复。

我会解决你的问题“有没有办法让一个指针指向数组中的一个单元格并增加它以满足 MISRA 的要求?”

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

更长的答案是 MISRA 指南基于数组语法比指针解引用更安全的前提。我个人的观点是,这是 MISRA 的一个弱点,因为它没有解决数组索引超出范围的问题——这实际上与超出数组范围的指针算术具有相同的结果。

此外,隐藏变量的“老派”方法(使用基于索引的循环,并在循环中递增指针)也不是很好的做法。i它具有 MISRA 指南试图防止的所有缺乏安全性,加上使代码更难阅读(人类必须更加努力地理解和p_buffer- 的值与代码之间存在一对一的关系更难理解更容易出错)。

于 2015-06-19T23:44:57.730 回答
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,它实际上与第一个片段相同。

于 2015-06-19T22:21:22.100 回答
0

MISRA 让我们的开发人员感到沮丧。

具体来说,严格遵守MISRA 会让您的开发人员感到沮丧。

在您强调的情况下,偏差是一种适当的机制......

于 2015-06-20T19:17:17.180 回答