我必须将源代码移植到运行Linux的ARM平台.不幸的是,我遇到了未对齐的内存访问问题.源使用指针强制转换和访问.
像下面这样的代码像病毒一样遍布代码库.由于gcc -Wcast-align命令行选项,我可以查明有问题的位置但是有超过一千个实例要经历.
u = (IEC_BOOL);
(((*(IEC_LINT*)pSP).H < b.H)
|| (((*(IEC_LINT*)pSP).H == b.H) && ((*(IEC_LINT*)pSP).L < b.L) )) ? 1 : 0);
*(IEC_DWORD OS_SPTR *)pSP =
(IEC_DWORD)(*(IEC_DWORD OS_SPTR *)pSP >> u);
*(IEC_DWORD OS_SPTR *)pSP =
(IEC_DWORD)(*(IEC_DWORD OS_SPTR *)pSP << -u);
u = (IEC_BYTE)((*(IEC_DINT*)pSP != b) ? 1 : 0);
*(IEC_DWORD*)pSP = (IEC_DWORD)(*(IEC_DWORD*)pSP & w);
(*(IEC_ULINT*)pSP).H += u.H;
(((*(IEC_ULINT OS_SPTR *)pSP).H == b.H)
&& ((*(IEC_ULINT OS_SPTR *)pSP).L > b.L))) ? 1 : 0);
u = (IEC_BYTE)((*(IEC_REAL*)pSP >= b) ? 1 : 0);
Run Code Online (Sandbox Code Playgroud)
使用echo 2 > /proc/cpu/alignmenton使Linux内核修复了问题,但应用程序的性能降低到了不再可接受的程度.
我搜索网为像一个__unaligned或__packed关键字海湾合作委员会(v4.4.1)编译器,但作为尚未来到了空.
我认为很多问题的代码行可以通过一个或多或少复杂的正则表达式/替换来修复,但是现在,经过一段时间的努力,我看到,这种方法也将花费大量繁琐的工作.
你们有什么建议如何完成这项工作?我认为一个gcc 4.5编译器插件会有点矫枉过正但是有没有比正则表达式好的东西?您能提出哪些其他建议?不一定所有问题实例都必须修复,因为我仍然可以依赖内核来处理一些罕见的情况.
有__attribute__((__packed__))这可能有助于在某些情况下,但我真的觉得这个代码应该不是迟早要清理,因为很可能你会花更多时间围绕问题的工作比它会采取修复它一劳永逸.