Misra 2012 不允许在不同指针之间进行转换的基本原理

2024-04-07

我目前正在开发一个项目,该项目要求代码符合 Misra 2012 标准。在整个项目中,我们有很多必需的 Misra 警告,告诉我们无法将指向一种类型的指针转​​换为指向另一种类型的指针。事情很简单void *memcpy(void *to, const void *from, size_t n)产生两个 Misra required 警告,因为 to 和 from 都需要分别类型转换为 void* 和 const void*。 从 void* 到任何其他类型的指针的转换也会给出 Misra 警告。

我的问题是,Misra 期望 malloc 和其他所有内容如何在不抛出任何警告的情况下工作?即使将 void* 缓冲区转换为 uint8_t* 缓冲区以逐字节解析缓冲区并填充结构体的所有元素也会引发大量警告?

除了这些警告之外,它还可以不只是显示使用注释或信息,要求我们仔细检查包装、对齐和其他任何可能出错的地方吗?


我想回到OP的要求并弄清楚一些事情。 首先,调用 void *memcpy(void *to, const void *from, size_t n) 没有问题,因为将对象指针转换为 void 指针不会违反任何 MISRA-C:2012 准则。换句话说,任何产生违规行为的工具都是有缺陷的。

其次,在得出任何结论之前,务必阅读相关 MISRA-C:2012 指南规则 11.5 的实际内容,即:



  Rule 11.5
  A conversion should not be performed from pointer to void into
  pointer to object

  Category Advisory
  Analysis Decidable, Single Translation Unit
  Applies to C90, C99

  Rationale
  Conversion of a pointer to void into a pointer to object may result
  in a pointer that is not correctly aligned, resulting in undefined
  behaviour. It should be avoided where possible but may be necessary,
  for example when dealing with memory allocation functions. If
  conversion from a pointer to object into a pointer to void is used,
  care should be taken to ensure that any pointers produced do not
  give rise to the undefined behaviour discussed under Rule 11.3.
  

观察结果:

  1. 它是一个建议性规则(即既不是必需的也不是强制性的),因此可以偏离,并且 MISRA 定义了正确的偏离过程;
  2. 将指向对象的指针转换为指向 void 的指针是可以的:反之则有问题;
  3. 基本原理明确提到了内存分配函数(是的,使用动态内存分配的程序可以符合 MISRA-C:2012);
  4. 基本原理提供了在将对象指针转换为 void 指针时该怎么做的指导,完全符合 OP 想要的内容(“要求我们仔细检查打包、对齐和其他可能出错的信息”)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Misra 2012 不允许在不同指针之间进行转换的基本原理 的相关文章

随机推荐