我目前正在开发一个项目,要求代码符合Misra 2012标准.在整个项目中,我们有许多必需的misra警告告诉我们,我们无法将指针转换为指向另一种类型的指针.事情就像void *memcpy(void *to, const void *from, size_t n)产生两个Misra必需的警告一样简单,因为需要分别将类型转换为void*和const void*.从void*转换为指向任何其他类型的指针也会发出Misra警告.
我的问题是Misra如何在没有任何警告被抛出的情况下期望malloc和其他所有工作?即使将void*缓冲区转换为uint8_t*缓冲区来逐字节解析abuffer并填充结构结构的所有元素也会引发大量警告?
而不是这些警告,它不仅可以显示使用注释或信息要求我们仔细检查包装,对齐和其他可能出错的地方吗?
小智 8
我想回到OP所要求的内容并直接得到一些东西.首先,调用void*memcpy(void*to,const void*from,size_t n)没有问题,因为指向对象的指针到void指针的转换不违反任何MISRA-C:2012准则.换句话说,任何产生违规行为的工具都是错误的.
其次,在得出任何结论之前,重要的是要阅读规则11.5,即相关的MISRA-C:2012指南,实际上是说:
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.
观察:
这不能回答你的问题,这是关于理由的。相反,它指出您首先不应该处于这种情况。
在您最喜欢的搜索引擎中输入“misra malloc”会引导我们:
http://www.misra.org.uk/forum/viewtopic.php?t=260
其中询问:
根据规则,我们不应该使用 malloc()、free()、calloc() 等函数。但是 malloc() 是一个非常常见的要求。大多数嵌入式系统应用程序使用自己的应用程序级内存管理器,以便快速分配和取消分配。你有什么建议来解决这个问题(如果我们不能使用 malloc,任何其他方式)?
答案是:
我们被问到有关 MISRA C1 和 MISRA C2 中禁止的各种事情的解决方案和变通方法,例如使用 malloc、calloc 等进行动态内存分配。MISRA 或 MISRA C 工作组的任何成员都不会对任何偏差或“解决方法”提供任何指导或批准。
您要求代码符合某个标准。您正在使用不符合该标准的机制。要么找出一种有原则和稳健的遵守方式,要么就如何处理故意不遵守行为提出明确的政策。
例如,您提到了 memcpy。这是不合规的。所以退一步问“假设我没有任何 memcpy 的实现。 我将如何编写我自己的兼容 memcpy?” 您正在使用 memcpy 来解决问题;解决没有它的问题。
现在对 malloc 执行相同的操作。有一天,malloc 不存在,有人不得不在没有 malloc 的情况下编写它。您有一个由 malloc 解决的问题。如果你没有 malloc,你会如何解决它?malloc 中没有什么是神奇的。您可以编写自己的,比 malloc 做得更好,其中“更好”是指“符合您的要求”。