我必须将源代码移植到运行 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);
Using echo 2 > /proc/cpu/alignment
on 使 Linux 内核修复问题,但应用程序的性能下降到不再可接受的程度。
我在网上搜索了类似的东西__unaligned
or __packed
GCC (v4.4.1) 编译器的关键字,但到目前为止仍为空。
我认为很多有问题的代码行可以通过或多或少复杂的正则表达式/替换来修复,但现在,在这样做了一段时间之后,我发现这种方法也将需要大量繁琐的工作。
你们对如何完成这项工作有什么建议吗?我认为 gcc 4.5 编译器插件有点过分了,但是有比正则表达式更好的东西吗?你还能提出什么其他建议?不一定所有问题实例都必须得到修复,因为我仍然可以依靠内核来解决一些罕见的情况。
有__attribute__((__packed__))
这在某些情况下可能会有所帮助,但我确实认为应该尽早清理这段代码,因为您可能会花更多的时间来解决问题,而不是一劳永逸地解决问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)