架构ARM9。编程语言℃。

我们有一个第三方堆栈和其中一个呼叫需要一个指针(pBuffer)的存储器位置。在堆栈内部,他们可以自由地通过指针走动,并按照自己的意愿进行访问。不幸的是,它们抵消了指针所传递并通过它变成一个其试图从一个的奇/ unalighed 存储器位置

做到这一点的另一个功能
         ((uint16 *)pBuffer)[index] = value;

其中value是类型uint16的和index是界限检查和索引pBuffer。这将导致一个未对齐的内存访问异常。 pBufferchar *在堆上。

如前所述,尽管我们可以窥视到第三方栈,我们不能正式更新代码。因此,我们通知供应商,他们提供了在下一版本更新。

我想明白了,如果有一个变通此。如何在不违反对齐访问执行上述任务?什么是解决这些问题的最佳方法。

有帮助吗?

解决方案

由字节的值复制字节。它转换为一个(无符号)字符指针,然后一次一个字节复制。

这并不漂亮,但它听起来并不像你有很多选择。

其他提示

有三种可能性,我不能从你的问题确定到目前为止是哪种情况。

情况1:索引始终奇数。解决方案:的memmove()p缓冲器超过1个字节 案例2:该指数是有时奇怪,你可以预测前面时,它会。解决方案:的memmove()p缓冲器超过1个字节,当你知道指数将是奇数。 案例3:该指数是有时奇怪,你无法预测何时会。这是令人遗憾的,因为代码的故障。

如果您在pbuffer的控制,作为一种解决方法,你可以声明为uint32_t的数组(或任何你建筑的对齐匹配)。随着宣布缓冲区uint32_t的,编译器会选择正确的定位。你可以将它转换到调用你的目标函数时uint8_t *。

这应该与您发布的示例代码工作,但如果第三方代码适用于任何未对齐偏移量来缓冲可能仍会失败。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top