【发布时间】:2020-03-25 15:45:48
【问题描述】:
我正在使用这个函数将一些值从一个数组复制到另一个数组:
void *copy_array(const void *src, void *dest, uint8 pos, uint8 len, uint8 elemsize)
{
const unsigned char *csrc = src;
memcpy(dest, csrc + (pos * elemsize), len * elemsize);
}
有没有类似的方法可以在不使用指针算法的情况下做到这一点? MISRA 建议避免使用指针算法。
【问题讨论】:
-
如果要在生产软件中使用,没有充分的理由避免在此代码中使用指针运算。这是课堂练习吗?如果是这样,实际的问题陈述是什么?可以认为“指针运算”发生在不同的概念级别——C 源代码中的显式表达式、数组引用等隐式表达式以及机器级别。在后一层,不可能避免指针运算,因为需要内存地址来加载数据,因此必须计算。真正的问题是什么?
-
答案取决于您需要的“相似度”级别 ;-) 如果您需要 misra 合规性,我建议尽可能避免接受或返回
void*。 -
IMO 这里的主要问题是首先有空指针。
-
C 代码不能是类型安全和通用的,所以你必须选择一个 - 如果你需要 MISRA 合规性,选择不是你的 - 可悲的答案是,你不能实现这个以安全的方式辅助函数。
-
基本上,MISRA 规则不希望你搞砸指针算术,因为你可能会把它搞砸。但是这个例程只传递地址、元素大小和元素索引。这意味着它无法在不计算地址(直接或间接)的情况下完成其工作,并且任何调用它的人都已经冒了 MISRA 想要通过分解其高级对象(例如数组)来避免的风险已知类型) 成块,例如元素大小。在这个例程中你可能做的最好的事情是
const uint8 (*x)[elemsize] = src; memcpy(dest, &x[pos], len * sizeof *x);。