Clang编译ARM代码严重Bug:__packed指针未生成非对齐访问代码
NDK 16(Clang 5.0.3)编译ARM-v7a代码时
__packed指针的对齐Bug问题 最近在使用NDK 16(基于Clang 5.0.3)编译ARM-v7a架构的Android代码时,碰到了一个和指针对齐、__packed属性相关的棘手问题,具体现象如下:
- 当函数参数为
uint8_t*时,生成的汇编会调用__aeabi_memcpy,支持任意地址的指针,运行完全正常; - 当参数改为
uint32_t*时,汇编会使用ldm.w/stm.w指令做优化,这类指令仅支持对齐地址,传入奇数地址的指针会触发SIGBUS信号,这属于符合设计预期的行为; - 但当参数为
__packed uint32_t*时,生成的汇编代码和未加__packed属性时完全一致,没有遵循ARM标准生成非对齐访问的代码,传入奇数地址的指针仍然会触发SIGBUS信号,这明显不符合__packed属性的定义。
目前我采用的临时解决方案是始终使用uint8_t*作为输入参数来规避这个问题,但更希望能修复这个Bug,这样既能保证代码在非对齐场景下的正确性,又能兼顾对齐场景下的访问效率。
内容的提问来源于stack exchange,提问作者Afshin
相关产品推荐
相关产品推荐

