架构ARM9。编程语言C。
我们有第三方堆栈,其中一个调用将指针(pBuffer
)带到内存位置。在堆栈中,它们可以自由地绕过传递的指针并按照自己的意愿访问它。不幸的是,它们偏移传入的指针并将其传递给另一个试图从奇数/未计数内存位置执行此操作的函数
((uint16 *)pBuffer)[index] = value;
其中value
的类型为uint16
,index
的边界已经过检查,索引为pBuffer
。这会导致未对齐的内存访问异常。 pBuffer
指向堆上的char *
。
如上所述,即使我们可以查看第三方堆栈,我们也无法正式更新代码。因此,我们通知提供商,他们在下一版本中提供更新。
我想了解是否有解决方法。如何在不违反未对齐访问的情况下执行上述分配?解决此类问题的最佳方法是什么。
答案 0 :(得分:7)
逐字节复制值。将其转换为(无符号)字符指针,然后一次复制一个字节。
它不漂亮,但听起来并不像你有很多选择。
答案 1 :(得分:1)
有三种可能性,到目前为止我无法从你的问题中确定是哪种情况。
案例1:索引总是奇数。解决方案:memmove()pBuffer超过1个字节 案例2:索引有时是奇数,你可以预先预测它。解决方案:当你知道索引将是奇数时,memmove()pBuffer超过1个字节。 案例3:索引有时很奇怪,你无法预测它何时会出现。这很不幸,因为代码将错误。
答案 2 :(得分:1)
如果您控制pBuffer,作为一种解决方法,您可以将其声明为uint32_t数组(或者与您的体系结构对齐的任何内容)。通过将缓冲区声明为uint32_t,编译器将选择正确的对齐方式。您可以在调用目标函数时将其强制转换为uint8_t *。
这应该与您发布的示例代码一起使用,但如果第三方代码将任何未对齐的偏移量应用于缓冲区,则可能仍会失败。