c - 在符合 MISRA 的情况下在 C 中传递缓冲区

标签 c arrays pointers misra

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 的指针而不是传递数组。

最佳答案

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

我将解决您的问题“是否有一种方法可以让指针指向数组中的单元格并递增它以满足 MISRA?”

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

更长的答案是,MISRA 准则基于这样一个前提,即数组语法在某种程度上比指针取消引用更安全。我个人的观点是,这是 MISRA 的一个弱点,因为它没有解决数组索引越界的问题——这实际上与指针算法越界的结果相同。

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

关于c - 在符合 MISRA 的情况下在 C 中传递缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30947447/

相关文章:

c - 如何通过C语言编程在现有PDF文件中添加下标?

c - 结构并列出当 temp 为 null 时此代码执行的操作

javascript - 原型(prototype)设计时如何更改数组

javascript - 为什么我的 for 循环从最后一项开始并在一次迭代后停止运行?

c - 在 C 中使一个指针指向另一个指针所指向的内容

c - 为什么我的带有 scanf 的 for 循环没有被执行?

c - 如果/或 % 运算符的一个或两个操作数是负数,结果是否将由实现定义?

python - Numpy 数组与权重求和

java - 引用数组中的位置而不是其中的数据。 ( java )

c - C 中的字符串结构变量赋值错误